You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kwin/options.cpp

418 lines
17 KiB

/*****************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org>
Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
You can Freely distribute this program under the GNU General Public
License. See the file "COPYING" for the exact licensing terms.
******************************************************************/
#include "options.h"
#ifndef KCMRULES
#include <tqpalette.h>
#include <tqpixmap.h>
#include <kapplication.h>
#include <kconfig.h>
#include <kglobal.h>
#include <kglobalsettings.h>
#include <tqtooltip.h>
#include "client.h"
#endif
namespace KWinInternal
{
#ifndef KCMRULES
Options::Options()
: electric_borders( 0 ),
electric_border_delay(0)
{
d = new KDecorationOptionsPrivate;
d->defaultKWinSettings();
updateSettings();
}
Options::~Options()
{
delete d;
}
unsigned long Options::updateSettings()
{
KConfig *config = KGlobal::config();
unsigned long changed = 0;
changed |= d->updateKWinSettings( config ); // read decoration settings
config->setGroup( "Windows" );
moveMode = stringToMoveResizeMode( config->readEntry("MoveMode", "Opaque" ));
resizeMode = stringToMoveResizeMode( config->readEntry("ResizeMode", "Opaque" ));
show_geometry_tip = config->readBoolEntry("GeometryTip", false);
tabboxOutline = config->readBoolEntry("TabboxOutline", true);
TQString val;
val = config->readEntry ("FocusPolicy", "ClickToFocus");
focusPolicy = ClickToFocus; // what a default :-)
if ( val == "FocusFollowsMouse" )
focusPolicy = FocusFollowsMouse;
else if ( val == "FocusUnderMouse" )
focusPolicy = FocusUnderMouse;
else if ( val == "FocusStrictlyUnderMouse" )
focusPolicy = FocusStrictlyUnderMouse;
val = config->readEntry ("AltTabStyle", "KDE");
altTabStyle = KDE; // what a default :-)
if ( val == "CDE" )
altTabStyle = CDE;
separateScreenFocus = config->readBoolEntry( "SeparateScreenFocus", false );
activeMouseScreen = config->readBoolEntry( "ActiveMouseScreen", focusPolicy != ClickToFocus );
rollOverDesktops = config->readBoolEntry("RollOverDesktops", TRUE);
// focusStealingPreventionLevel = config->readNumEntry( "FocusStealingPreventionLevel", 2 );
// TODO use low level for now
focusStealingPreventionLevel = config->readNumEntry( "FocusStealingPreventionLevel", 1 );
focusStealingPreventionLevel = KMAX( 0, KMIN( 4, focusStealingPreventionLevel ));
if( !focusPolicyIsReasonable()) // #48786, comments #7 and later
focusStealingPreventionLevel = 0;
KConfig *gc = new KConfig("kdeglobals", false, false);
gc->setGroup("Windows");
xineramaEnabled = gc->readBoolEntry ("XineramaEnabled", true );
xineramaPlacementEnabled = gc->readBoolEntry ("XineramaPlacementEnabled", true);
xineramaMovementEnabled = gc->readBoolEntry ("XineramaMovementEnabled", true);
xineramaMaximizeEnabled = gc->readBoolEntry ("XineramaMaximizeEnabled", true);
xineramaFullscreenEnabled = gc->readBoolEntry ("XineramaFullscreenEnabled", true);
delete gc;
placement = Placement::policyFromString( config->readEntry("Placement"), true );
xineramaPlacementScreen = KCLAMP( config->readNumEntry( "XineramaPlacementScreen", -1 ),
-1, tqApp->desktop()->numScreens() - 1 );
animateShade = config->readBoolEntry("AnimateShade", TRUE );
animateMinimize = config->readBoolEntry("AnimateMinimize", TRUE );
animateMinimizeSpeed = config->readNumEntry("AnimateMinimizeSpeed", 5 );
if( focusPolicy == ClickToFocus )
{
autoRaise = false;
autoRaiseInterval = 0;
delayFocus = false;
delayFocusInterval = 0;
}
else
{
autoRaise = config->readBoolEntry("AutoRaise", FALSE );
autoRaiseInterval = config->readNumEntry("AutoRaiseInterval", 0 );
delayFocus = config->readBoolEntry("DelayFocus", FALSE );
delayFocusInterval = config->readNumEntry("DelayFocusInterval", 0 );
}
shadeHover = config->readBoolEntry("ShadeHover", FALSE );
shadeHoverInterval = config->readNumEntry("ShadeHoverInterval", 250 );
// important: autoRaise implies ClickRaise
clickRaise = autoRaise || config->readBoolEntry("ClickRaise", TRUE );
borderSnapZone = config->readNumEntry("BorderSnapZone", 10);
windowSnapZone = config->readNumEntry("WindowSnapZone", 10);
snapOnlyWhenOverlapping=config->readBoolEntry("SnapOnlyWhenOverlapping",FALSE);
electric_borders = config->readNumEntry("ElectricBorders", 0);
electric_border_delay = config->readNumEntry("ElectricBorderDelay", 150);
OpTitlebarDblClick = windowOperation( config->readEntry("TitlebarDoubleClickCommand", "Shade"), true );
d->OpMaxButtonLeftClick = windowOperation( config->readEntry("MaximizeButtonLeftClickCommand", "Maximize"), true );
d->OpMaxButtonMiddleClick = windowOperation( config->readEntry("MaximizeButtonMiddleClickCommand", "Maximize (vertical only)"), true );
d->OpMaxButtonRightClick = windowOperation( config->readEntry("MaximizeButtonRightClickCommand", "Maximize (horizontal only)"), true );
ignorePositionClasses = config->readListEntry("IgnorePositionClasses");
ignoreFocusStealingClasses = config->readListEntry("IgnoreFocusStealingClasses");
// Qt3.2 and older had resource class all lowercase, but Qt3.3 has it capitalized
// therefore Client::resourceClass() forces lowercase, force here lowercase as well
for( TQStringList::Iterator it = ignorePositionClasses.begin();
it != ignorePositionClasses.end();
++it )
(*it) = (*it).lower();
for( TQStringList::Iterator it = ignoreFocusStealingClasses.begin();
it != ignoreFocusStealingClasses.end();
++it )
(*it) = (*it).lower();
killPingTimeout = config->readNumEntry( "KillPingTimeout", 5000 );
hideUtilityWindowsForInactive = config->readBoolEntry( "HideUtilityWindowsForInactive", true );
showDesktopIsMinimizeAll = config->readBoolEntry( "ShowDesktopIsMinimizeAll", false );
// Mouse bindings
config->setGroup( "MouseBindings");
CmdActiveTitlebar1 = mouseCommand(config->readEntry("CommandActiveTitlebar1","Raise"), true );
CmdActiveTitlebar2 = mouseCommand(config->readEntry("CommandActiveTitlebar2","Lower"), true );
CmdActiveTitlebar3 = mouseCommand(config->readEntry("CommandActiveTitlebar3","Operations menu"), true );
CmdInactiveTitlebar1 = mouseCommand(config->readEntry("CommandInactiveTitlebar1","Activate and raise"), true );
CmdInactiveTitlebar2 = mouseCommand(config->readEntry("CommandInactiveTitlebar2","Activate and lower"), true );
CmdInactiveTitlebar3 = mouseCommand(config->readEntry("CommandInactiveTitlebar3","Operations menu"), true );
CmdTitlebarWheel = mouseWheelCommand(config->readEntry("CommandTitlebarWheel","Nothing"));
CmdWindow1 = mouseCommand(config->readEntry("CommandWindow1","Activate, raise and pass click"), false );
CmdWindow2 = mouseCommand(config->readEntry("CommandWindow2","Activate and pass click"), false );
CmdWindow3 = mouseCommand(config->readEntry("CommandWindow3","Activate and pass click"), false );
CmdAllModKey = (config->readEntry("CommandAllKey","Alt") == "Meta") ? Qt::Key_Meta : Qt::Key_Alt;
CmdAll1 = mouseCommand(config->readEntry("CommandAll1","Move"), false );
CmdAll2 = mouseCommand(config->readEntry("CommandAll2","Toggle raise and lower"), false );
CmdAll3 = mouseCommand(config->readEntry("CommandAll3","Resize"), false );
CmdAllWheel = mouseWheelCommand(config->readEntry("CommandAllWheel","Nothing"));
//translucency settings
config->setGroup( "Notification Messages" );
useTranslucency = config->readBoolEntry("UseTranslucency", false);
config->setGroup( "Translucency");
translucentActiveWindows = config->readBoolEntry("TranslucentActiveWindows", false);
activeWindowOpacity = uint((config->readNumEntry("ActiveWindowOpacity", 100)/100.0)*0xFFFFFFFF);
translucentInactiveWindows = config->readBoolEntry("TranslucentInactiveWindows", false);
inactiveWindowOpacity = uint((config->readNumEntry("InactiveWindowOpacity", 75)/100.0)*0xFFFFFFFF);
translucentMovingWindows = config->readBoolEntry("TranslucentMovingWindows", false);
movingWindowOpacity = uint((config->readNumEntry("MovingWindowOpacity", 50)/100.0)*0xFFFFFFFF);
translucentDocks = config->readBoolEntry("TranslucentDocks", false);
dockOpacity = uint((config->readNumEntry("DockOpacity", 80)/100.0)*0xFFFFFFFF);
keepAboveAsActive = config->readBoolEntry("TreatKeepAboveAsActive", true);
//TODO: remove this variable
useTitleMenuSlider = true;
activeWindowShadowSize = config->readNumEntry("ActiveWindowShadowSize", 200);
inactiveWindowShadowSize = config->readNumEntry("InactiveWindowShadowSize", 100);
dockShadowSize = config->readNumEntry("DockShadowSize", 80);
removeShadowsOnMove = config->readBoolEntry("RemoveShadowsOnMove", true);
removeShadowsOnResize = config->readBoolEntry("RemoveShadowsOnResize", true);
onlyDecoTranslucent = config->readBoolEntry("OnlyDecoTranslucent",false);
resetKompmgr = config->readBoolEntry("ResetKompmgr", false);
if (resetKompmgr)
config->writeEntry("ResetKompmgr",FALSE);
// window drop shadows
config->setGroup("Style");
shadow_colour = config->readColorEntry("ShadowColour", &TQt::black);
shadow_docks = config->readBoolEntry("ShadowDocks", false);
shadow_overrides = config->readBoolEntry("ShadowOverrides", false);
shadow_topMenus = config->readBoolEntry("ShadowTopMenus", false);
shadow_inactive_colour = config->readColorEntry("InactiveShadowColour", &TQt::black);
shadow_inactive_enabled = config->readBoolEntry("InactiveShadowEnabled", false);
shadow_inactive_opacity = config->readDoubleNumEntry("InactiveShadowOpacity", 0.70);
shadow_inactive_thickness = config->readNumEntry("InactiveShadowThickness", 5);
shadow_inactive_x_offset = config->readNumEntry("InactiveShadowXOffset", 0);
shadow_inactive_y_offset = config->readNumEntry("InactiveShadowYOffset", 5);
shadow_enabled = config->readBoolEntry("ShadowEnabled", false);
shadow_opacity = config->readDoubleNumEntry("ShadowOpacity", 0.70);
shadow_thickness = config->readNumEntry("ShadowThickness", 10);
shadow_x_offset = config->readNumEntry("ShadowXOffset", 0);
shadow_y_offset = config->readNumEntry("ShadowYOffset", 10);
// Read button tooltip animation effect from kdeglobals
// Since we want to allow users to enable window decoration tooltips
// and not kstyle tooltips and vise-versa, we don't read the
// "EffectNoTooltip" setting from kdeglobals.
KConfig globalConfig("kdeglobals");
globalConfig.setGroup("KDE");
topmenus = globalConfig.readBoolEntry( "macStyle", false );
KConfig kdesktopcfg( "kdesktoprc", true );
kdesktopcfg.setGroup( "Menubar" );
desktop_topmenu = kdesktopcfg.readBoolEntry( "ShowMenubar", false );
if( desktop_topmenu )
topmenus = true;
TQToolTip::setGloballyEnabled( d->show_tooltips );
return changed;
}
// restricted should be true for operations that the user may not be able to repeat
// if the window is moved out of the workspace (e.g. if the user moves a window
// by the titlebar, and moves it too high beneath Kicker at the top edge, they
// may not be able to move it back, unless they know about Alt+LMB)
Options::WindowOperation Options::windowOperation(const TQString &name, bool restricted )
{
if (name == "Move")
return restricted ? MoveOp : UnrestrictedMoveOp;
else if (name == "Resize")
return restricted ? ResizeOp : UnrestrictedResizeOp;
else if (name == "Maximize")
return MaximizeOp;
else if (name == "Minimize")
return MinimizeOp;
else if (name == "Close")
return CloseOp;
else if (name == "OnAllDesktops")
return OnAllDesktopsOp;
else if (name == "Shade")
return ShadeOp;
else if (name == "Operations")
return OperationsOp;
else if (name == "Maximize (vertical only)")
return VMaximizeOp;
else if (name == "Maximize (horizontal only)")
return HMaximizeOp;
else if (name == "Lower")
return LowerOp;
else if (name == "Shadow")
return ShadowOp;
return NoOp;
}
Options::MouseCommand Options::mouseCommand(const TQString &name, bool restricted )
{
TQString lowerName = name.lower();
if (lowerName == "raise") return MouseRaise;
if (lowerName == "lower") return MouseLower;
if (lowerName == "operations menu") return MouseOperationsMenu;
if (lowerName == "toggle raise and lower") return MouseToggleRaiseAndLower;
if (lowerName == "activate and raise") return MouseActivateAndRaise;
if (lowerName == "activate and lower") return MouseActivateAndLower;
if (lowerName == "activate") return MouseActivate;
if (lowerName == "activate, raise and pass click") return MouseActivateRaiseAndPassClick;
if (lowerName == "activate and pass click") return MouseActivateAndPassClick;
if (lowerName == "activate, raise and move")
return restricted ? MouseActivateRaiseAndMove : MouseActivateRaiseAndUnrestrictedMove;
if (lowerName == "move") return restricted ? MouseMove : MouseUnrestrictedMove;
if (lowerName == "resize") return restricted ? MouseResize : MouseUnrestrictedResize;
if (lowerName == "shade") return MouseShade;
if (lowerName == "minimize") return MouseMinimize;
if (lowerName == "nothing") return MouseNothing;
return MouseNothing;
}
Options::MouseWheelCommand Options::mouseWheelCommand(const TQString &name)
{
TQString lowerName = name.lower();
if (lowerName == "raise/lower") return MouseWheelRaiseLower;
if (lowerName == "shade/unshade") return MouseWheelShadeUnshade;
if (lowerName == "maximize/restore") return MouseWheelMaximizeRestore;
if (lowerName == "above/below") return MouseWheelAboveBelow;
if (lowerName == "previous/next desktop") return MouseWheelPreviousNextDesktop;
if (lowerName == "change opacity") return MouseWheelChangeOpacity;
return MouseWheelNothing;
}
bool Options::showGeometryTip()
{
return show_geometry_tip;
}
TQColor &Options::shadowColour(bool active)
{
return active ? shadow_colour : shadow_inactive_colour;
}
bool Options::shadowWindowType(NET::WindowType t)
{
bool retval;
switch (t)
{
case NET::Dialog:
case NET::Normal:
retval = true;
break;
case NET::Desktop:
case NET::Menu:
case NET::Toolbar:
retval = false;
break;
case NET::Dock:
retval = shadow_docks;
break;
case NET::Override:
retval = shadow_overrides;
break;
case NET::TopMenu:
retval = shadow_topMenus;
break;
default:
retval = false;
break;
}
return retval;
}
bool Options::shadowEnabled(bool active)
{
return active ? shadow_enabled :
(shadow_enabled && shadow_inactive_enabled);
}
double Options::shadowOpacity(bool active)
{
return active ? shadow_opacity : shadow_inactive_opacity;
}
int Options::shadowThickness(bool active)
{
return active ? shadow_thickness : shadow_inactive_thickness;
}
int Options::shadowXOffset(bool active)
{
return active ? shadow_x_offset : shadow_inactive_x_offset;
}
int Options::shadowYOffset(bool active)
{
return active ? shadow_y_offset : shadow_inactive_y_offset;
}
int Options::electricBorders()
{
return electric_borders;
}
int Options::electricBorderDelay()
{
return electric_border_delay;
}
bool Options::checkIgnoreFocusStealing( const Client* c )
{
return ignoreFocusStealingClasses.contains(TQString::tqfromLatin1(c->resourceClass()));
}
Options::MouseCommand Options::wheelToMouseCommand( MouseWheelCommand com, int delta )
{
switch( com )
{
case MouseWheelRaiseLower:
return delta > 0 ? MouseRaise : MouseLower;
case MouseWheelShadeUnshade:
return delta > 0 ? MouseSetShade : MouseUnsetShade;
case MouseWheelMaximizeRestore:
return delta > 0 ? MouseMaximize : MouseRestore;
case MouseWheelAboveBelow:
return delta > 0 ? MouseAbove : MouseBelow;
case MouseWheelPreviousNextDesktop:
return delta > 0 ? MousePreviousDesktop : MouseNextDesktop;
case MouseWheelChangeOpacity:
return delta > 0 ? MouseOpacityMore : MouseOpacityLess;
default:
return MouseNothing;
}
}
#endif
Options::MoveResizeMode Options::stringToMoveResizeMode( const TQString& s )
{
return s == "Opaque" ? Opaque : Transparent;
}
const char* Options::moveResizeModeToString( MoveResizeMode mode )
{
return mode == Opaque ? "Opaque" : "Transparent";
}
} // namespace