1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #define Region QtXRegion 25 26 #include <QColor> 27 #include <QStyle> 28 29 #include <kconfig.h> 30 #include <kglobal.h> 31 #include <kmenubar.h> 32 #include <kconfiggroup.h> 33 #include <kmainwindow.h> 34 #include <kapplication.h> 35 #include <ktoolbar.h> 36 37 #undef Region 38 39 #include "KDESalFrame.hxx" 40 #include "KDEXLib.hxx" 41 #include "KDESalGraphics.hxx" 42 43 #include <tools/color.hxx> 44 45 #include <vcl/settings.hxx> 46 #include <vcl/font.hxx> 47 48 #include <svdata.hxx> 49 50 #include <unx/pspgraphics.h> 51 52 #if OSL_DEBUG_LEVEL > 1 53 #include <stdio.h> 54 #endif 55 56 KDESalFrame::KDESalFrame( SalFrame* pParent, sal_uLong nState ) : 57 X11SalFrame( pParent, nState ) 58 { 59 } 60 61 void KDESalFrame::Show( sal_Bool bVisible, sal_Bool bNoActivate ) 62 { 63 if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) ) 64 { 65 KDEXLib* pXLib = static_cast<KDEXLib*>(GetDisplay()->GetXLib()); 66 pXLib->doStartup(); 67 } 68 69 X11SalFrame::Show( bVisible, bNoActivate ); 70 } 71 72 /** Helper function to convert colors. 73 */ 74 static Color toColor( const QColor &rColor ) 75 { 76 return Color( rColor.red(), rColor.green(), rColor.blue() ); 77 } 78 79 /** Helper function to read untranslated text entry from KConfig configuration repository. 80 */ 81 static OUString readEntryUntranslated( KConfigGroup *pGroup, const char *pKey ) 82 { 83 return OUString::createFromAscii( (const char *) pGroup->readEntryUntranslated( pKey ).toAscii() ); 84 } 85 86 #if 0 87 /** Helper function to read color from KConfig configuration repository. 88 */ 89 static Color readColor( KConfigGroup *pGroup, const char *pKey ) 90 { 91 return toColor( pGroup->readEntry( pKey, QColor(Qt::white) ) ); 92 } 93 #endif 94 95 /** Helper function to add information to Font from QFont. 96 97 Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx). 98 */ 99 static Font toFont( const QFont &rQFont, const ::com::sun::star::lang::Locale& rLocale ) 100 { 101 psp::FastPrintFontInfo aInfo; 102 QFontInfo qFontInfo( rQFont ); 103 104 // set family name 105 aInfo.m_aFamilyName = String( (const char *) rQFont.family().toUtf8(), RTL_TEXTENCODING_UTF8 ); 106 107 // set italic 108 aInfo.m_eItalic = ( qFontInfo.italic()? psp::italic::Italic: psp::italic::Upright ); 109 110 // set weight 111 int nWeight = qFontInfo.weight(); 112 if ( nWeight <= QFont::Light ) 113 aInfo.m_eWeight = psp::weight::Light; 114 else if ( nWeight <= QFont::Normal ) 115 aInfo.m_eWeight = psp::weight::Normal; 116 else if ( nWeight <= QFont::DemiBold ) 117 aInfo.m_eWeight = psp::weight::SemiBold; 118 else if ( nWeight <= QFont::Bold ) 119 aInfo.m_eWeight = psp::weight::Bold; 120 else 121 aInfo.m_eWeight = psp::weight::UltraBold; 122 123 // set width 124 int nStretch = rQFont.stretch(); 125 if ( nStretch <= QFont::UltraCondensed ) 126 aInfo.m_eWidth = psp::width::UltraCondensed; 127 else if ( nStretch <= QFont::ExtraCondensed ) 128 aInfo.m_eWidth = psp::width::ExtraCondensed; 129 else if ( nStretch <= QFont::Condensed ) 130 aInfo.m_eWidth = psp::width::Condensed; 131 else if ( nStretch <= QFont::SemiCondensed ) 132 aInfo.m_eWidth = psp::width::SemiCondensed; 133 else if ( nStretch <= QFont::Unstretched ) 134 aInfo.m_eWidth = psp::width::Normal; 135 else if ( nStretch <= QFont::SemiExpanded ) 136 aInfo.m_eWidth = psp::width::SemiExpanded; 137 else if ( nStretch <= QFont::Expanded ) 138 aInfo.m_eWidth = psp::width::Expanded; 139 else if ( nStretch <= QFont::ExtraExpanded ) 140 aInfo.m_eWidth = psp::width::ExtraExpanded; 141 else 142 aInfo.m_eWidth = psp::width::UltraExpanded; 143 144 #if OSL_DEBUG_LEVEL > 1 145 fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); 146 #endif 147 148 // match font to e.g. resolve "Sans" 149 psp::PrintFontManager::get().matchFont( aInfo, rLocale ); 150 151 #if OSL_DEBUG_LEVEL > 1 152 fprintf( stderr, "font match %s, name AFTER: \"%s\"\n", 153 aInfo.m_nID != 0 ? "succeeded" : "failed", 154 OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); 155 #endif 156 157 // font height 158 int nPointHeight = qFontInfo.pointSize(); 159 if ( nPointHeight <= 0 ) 160 nPointHeight = rQFont.pointSize(); 161 162 // Create the font 163 Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) ); 164 if( aInfo.m_eWeight != psp::weight::Unknown ) 165 aFont.SetWeight( PspGraphics::ToFontWeight( aInfo.m_eWeight ) ); 166 if( aInfo.m_eWidth != psp::width::Unknown ) 167 aFont.SetWidthType( PspGraphics::ToFontWidth( aInfo.m_eWidth ) ); 168 if( aInfo.m_eItalic != psp::italic::Unknown ) 169 aFont.SetItalic( PspGraphics::ToFontItalic( aInfo.m_eItalic ) ); 170 if( aInfo.m_ePitch != psp::pitch::Unknown ) 171 aFont.SetPitch( PspGraphics::ToFontPitch( aInfo.m_ePitch ) ); 172 173 return aFont; 174 } 175 176 /** Implementation of KDE integration's main method. 177 */ 178 void KDESalFrame::UpdateSettings( AllSettings& rSettings ) 179 { 180 StyleSettings style( rSettings.GetStyleSettings() ); 181 bool bSetTitleFont = false; 182 183 // General settings 184 QPalette pal = kapp->palette(); 185 186 style.SetActiveColor(toColor(pal.color(QPalette::Active, QPalette::Window))); 187 style.SetDeactiveColor(toColor(pal.color(QPalette::Inactive, QPalette::Window))); 188 189 style.SetActiveColor2(toColor(pal.color(QPalette::Active, QPalette::Window))); 190 style.SetDeactiveColor2(toColor(pal.color(QPalette::Inactive, QPalette::Window))); 191 192 style.SetActiveTextColor(toColor(pal.color(QPalette::Active, QPalette::WindowText))); 193 style.SetDeactiveTextColor(toColor(pal.color(QPalette::Inactive, QPalette::WindowText))); 194 195 // WM settings 196 KConfig *pConfig = KGlobal::config().data(); 197 if ( pConfig ) 198 { 199 KConfigGroup aGroup = pConfig->group( "WM" ); 200 const char *pKey; 201 202 pKey = "titleFont"; 203 if ( aGroup.hasKey( pKey ) ) 204 { 205 Font aFont = toFont( aGroup.readEntry( pKey, QFont() ), rSettings.GetUILocale() ); 206 style.SetTitleFont( aFont ); 207 bSetTitleFont = true; 208 } 209 210 aGroup = pConfig->group( "Icons" ); 211 212 pKey = "Theme"; 213 if ( aGroup.hasKey( pKey ) ) 214 style.SetPreferredSymbolsStyleName( readEntryUntranslated( &aGroup, pKey ) ); 215 216 //toolbar 217 pKey = "toolbarFont"; 218 if ( aGroup.hasKey( pKey ) ) 219 { 220 Font aFont = toFont( aGroup.readEntry( pKey, QFont() ), rSettings.GetUILocale() ); 221 style.SetToolFont( aFont ); 222 } 223 } 224 225 Color aFore = toColor( pal.color( QPalette::Active, QPalette::WindowText ) ); 226 Color aBack = toColor( pal.color( QPalette::Active, QPalette::Window ) ); 227 Color aText = toColor( pal.color( QPalette::Active, QPalette::Text ) ); 228 Color aBase = toColor( pal.color( QPalette::Active, QPalette::Base ) ); 229 Color aButn = toColor( pal.color( QPalette::Active, QPalette::ButtonText ) ); 230 Color aMid = toColor( pal.color( QPalette::Active, QPalette::Mid ) ); 231 Color aHigh = toColor( pal.color( QPalette::Active, QPalette::Highlight ) ); 232 233 // Foreground 234 style.SetRadioCheckTextColor( aFore ); 235 style.SetLabelTextColor( aFore ); 236 style.SetInfoTextColor( aFore ); 237 style.SetDialogTextColor( aFore ); 238 style.SetGroupTextColor( aFore ); 239 240 // Text 241 style.SetFieldTextColor( aText ); 242 style.SetFieldRolloverTextColor( aText ); 243 style.SetWindowTextColor( aText ); 244 style.SetHelpTextColor( aText ); 245 246 // Base 247 style.SetFieldColor( aBase ); 248 style.SetHelpColor( aBase ); 249 style.SetWindowColor( aBase ); 250 style.SetActiveTabColor( aBase ); 251 252 // Buttons 253 style.SetButtonTextColor( aButn ); 254 style.SetButtonRolloverTextColor( aButn ); 255 256 // Disable color 257 style.SetDisableColor( aMid ); 258 259 // Workspace 260 style.SetWorkspaceColor( aMid ); 261 262 // Background 263 style.Set3DColors( aBack ); 264 style.SetFaceColor( aBack ); 265 style.SetInactiveTabColor( aBack ); 266 style.SetDialogColor( aBack ); 267 268 if( aBack == COL_LIGHTGRAY ) 269 style.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) ); 270 else 271 { 272 Color aColor2 = style.GetLightColor(); 273 style. 274 SetCheckedColor( Color( (sal_uInt8)(((sal_uInt16)aBack.GetRed()+(sal_uInt16)aColor2.GetRed())/2), 275 (sal_uInt8)(((sal_uInt16)aBack.GetGreen()+(sal_uInt16)aColor2.GetGreen())/2), 276 (sal_uInt8)(((sal_uInt16)aBack.GetBlue()+(sal_uInt16)aColor2.GetBlue())/2) 277 ) ); 278 } 279 280 // Selection 281 style.SetHighlightColor( aHigh ); 282 style.SetHighlightTextColor( toColor(pal.color( QPalette::HighlightedText)) ); 283 284 // Font 285 Font aFont = toFont( kapp->font(), rSettings.GetUILocale() ); 286 287 style.SetAppFont( aFont ); 288 style.SetHelpFont( aFont ); 289 290 if( !bSetTitleFont ) 291 { 292 style.SetTitleFont( aFont ); 293 } 294 295 style.SetFloatTitleFont( aFont ); 296 style.SetMenuFont( aFont ); // will be changed according to pMenuBar 297 //style.SetToolFont( aFont ); //already set above 298 style.SetLabelFont( aFont ); 299 style.SetInfoFont( aFont ); 300 style.SetRadioCheckFont( aFont ); 301 style.SetPushButtonFont( aFont ); 302 style.SetFieldFont( aFont ); 303 style.SetIconFont( aFont ); 304 style.SetGroupFont( aFont ); 305 306 int flash_time = QApplication::cursorFlashTime(); 307 style.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME ); 308 309 // Menu 310 style.SetSkipDisabledInMenus( TRUE ); 311 KMenuBar* pMenuBar = new KMenuBar(); 312 if ( pMenuBar ) 313 { 314 // Color 315 QPalette qMenuCG = pMenuBar->palette(); 316 317 // Menu text and background color, theme specific 318 Color aMenuFore = toColor( qMenuCG.color( QPalette::WindowText ) ); 319 Color aMenuBack = toColor( qMenuCG.color( QPalette::Window ) ); 320 321 aMenuFore = toColor( qMenuCG.color( QPalette::ButtonText ) ); 322 aMenuBack = toColor( qMenuCG.color( QPalette::Button ) ); 323 324 style.SetMenuTextColor( aMenuFore ); 325 style.SetMenuBarTextColor( aMenuFore ); 326 style.SetMenuColor( aMenuBack ); 327 style.SetMenuBarColor( aMenuBack ); 328 329 style.SetMenuHighlightColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) ); 330 331 style.SetMenuHighlightTextColor( aMenuFore ); 332 333 // set special menubar higlight text color 334 if ( kapp->style()->inherits( "HighContrastStyle" ) ) 335 ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.color( QPalette::HighlightedText ) ); 336 else 337 ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore; 338 339 // Font 340 aFont = toFont( pMenuBar->font(), rSettings.GetUILocale() ); 341 style.SetMenuFont( aFont ); 342 } 343 344 delete pMenuBar; 345 346 // Scroll bar size 347 style.SetScrollBarSize( kapp->style()->pixelMetric( QStyle::PM_ScrollBarExtent ) ); 348 349 rSettings.SetStyleSettings( style ); 350 } 351 352 353 void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics ) 354 { 355 for( int i = 0; i < nMaxGraphics; i++ ) 356 { 357 if( m_aGraphics[i].pGraphics == pGraphics ) 358 { 359 m_aGraphics[i].bInUse = false; 360 break; 361 } 362 } 363 } 364 365 void KDESalFrame::updateGraphics( bool bClear ) 366 { 367 Drawable aDrawable = bClear ? None : GetWindow(); 368 for( int i = 0; i < nMaxGraphics; i++ ) 369 { 370 if( m_aGraphics[i].bInUse ) 371 m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() ); 372 } 373 } 374 375 KDESalFrame::~KDESalFrame() 376 { 377 } 378 379 KDESalFrame::GraphicsHolder::~GraphicsHolder() 380 { 381 delete pGraphics; 382 } 383 384 SalGraphics* KDESalFrame::GetGraphics() 385 { 386 if( GetWindow() ) 387 { 388 for( int i = 0; i < nMaxGraphics; i++ ) 389 { 390 if( ! m_aGraphics[i].bInUse ) 391 { 392 m_aGraphics[i].bInUse = true; 393 if( ! m_aGraphics[i].pGraphics ) 394 { 395 m_aGraphics[i].pGraphics = new KDESalGraphics(); 396 m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() ); 397 } 398 return m_aGraphics[i].pGraphics; 399 } 400 } 401 } 402 403 return NULL; 404 } 405