kwin Library API Documentation

options.cpp

00001 /***************************************************************** 00002 KWin - the KDE window manager 00003 This file is part of the KDE project. 00004 00005 Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org> 00006 Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org> 00007 00008 You can Freely distribute this program under the GNU General Public 00009 License. See the file "COPYING" for the exact licensing terms. 00010 ******************************************************************/ 00011 00012 #include "options.h" 00013 00014 #ifndef KCMRULES 00015 00016 #include <qpalette.h> 00017 #include <qpixmap.h> 00018 #include <kapplication.h> 00019 #include <kconfig.h> 00020 #include <kglobal.h> 00021 #include <kglobalsettings.h> 00022 #include <qtooltip.h> 00023 00024 #include "client.h" 00025 00026 #endif 00027 00028 namespace KWinInternal 00029 { 00030 00031 #ifndef KCMRULES 00032 00033 Options::Options() 00034 : electric_borders( 0 ), 00035 electric_border_delay(0) 00036 { 00037 d = new KDecorationOptionsPrivate; 00038 d->defaultKWinSettings(); 00039 updateSettings(); 00040 } 00041 00042 Options::~Options() 00043 { 00044 delete d; 00045 } 00046 00047 unsigned long Options::updateSettings() 00048 { 00049 KConfig *config = KGlobal::config(); 00050 unsigned long changed = 0; 00051 changed |= d->updateKWinSettings( config ); // read decoration settings 00052 00053 config->setGroup( "Windows" ); 00054 moveMode = stringToMoveResizeMode( config->readEntry("MoveMode", "Opaque" )); 00055 resizeMode = stringToMoveResizeMode( config->readEntry("ResizeMode", "Opaque" )); 00056 show_geometry_tip = config->readBoolEntry("GeometryTip", false); 00057 00058 QString val; 00059 00060 val = config->readEntry ("FocusPolicy", "ClickToFocus"); 00061 focusPolicy = ClickToFocus; // what a default :-) 00062 if ( val == "FocusFollowsMouse" ) 00063 focusPolicy = FocusFollowsMouse; 00064 else if ( val == "FocusUnderMouse" ) 00065 focusPolicy = FocusUnderMouse; 00066 else if ( val == "FocusStrictlyUnderMouse" ) 00067 focusPolicy = FocusStrictlyUnderMouse; 00068 00069 val = config->readEntry ("AltTabStyle", "KDE"); 00070 altTabStyle = KDE; // what a default :-) 00071 if ( val == "CDE" ) 00072 altTabStyle = CDE; 00073 00074 rollOverDesktops = config->readBoolEntry("RollOverDesktops", TRUE); 00075 00076 // focusStealingPreventionLevel = config->readNumEntry( "FocusStealingPreventionLevel", 2 ); 00077 // TODO use low level for now 00078 focusStealingPreventionLevel = config->readNumEntry( "FocusStealingPreventionLevel", 1 ); 00079 focusStealingPreventionLevel = KMAX( 0, KMIN( 4, focusStealingPreventionLevel )); 00080 if( !focusPolicyIsReasonable()) // #48786, comments #7 and later 00081 focusStealingPreventionLevel = 0; 00082 00083 KConfig *gc = new KConfig("kdeglobals", false, false); 00084 bool isVirtual = KApplication::desktop()->isVirtualDesktop(); 00085 gc->setGroup("Windows"); 00086 xineramaEnabled = gc->readBoolEntry ("XineramaEnabled", isVirtual ) && 00087 isVirtual; 00088 if (xineramaEnabled) 00089 { 00090 xineramaPlacementEnabled = gc->readBoolEntry ("XineramaPlacementEnabled", true); 00091 xineramaMovementEnabled = gc->readBoolEntry ("XineramaMovementEnabled", true); 00092 xineramaMaximizeEnabled = gc->readBoolEntry ("XineramaMaximizeEnabled", true); 00093 xineramaFullscreenEnabled = gc->readBoolEntry ("XineramaFullscreenEnabled", true); 00094 } 00095 else 00096 { 00097 xineramaPlacementEnabled = xineramaMovementEnabled = xineramaMaximizeEnabled = xineramaFullscreenEnabled = false; 00098 } 00099 delete gc; 00100 00101 placement = Placement::policyFromString( config->readEntry("Placement"), true ); 00102 00103 animateShade = config->readBoolEntry("AnimateShade", TRUE ); 00104 00105 animateMinimize = config->readBoolEntry("AnimateMinimize", TRUE ); 00106 animateMinimizeSpeed = config->readNumEntry("AnimateMinimizeSpeed", 5 ); 00107 00108 if( focusPolicy == ClickToFocus ) 00109 { 00110 autoRaise = false; 00111 autoRaiseInterval = 0; 00112 delayFocus = false; 00113 delayFocusInterval = 0; 00114 } 00115 else 00116 { 00117 autoRaise = config->readBoolEntry("AutoRaise", FALSE ); 00118 autoRaiseInterval = config->readNumEntry("AutoRaiseInterval", 0 ); 00119 delayFocus = config->readBoolEntry("DelayFocus", FALSE ); 00120 delayFocusInterval = config->readNumEntry("DelayFocusInterval", 0 ); 00121 } 00122 00123 shadeHover = config->readBoolEntry("ShadeHover", FALSE ); 00124 shadeHoverInterval = config->readNumEntry("ShadeHoverInterval", 250 ); 00125 00126 // important: autoRaise implies ClickRaise 00127 clickRaise = autoRaise || config->readBoolEntry("ClickRaise", TRUE ); 00128 00129 borderSnapZone = config->readNumEntry("BorderSnapZone", 10); 00130 windowSnapZone = config->readNumEntry("WindowSnapZone", 10); 00131 snapOnlyWhenOverlapping=config->readBoolEntry("SnapOnlyWhenOverlapping",FALSE); 00132 electric_borders = config->readNumEntry("ElectricBorders", 0); 00133 electric_border_delay = config->readNumEntry("ElectricBorderDelay", 150); 00134 00135 OpTitlebarDblClick = windowOperation( config->readEntry("TitlebarDoubleClickCommand", "Shade"), true ); 00136 00137 ignorePositionClasses = config->readListEntry("IgnorePositionClasses"); 00138 ignoreFocusStealingClasses = config->readListEntry("IgnoreFocusStealingClasses"); 00139 // Qt3.2 and older had resource class all lowercase, but Qt3.3 has it capitalized 00140 // therefore Client::resourceClass() forces lowercase, force here lowercase as well 00141 for( QStringList::Iterator it = ignorePositionClasses.begin(); 00142 it != ignorePositionClasses.end(); 00143 ++it ) 00144 (*it) = (*it).lower(); 00145 for( QStringList::Iterator it = ignoreFocusStealingClasses.begin(); 00146 it != ignoreFocusStealingClasses.end(); 00147 ++it ) 00148 (*it) = (*it).lower(); 00149 00150 killPingTimeout = config->readNumEntry( "KillPingTimeout", 5000 ); 00151 00152 // Mouse bindings 00153 config->setGroup( "MouseBindings"); 00154 CmdActiveTitlebar1 = mouseCommand(config->readEntry("CommandActiveTitlebar1","Raise"), true ); 00155 CmdActiveTitlebar2 = mouseCommand(config->readEntry("CommandActiveTitlebar2","Lower"), true ); 00156 CmdActiveTitlebar3 = mouseCommand(config->readEntry("CommandActiveTitlebar3","Operations menu"), true ); 00157 CmdInactiveTitlebar1 = mouseCommand(config->readEntry("CommandInactiveTitlebar1","Activate and raise"), true ); 00158 CmdInactiveTitlebar2 = mouseCommand(config->readEntry("CommandInactiveTitlebar2","Activate and lower"), true ); 00159 CmdInactiveTitlebar3 = mouseCommand(config->readEntry("CommandInactiveTitlebar3","Operations menu"), true ); 00160 CmdWindow1 = mouseCommand(config->readEntry("CommandWindow1","Activate, raise and pass click"), false ); 00161 CmdWindow2 = mouseCommand(config->readEntry("CommandWindow2","Activate and pass click"), false ); 00162 CmdWindow3 = mouseCommand(config->readEntry("CommandWindow3","Activate and pass click"), false ); 00163 CmdAllModKey = (config->readEntry("CommandAllKey","Alt") == "Meta") ? Qt::Key_Meta : Qt::Key_Alt; 00164 CmdAll1 = mouseCommand(config->readEntry("CommandAll1","Move"), false ); 00165 CmdAll2 = mouseCommand(config->readEntry("CommandAll2","Toggle raise and lower"), false ); 00166 CmdAll3 = mouseCommand(config->readEntry("CommandAll3","Resize"), false ); 00167 00168 // Read button tooltip animation effect from kdeglobals 00169 // Since we want to allow users to enable window decoration tooltips 00170 // and not kstyle tooltips and vise-versa, we don't read the 00171 // "EffectNoTooltip" setting from kdeglobals. 00172 KConfig globalConfig("kdeglobals"); 00173 globalConfig.setGroup("KDE"); 00174 topmenus = globalConfig.readBoolEntry( "macStyle", false ); 00175 00176 KConfig kdesktopcfg( "kdesktoprc", true ); 00177 kdesktopcfg.setGroup( "Menubar" ); 00178 desktop_topmenu = kdesktopcfg.readBoolEntry( "ShowMenubar", false ); 00179 if( desktop_topmenu ) 00180 topmenus = true; 00181 00182 QToolTip::setGloballyEnabled( d->show_tooltips ); 00183 00184 return changed; 00185 } 00186 00187 00188 // restricted should be true for operations that the user may not be able to repeat 00189 // if the window is moved out of the workspace (e.g. if the user moves a window 00190 // by the titlebar, and moves it too high beneath Kicker at the top edge, they 00191 // may not be able to move it back, unless they know about Alt+LMB) 00192 Options::WindowOperation Options::windowOperation(const QString &name, bool restricted ) 00193 { 00194 if (name == "Move") 00195 return restricted ? MoveOp : UnrestrictedMoveOp; 00196 else if (name == "Resize") 00197 return restricted ? ResizeOp : UnrestrictedResizeOp; 00198 else if (name == "Maximize") 00199 return MaximizeOp; 00200 else if (name == "Minimize") 00201 return MinimizeOp; 00202 else if (name == "Close") 00203 return CloseOp; 00204 else if (name == "OnAllDesktops") 00205 return OnAllDesktopsOp; 00206 else if (name == "Shade") 00207 return ShadeOp; 00208 else if (name == "Operations") 00209 return OperationsOp; 00210 else if (name == "Maximize (vertical only)") 00211 return VMaximizeOp; 00212 else if (name == "Maximize (horizontal only)") 00213 return HMaximizeOp; 00214 else if (name == "Lower") 00215 return LowerOp; 00216 return NoOp; 00217 } 00218 00219 Options::MouseCommand Options::mouseCommand(const QString &name, bool restricted ) 00220 { 00221 QString lowerName = name.lower(); 00222 if (lowerName == "raise") return MouseRaise; 00223 if (lowerName == "lower") return MouseLower; 00224 if (lowerName == "operations menu") return MouseOperationsMenu; 00225 if (lowerName == "toggle raise and lower") return MouseToggleRaiseAndLower; 00226 if (lowerName == "activate and raise") return MouseActivateAndRaise; 00227 if (lowerName == "activate and lower") return MouseActivateAndLower; 00228 if (lowerName == "activate") return MouseActivate; 00229 if (lowerName == "activate, raise and pass click") return MouseActivateRaiseAndPassClick; 00230 if (lowerName == "activate and pass click") return MouseActivateAndPassClick; 00231 if (lowerName == "activate, raise and move") 00232 return restricted ? MouseActivateRaiseAndMove : MouseActivateRaiseAndUnrestrictedMove; 00233 if (lowerName == "move") return restricted ? MouseMove : MouseUnrestrictedMove; 00234 if (lowerName == "resize") return restricted ? MouseResize : MouseUnrestrictedResize; 00235 if (lowerName == "shade") return MouseShade; 00236 if (lowerName == "minimize") return MouseMinimize; 00237 if (lowerName == "nothing") return MouseNothing; 00238 return MouseNothing; 00239 } 00240 00241 bool Options::showGeometryTip() 00242 { 00243 return show_geometry_tip; 00244 } 00245 00246 int Options::electricBorders() 00247 { 00248 return electric_borders; 00249 } 00250 00251 int Options::electricBorderDelay() 00252 { 00253 return electric_border_delay; 00254 } 00255 00256 bool Options::checkIgnoreFocusStealing( const Client* c ) 00257 { 00258 return ignoreFocusStealingClasses.contains(QString::fromLatin1(c->resourceClass())); 00259 } 00260 #endif 00261 00262 Options::MoveResizeMode Options::stringToMoveResizeMode( const QString& s ) 00263 { 00264 return s == "Opaque" ? Opaque : Transparent; 00265 } 00266 00267 const char* Options::moveResizeModeToString( MoveResizeMode mode ) 00268 { 00269 return mode == Opaque ? "Opaque" : "Transparent"; 00270 } 00271 00272 } // namespace
KDE Logo
This file is part of the documentation for kwin Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Aug 13 21:47:05 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003