/* * windows.cpp * * Copyright (c) 1997 Patrick Dowler dowler@morgul.fsh.uvic.ca * Copyright (c) 2001 Waldo Bastian bastian@kde.org * Copyright (c) 2011-2014 Timothy Pearson * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "windows.h" // twin config keywords #define KWIN_FOCUS "FocusPolicy" #define KWIN_PLACEMENT "Placement" #define KWIN_MOVE_MODE "MoveMode" #define KWIN_RESIZE_MODE "ResizeMode" #define KWIN_TILING_MODE "TilingMode" #define KWIN_MINIMIZE_ANIM "AnimateMinimize" #define KWIN_MINIMIZE_ANIM_SPEED "AnimateMinimizeSpeed" #define KWIN_GEOMETRY "GeometryTip" #define KWIN_AUTORAISE_INTERVAL "AutoRaiseInterval" #define KWIN_AUTORAISE "AutoRaise" #define KWIN_DELAYFOCUS_INTERVAL "DelayFocusInterval" #define KWIN_DELAYFOCUS "DelayFocus" #define KWIN_CLICKRAISE "ClickRaise" #define KWIN_ANIMSHADE "AnimateShade" #define KWIN_MOVE_RESIZE_MAXIMIZED "MoveResizeMaximizedWindows" #define KWIN_RESET_MAX_WIN_GEOM "ResetMaximizedWindowGeometry" #define KWIN_ALTTABMODE "AltTabStyle" #define KWIN_TRAVERSE_ALL "TraverseAll" #define KWIN_SHOW_POPUP "ShowPopup" #define KWIN_ROLL_OVER_DESKTOPS "RollOverDesktops" #define KWIN_SHADEHOVER "ShadeHover" #define KWIN_SHADEHOVER_INTERVAL "ShadeHoverInterval" #define KWIN_FOCUS_STEALING "FocusStealingPreventionLevel" #define KWIN_HIDE_UTILITY "HideUtilityWindowsForInactive" #define KWIN_SEPARATE_SCREEN_FOCUS "SeparateScreenFocus" #define KWIN_ACTIVE_MOUSE_SCREEN "ActiveMouseScreen" #define KWIN_ACTIVE_BORDERS "ActiveBorders" #define KWIN_ACTIVE_BORDER_DELAY "ActiveBorderDelay" #define KWIN_ACTIVE_BORDER_DISTANCE "ActiveBorderDistance" #define KWIN_GRID_TILING "GridTiling" // legacy options #define KWIN_OLD_ACTIVE_BORDERS "ElectricBorders" #define KWIN_OLD_ACTIVE_BORDER_DELAY "ElectricBorderDelay" //CT 15mar 98 - magics #define KWM_BRDR_SNAP_ZONE "BorderSnapZone" #define KWM_BRDR_SNAP_ZONE_DEFAULT 10 #define KWM_WNDW_SNAP_ZONE "WindowSnapZone" #define KWM_WNDW_SNAP_ZONE_DEFAULT 10 #define MAX_BRDR_SNAP 100 #define MAX_WNDW_SNAP 100 #define MAX_EDGE_RES 1000 TQString TDECompositor = TDE_COMPOSITOR_BINARY; KFocusConfig::~KFocusConfig () { if (standAlone) delete config; } // removed the LCD display over the slider - this is not good GUI design :) RNolden 051701 KFocusConfig::KFocusConfig (bool _standAlone, TDEConfig *_config, TQWidget * parent, const char *) : TDECModule(parent, "kcmkwm"), config(_config), standAlone(_standAlone) { TQString wtstr; TQBoxLayout *lay = new TQVBoxLayout (this, 0, KDialog::spacingHint()); //iTLabel = new TQLabel(i18n(" Allowed overlap:\n" // "(% of desktop space)"), // plcBox); //iTLabel->setAlignment(AlignTop|AlignHCenter); //pLay->addWidget(iTLabel,1,1); //interactiveTrigger = new TQSpinBox(0, 500, 1, plcBox); //pLay->addWidget(interactiveTrigger,1,2); //pLay->addRowSpacing(2,KDialog::spacingHint()); //lay->addWidget(plcBox); // focus policy fcsBox = new TQButtonGroup(i18n("Focus"),this); fcsBox->setColumnLayout( 0, TQt::Horizontal ); TQBoxLayout *fLay = new TQVBoxLayout(fcsBox->layout(), KDialog::spacingHint()); TQBoxLayout *cLay = new TQHBoxLayout(fLay); TQLabel *fLabel = new TQLabel(i18n("&Policy:"), fcsBox); cLay->addWidget(fLabel, 0); focusCombo = new TQComboBox(false, fcsBox); focusCombo->insertItem(i18n("Click to Focus"), CLICK_TO_FOCUS); focusCombo->insertItem(i18n("Focus Follows Mouse"), FOCUS_FOLLOWS_MOUSE); focusCombo->insertItem(i18n("Focus Under Mouse"), FOCUS_UNDER_MOUSE); focusCombo->insertItem(i18n("Focus Strictly Under Mouse"), FOCUS_STRICTLY_UNDER_MOUSE); cLay->addWidget(focusCombo,1 ,TQt::AlignLeft); fLabel->setBuddy(focusCombo); // FIXME, when more policies have been added to TWin wtstr = i18n("The focus policy is used to determine the active window, i.e." " the window you can work in.
    " "
  • Click to focus: A window becomes active when you click into it." " This is the behavior you might know from other operating systems.
  • " "
  • Focus follows mouse: Moving the mouse pointer actively on to a" " normal window activates it. New windows will receive the focus," " without you having to point the mouse at them explicitly." " Very practical if you are using the mouse a lot.
  • " "
  • Focus under mouse: The window that happens to be under the" " mouse pointer is active. If the mouse points nowhere, the last window" " that was under the mouse has focus." " New windows will not automatically receive the focus.
  • " "
  • Focus strictly under mouse: Only the window under the mouse pointer is" " active. If the mouse points nowhere, nothing has focus." "
" "Note that 'Focus under mouse' and 'Focus strictly under mouse' prevent certain" " features such as the Alt+Tab walk through windows dialog in the TDE mode" " from working properly." ); TQWhatsThis::add( focusCombo, wtstr); TQWhatsThis::add(fLabel, wtstr); connect(focusCombo, TQ_SIGNAL(activated(int)), this, TQ_SLOT(setAutoRaiseEnabled()) ); // autoraise delay autoRaiseOn = new TQCheckBox(i18n("Auto &raise"), fcsBox); fLay->addWidget(autoRaiseOn); connect(autoRaiseOn,TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(autoRaiseOnTog(bool))); autoRaise = new KIntNumInput(500, fcsBox); autoRaise->setLabel(i18n("Dela&y:"), TQt::AlignVCenter|TQt::AlignLeft); autoRaise->setRange(0, 3000, 100, true); autoRaise->setSteps(100,100); autoRaise->setSuffix(i18n(" msec")); fLay->addWidget(autoRaise); connect(focusCombo, TQ_SIGNAL(activated(int)), this, TQ_SLOT(setDelayFocusEnabled()) ); delayFocusOn = new TQCheckBox(i18n("Delay focus"), fcsBox); fLay->addWidget(delayFocusOn); connect(delayFocusOn,TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(delayFocusOnTog(bool))); delayFocus = new KIntNumInput(500, fcsBox); delayFocus->setLabel(i18n("Dela&y:"), TQt::AlignVCenter|TQt::AlignLeft); delayFocus->setRange(0, 3000, 100, true); delayFocus->setSteps(100,100); delayFocus->setSuffix(i18n(" msec")); fLay->addWidget(delayFocus); clickRaiseOn = new TQCheckBox(i18n("Click &raises active window"), fcsBox); connect(clickRaiseOn,TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(clickRaiseOnTog(bool))); fLay->addWidget(clickRaiseOn); // fLay->addColSpacing(0,TQMAX(autoRaiseOn->sizeHint().width(), // clickRaiseOn->sizeHint().width()) + 15); TQLabel* focusStealingLabel = new TQLabel( i18n( "Focus stealing prevention &level:" ), fcsBox); cLay->addWidget(focusStealingLabel, 0); focusStealing = new TQComboBox(false, fcsBox); focusStealing->insertItem( i18n( "Focus Stealing Prevention Level", "None" )); focusStealing->insertItem( i18n( "Focus Stealing Prevention Level", "Low" )); focusStealing->insertItem( i18n( "Focus Stealing Prevention Level", "Normal" )); focusStealing->insertItem( i18n( "Focus Stealing Prevention Level", "High" )); focusStealing->insertItem( i18n( "Focus Stealing Prevention Level", "Extreme" )); focusStealingLabel->setBuddy( focusStealing ); cLay->addWidget(focusStealing,2 ,TQt::AlignLeft); wtstr = i18n( "

This option specifies how much TWin will try to prevent unwanted focus stealing " "caused by unexpected activation of new windows. (Note: This feature does not " "work with the Focus Under Mouse or Focus Strictly Under Mouse focus policies.)" "

    " "
  • None: Prevention is turned off " "and new windows always become activated.
  • " "
  • Low: Prevention is enabled; when some window does not have support " "for the underlying mechanism and TWin cannot reliably decide whether to " "activate the window or not, it will be activated. This setting may have both " "worse and better results than normal level, depending on the applications.
  • " "
  • Normal: Prevention is enabled.
  • " "
  • High: New windows get activated only if no window is currently active " "or if they belong to the currently active application. This setting is probably " "not really usable when not using mouse focus policy.
  • " "
  • Extreme: All windows must be explicitly activated by the user.
  • " "

" "

Windows that are prevented from stealing focus are marked as demanding attention, " "which by default means their taskbar entry will be highlighted. This can be changed " "in the Notifications control module.

" ); TQWhatsThis::add( focusStealing, wtstr ); TQWhatsThis::add( focusStealingLabel, wtstr ); TQWhatsThis::add( autoRaiseOn, i18n("When this option is enabled, a window in the background will automatically" " come to the front when the mouse pointer has been over it for some time.") ); wtstr = i18n("This is the delay after which the window that the mouse pointer is over will automatically" " come to the front."); TQWhatsThis::add( autoRaise, wtstr ); TQWhatsThis::add( clickRaiseOn, i18n("When this option is enabled, the active window will be brought to the" " front when you click somewhere into the window contents. To change" " it for inactive windows, you need to change the settings" " in the Actions tab.") ); TQWhatsThis::add( delayFocusOn, i18n("When this option is enabled, there will be a delay after which the" " window the mouse pointer is over will become active (receive focus).") ); TQWhatsThis::add( delayFocus, i18n("This is the delay after which the window the mouse pointer is over" " will automatically receive focus.") ); separateScreenFocus = new TQCheckBox( i18n( "S&eparate screen focus" ), fcsBox ); fLay->addWidget( separateScreenFocus ); wtstr = i18n( "When this option is enabled, focus operations are limited only to the active Xinerama screen" ); TQWhatsThis::add( separateScreenFocus, wtstr ); activeMouseScreen = new TQCheckBox( i18n( "Active &mouse screen" ), fcsBox ); fLay->addWidget( activeMouseScreen ); wtstr = i18n( "When this option is enabled, active Xinerama screen (where for example new windows appear)" " is the screen with the mouse pointer. When disabled, the active Xinerama screen is the screen" " with the focused window. This option is by default disabled for Click to focus and" " enabled for other focus policies." ); TQWhatsThis::add( activeMouseScreen, wtstr ); connect(focusCombo, TQ_SIGNAL(activated(int)), this, TQ_SLOT(updateActiveMouseScreen())); if (!TQApplication::desktop()->isVirtualDesktop() || TQApplication::desktop()->numScreens() == 1) // No Ximerama { separateScreenFocus->hide(); activeMouseScreen->hide(); } lay->addWidget(fcsBox); kbdBox = new TQButtonGroup(i18n("Navigation"), this); kbdBox->setColumnLayout( 0, TQt::Horizontal ); TQVBoxLayout *kLay = new TQVBoxLayout(kbdBox->layout(), KDialog::spacingHint()); altTabPopup = new TQCheckBox( i18n("Show window list while switching windows"), kbdBox ); kLay->addWidget( altTabPopup ); wtstr = i18n("Hold down the Alt key and press the Tab key repeatedly to walk" " through the windows on the current desktop (the Alt+Tab" " combination can be reconfigured).\n\n" "If this checkbox is checked" " a popup widget is shown, displaying the icons of all windows to" " walk through and the title of the currently selected one.\n\n" "Otherwise, the focus is passed to a new window each time Tab" " is pressed, with no popup widget. In addition, the previously" " activated window will be sent to the back in this mode."); TQWhatsThis::add( altTabPopup, wtstr ); connect(focusCombo, TQ_SIGNAL(activated(int)), this, TQ_SLOT(updateAltTabMode())); traverseAll = new TQCheckBox( i18n( "&Traverse windows on all desktops" ), kbdBox ); kLay->addWidget( traverseAll ); wtstr = i18n( "Leave this option disabled if you want to limit walking through" " windows to the current desktop." ); TQWhatsThis::add( traverseAll, wtstr ); rollOverDesktops = new TQCheckBox( i18n("Desktop navi&gation wraps around"), kbdBox ); kLay->addWidget(rollOverDesktops); wtstr = i18n( "Enable this option if you want keyboard or active desktop border navigation beyond" " the edge of a desktop to take you to the opposite edge of the new desktop." ); TQWhatsThis::add( rollOverDesktops, wtstr ); showPopupinfo = new TQCheckBox( i18n("Popup &desktop name on desktop switch"), kbdBox ); kLay->addWidget(showPopupinfo); wtstr = i18n( "Enable this option if you wish to see the current desktop" " name popup whenever the current desktop is changed." ); TQWhatsThis::add( showPopupinfo, wtstr ); lay->addWidget(kbdBox); lay->addStretch(); // Any changes goes to slotChanged() connect(focusCombo, TQ_SIGNAL(activated(int)), TQ_SLOT(changed())); connect(fcsBox, TQ_SIGNAL(clicked(int)), TQ_SLOT(changed())); connect(autoRaise, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(delayFocus, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(separateScreenFocus, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect(activeMouseScreen, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect(altTabPopup, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect(traverseAll, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect(rollOverDesktops, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect(showPopupinfo, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect(focusStealing, TQ_SIGNAL(activated(int)), TQ_SLOT(changed())); load(); } int KFocusConfig::getFocus() { return focusCombo->currentItem(); } void KFocusConfig::setFocus(int foc) { focusCombo->setCurrentItem(foc); // this will disable/hide the auto raise delay widget if focus==click setAutoRaiseEnabled(); updateAltTabMode(); } void KFocusConfig::updateAltTabMode() { // not KDE-style Alt+Tab with unreasonable focus policies altTabPopup->setEnabled( focusCombo->currentItem() == 0 || focusCombo->currentItem() == 1 ); } void KFocusConfig::setAutoRaiseInterval(int tb) { autoRaise->setValue(tb); } void KFocusConfig::setDelayFocusInterval(int tb) { delayFocus->setValue(tb); } int KFocusConfig::getAutoRaiseInterval() { return autoRaise->value(); } int KFocusConfig::getDelayFocusInterval() { return delayFocus->value(); } void KFocusConfig::setAutoRaise(bool on) { autoRaiseOn->setChecked(on); } void KFocusConfig::setDelayFocus(bool on) { delayFocusOn->setChecked(on); } void KFocusConfig::setClickRaise(bool on) { clickRaiseOn->setChecked(on); } void KFocusConfig::setAutoRaiseEnabled() { // the auto raise related widgets are: autoRaise if ( focusCombo->currentItem() != CLICK_TO_FOCUS ) { autoRaiseOn->setEnabled(true); autoRaiseOnTog(autoRaiseOn->isChecked()); } else { autoRaiseOn->setEnabled(false); autoRaiseOnTog(false); } } void KFocusConfig::setDelayFocusEnabled() { // the delayed focus related widgets are: delayFocus if ( focusCombo->currentItem() != CLICK_TO_FOCUS ) { delayFocusOn->setEnabled(true); delayFocusOnTog(delayFocusOn->isChecked()); } else { delayFocusOn->setEnabled(false); delayFocusOnTog(false); } } void KFocusConfig::autoRaiseOnTog(bool a) { autoRaise->setEnabled(a); clickRaiseOn->setEnabled( !a ); } void KFocusConfig::delayFocusOnTog(bool a) { delayFocus->setEnabled(a); } void KFocusConfig::clickRaiseOnTog(bool ) { } void KFocusConfig::setSeparateScreenFocus(bool s) { separateScreenFocus->setChecked(s); } void KFocusConfig::setActiveMouseScreen(bool a) { activeMouseScreen->setChecked(a); } void KFocusConfig::updateActiveMouseScreen() { // on by default for non click to focus policies TDEConfigGroup cfg( config, "Windows" ); if( !cfg.hasKey( KWIN_ACTIVE_MOUSE_SCREEN )) setActiveMouseScreen( focusCombo->currentItem() != 0 ); } void KFocusConfig::setAltTabMode(bool a) { altTabPopup->setChecked(a); } void KFocusConfig::setTraverseAll(bool a) { traverseAll->setChecked(a); } void KFocusConfig::setRollOverDesktops(bool a) { rollOverDesktops->setChecked(a); } void KFocusConfig::setShowPopupinfo(bool a) { showPopupinfo->setChecked(a); } void KFocusConfig::setFocusStealing(int l) { l = KMAX( 0, KMIN( 4, l )); focusStealing->setCurrentItem(l); } void KFocusConfig::load( void ) { TQString key; config->setGroup( "Windows" ); key = config->readEntry(KWIN_FOCUS); if( key == "ClickToFocus") setFocus(CLICK_TO_FOCUS); else if( key == "FocusFollowsMouse") setFocus(FOCUS_FOLLOWS_MOUSE); else if(key == "FocusUnderMouse") setFocus(FOCUS_UNDER_MOUSE); else if(key == "FocusStrictlyUnderMouse") setFocus(FOCUS_STRICTLY_UNDER_MOUSE); int k = config->readNumEntry(KWIN_AUTORAISE_INTERVAL,750); setAutoRaiseInterval(k); k = config->readNumEntry(KWIN_DELAYFOCUS_INTERVAL,750); setDelayFocusInterval(k); key = config->readEntry(KWIN_AUTORAISE); setAutoRaise(key == "on"); key = config->readEntry(KWIN_DELAYFOCUS); setDelayFocus(key == "on"); key = config->readEntry(KWIN_CLICKRAISE); setClickRaise(key != "off"); setAutoRaiseEnabled(); // this will disable/hide the auto raise delay widget if focus==click setDelayFocusEnabled(); setSeparateScreenFocus( config->readBoolEntry(KWIN_SEPARATE_SCREEN_FOCUS, false)); // on by default for non click to focus policies setActiveMouseScreen( config->readBoolEntry(KWIN_ACTIVE_MOUSE_SCREEN, focusCombo->currentItem() != 0 )); key = config->readEntry(KWIN_ALTTABMODE, "KDE"); setAltTabMode(key == "KDE"); setRollOverDesktops( config->readBoolEntry(KWIN_ROLL_OVER_DESKTOPS, true )); // setFocusStealing( config->readNumEntry(KWIN_FOCUS_STEALING, 2 )); // TODO default to low for now setFocusStealing( config->readNumEntry(KWIN_FOCUS_STEALING, 1 )); config->setGroup( "PopupInfo" ); setShowPopupinfo( config->readBoolEntry(KWIN_SHOW_POPUP, false )); config->setGroup( "TabBox" ); setTraverseAll( config->readBoolEntry(KWIN_TRAVERSE_ALL, false )); config->setGroup("Desktops"); emit TDECModule::changed(false); } void KFocusConfig::save( void ) { int v; config->setGroup( "Windows" ); v = getFocus(); if (v == CLICK_TO_FOCUS) config->writeEntry(KWIN_FOCUS,"ClickToFocus"); else if (v == FOCUS_UNDER_MOUSE) config->writeEntry(KWIN_FOCUS,"FocusUnderMouse"); else if (v == FOCUS_STRICTLY_UNDER_MOUSE) config->writeEntry(KWIN_FOCUS,"FocusStrictlyUnderMouse"); else config->writeEntry(KWIN_FOCUS,"FocusFollowsMouse"); v = getAutoRaiseInterval(); if (v <0) v = 0; config->writeEntry(KWIN_AUTORAISE_INTERVAL,v); v = getDelayFocusInterval(); if (v <0) v = 0; config->writeEntry(KWIN_DELAYFOCUS_INTERVAL,v); if (autoRaiseOn->isChecked()) config->writeEntry(KWIN_AUTORAISE, "on"); else config->writeEntry(KWIN_AUTORAISE, "off"); if (delayFocusOn->isChecked()) config->writeEntry(KWIN_DELAYFOCUS, "on"); else config->writeEntry(KWIN_DELAYFOCUS, "off"); if (clickRaiseOn->isChecked()) config->writeEntry(KWIN_CLICKRAISE, "on"); else config->writeEntry(KWIN_CLICKRAISE, "off"); config->writeEntry(KWIN_SEPARATE_SCREEN_FOCUS, separateScreenFocus->isChecked()); config->writeEntry(KWIN_ACTIVE_MOUSE_SCREEN, activeMouseScreen->isChecked()); if (altTabPopup->isChecked()) config->writeEntry(KWIN_ALTTABMODE, "KDE"); else config->writeEntry(KWIN_ALTTABMODE, "CDE"); config->writeEntry( KWIN_ROLL_OVER_DESKTOPS, rollOverDesktops->isChecked()); config->writeEntry(KWIN_FOCUS_STEALING, focusStealing->currentItem()); config->setGroup( "PopupInfo" ); config->writeEntry( KWIN_SHOW_POPUP, showPopupinfo->isChecked()); config->setGroup( "TabBox" ); config->writeEntry( KWIN_TRAVERSE_ALL , traverseAll->isChecked()); config->setGroup("Desktops"); if (standAlone) { config->sync(); if ( !kapp->dcopClient()->isAttached() ) kapp->dcopClient()->attach(); kapp->dcopClient()->send("twin*", "", "reconfigure()", TQString("")); } emit TDECModule::changed(false); } void KFocusConfig::defaults() { setAutoRaiseInterval(0); setDelayFocusInterval(0); setFocus(CLICK_TO_FOCUS); setAutoRaise(false); setDelayFocus(false); setClickRaise(true); setSeparateScreenFocus( false ); // on by default for non click to focus policies setActiveMouseScreen( focusCombo->currentItem() != 0 ); setAltTabMode(true); setTraverseAll( false ); setRollOverDesktops(true); setShowPopupinfo(false); // setFocusStealing(2); // TODO default to low for now setFocusStealing(1); emit TDECModule::changed(true); } KActiveBorderConfig::~KActiveBorderConfig() { if (standAlone) delete config; } KActiveBorderConfig::KActiveBorderConfig(bool _standAlone, TDEConfig *_config, TQWidget *parent, const char*) : TDECModule(parent, "kcmkwm"), config(_config), standAlone(_standAlone) { TQBoxLayout *lay = new TQVBoxLayout(this, 0, KDialog::spacingHint()); active_box = new TQButtonGroup(i18n("Active Desktop Borders"), this); TQVBoxLayout *active_vbox = new TQVBoxLayout(active_box); active_vbox->setSpacing(5); active_vbox->setMargin(15); TQWhatsThis::add( active_box, i18n("If this option is enabled, moving the mouse to a screen border" " will perform an action. It will either change your desktop or tile the window that is currently" " dragged.") ); TQLabel *active_func_label = new TQLabel(i18n("Function:"), active_box); active_disable = new TQRadioButton(i18n("D&isabled"), active_box); active_desktop = new TQRadioButton(i18n("Switch &desktop"), active_box); active_desktop_conf = new TQWidget(active_box); TQHBoxLayout *active_desktop_conf_hbox = new TQHBoxLayout(active_desktop_conf); active_desktop_conf_hbox->addSpacing(20); active_desktop_conf_hbox->setAutoAdd(true); active_move = new TQCheckBox(i18n("Switch desktop only when &moving a window"), active_desktop_conf); active_tile = new TQRadioButton(i18n("Tile &window"), active_box); active_tile_conf = new TQWidget(active_box); TQHBoxLayout *active_tile_conf_hbox = new TQHBoxLayout(active_tile_conf); active_tile_conf_hbox->addSpacing(20); TQVBox *active_tile_conf_vbox = new TQVBox(active_tile_conf); active_tile_conf_hbox->addWidget(active_tile_conf_vbox); active_maximize = new TQCheckBox(i18n("Maximize windows by dragging them to the &top of the screen"), active_tile_conf_vbox); tilingOpaque = new TQCheckBox(i18n("Display content &while tiling windows"), active_tile_conf_vbox); TQWhatsThis::add(tilingOpaque, i18n("Enable this option if you want a window's" " content to be shown while tiling it," " instead of just showing a window" " 'skeleton'. The result may not be " " satisfying on slow machines.")); delays = new KIntNumInput(10, active_box); delays->setRange(0, MAX_EDGE_RES, 50, true); delays->setSuffix(i18n(" msec")); delays->setLabel(i18n("Border &activation delay:")); TQWhatsThis::add( delays, i18n("Here you can set a delay for the activation of" " active borders feature. The selected action will be performed after the mouse " " has been pushed against a screen border for the specified number of milliseconds.") ); distance = new KIntNumInput(10, active_box); distance->setRange(1, 100, 1, true); distance->setSuffix(i18n(" px")); distance->setLabel(i18n("Border &activation distance:")); TQWhatsThis::add( distance, i18n("The distance from which an active border can" " be activated. A lower value requires you to push repeatedly into the edge." " Setting this to a higher value (e.g. 30) activates the borders when the" " mouse is close enough, making them easier to activate but also more prone" " to false activations.")); gridTiling = new TQCheckBox(i18n("Enable grid tiling"), active_box); TQWhatsThis::add(gridTiling, i18n("This feature allows you to easily place your windows " "in a grid by using the bracket keys or the history " "navigation buttons on your mouse to manipulate the " "count of grid tiles (the Shift key, while pressed, " "modifies the edited orientation). " "Unlike traditional active borders tiling, to preview " "window placement you only need to press a mouse button " "while dragging the window and the decision is finalized " "once you stop dragging the window. Reducing the grid " "size to 1x1 cancels grid tiling.")); active_vbox->addSpacing(10); active_vbox->addWidget(active_func_label); active_vbox->addWidget(active_disable); active_vbox->addWidget(active_desktop); active_vbox->addWidget(active_desktop_conf); active_vbox->addWidget(active_tile); active_vbox->addWidget(active_tile_conf); active_vbox->addSpacing(15); active_vbox->addWidget(delays); active_vbox->addWidget(distance); active_vbox->addSpacing(15); active_vbox->addWidget(tilingOpaque); active_vbox->addSpacing(15); active_vbox->addWidget(gridTiling); connect(active_box, TQ_SIGNAL(clicked(int)), this, TQ_SLOT(updateActiveBorders())); // Any changes go to slotChanged() connect(active_box, TQ_SIGNAL(clicked(int)), this, TQ_SLOT(changed())); connect(active_move, TQ_SIGNAL(clicked()), this, TQ_SLOT(changed())); connect(active_maximize, TQ_SIGNAL(clicked()), this, TQ_SLOT(changed())); connect(delays, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(changed())); connect(distance, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(changed())); connect(tilingOpaque, TQ_SIGNAL(clicked()), this, TQ_SLOT(changed())); lay->addWidget(active_box); lay->addStretch(); load(); } void KActiveBorderConfig::load() { config->setGroup("Windows"); // compatibility with old option names int active_borders = config->readNumEntry(KWIN_ACTIVE_BORDERS, -1); if (active_borders == -1) { active_borders = config->readNumEntry(KWIN_OLD_ACTIVE_BORDERS, 0); } int active_borders_delay = config->readNumEntry(KWIN_ACTIVE_BORDER_DELAY, -1); if (active_borders_delay == -1) { active_borders_delay = config->readNumEntry(KWIN_OLD_ACTIVE_BORDER_DELAY, 150); } setActiveBorders(active_borders); setActiveBorderDelay(active_borders_delay); setActiveBorderDistance(config->readNumEntry(KWIN_ACTIVE_BORDER_DISTANCE, 10)); TQString tilingMode = config->readEntry(KWIN_TILING_MODE, "Opaque"); if (tilingMode == "Opaque") setTilingMode(OPAQUE); else if (tilingMode == "Transparent") setTilingMode(TRANSPARENT); setGridTiling(config->readBoolEntry(KWIN_GRID_TILING, false)); emit TDECModule::changed(false); } void KActiveBorderConfig::save() { config->setGroup("Windows"); config->writeEntry(KWIN_ACTIVE_BORDERS, getActiveBorders()); config->writeEntry(KWIN_ACTIVE_BORDER_DELAY, getActiveBorderDelay()); config->writeEntry(KWIN_ACTIVE_BORDER_DISTANCE, getActiveBorderDistance()); config->writeEntry(KWIN_GRID_TILING, getGridTiling()); // remove replaced legacy entries config->deleteEntry(KWIN_OLD_ACTIVE_BORDERS); config->deleteEntry(KWIN_OLD_ACTIVE_BORDER_DELAY); int tilingMode = getTilingMode(); if (tilingMode == OPAQUE) config->writeEntry(KWIN_TILING_MODE, "Opaque"); else config->writeEntry(KWIN_TILING_MODE, "Transparent"); if (standAlone) { config->sync(); if (!kapp->dcopClient()->isAttached()) kapp->dcopClient()->attach(); kapp->dcopClient()->send("twin*", "", "reconfigure()", TQString("")); } emit TDECModule::changed(false); } void KActiveBorderConfig::defaults() { setActiveBorders(0); setActiveBorderDelay(150); setActiveBorderDistance(10); setTilingMode(TRANSPARENT); setGridTiling(false); emit TDECModule::changed(true); } int KActiveBorderConfig::getTilingMode() { return tilingOpaque->isChecked() ? OPAQUE : TRANSPARENT; } void KActiveBorderConfig::setTilingMode(int opaque) { tilingOpaque->setChecked(opaque == OPAQUE); } void KActiveBorderConfig::updateActiveBorders() { active_desktop_conf->setEnabled(active_desktop->isChecked()); active_tile_conf->setEnabled(active_tile->isChecked()); } int KActiveBorderConfig::getActiveBorders() { if (active_desktop->isChecked()) { return active_move->isChecked() ? 1 : 2; } if (active_tile->isChecked()) { return active_maximize->isChecked() ? 4 : 3; } return 0; } int KActiveBorderConfig::getActiveBorderDelay() { return delays->value(); } int KActiveBorderConfig::getActiveBorderDistance() { return distance->value(); } bool KActiveBorderConfig::getGridTiling() { return gridTiling->isChecked(); } void KActiveBorderConfig::setActiveBorders(int i) { switch(i) { case 1: active_move->setChecked(true); case 2: active_desktop->setChecked(true); break; case 4: active_maximize->setChecked(true); case 3: active_tile->setChecked(true); break; default: active_disable->setChecked(true); break; } updateActiveBorders(); } void KActiveBorderConfig::setActiveBorderDelay(int delay) { delays->setValue(delay); } void KActiveBorderConfig::setActiveBorderDistance(int d) { distance->setValue(d); } void KActiveBorderConfig::setGridTiling(bool on) { gridTiling->setChecked(on); } KAdvancedConfig::~KAdvancedConfig () { if (standAlone) delete config; } KAdvancedConfig::KAdvancedConfig (bool _standAlone, TDEConfig *_config, TQWidget *parent, const char *) : TDECModule(parent, "kcmkwm"), config(_config), standAlone(_standAlone) { TQString wtstr; TQBoxLayout *lay = new TQVBoxLayout (this, 0, KDialog::spacingHint()); //iTLabel = new TQLabel(i18n(" Allowed overlap:\n" // "(% of desktop space)"), // plcBox); //iTLabel->setAlignment(AlignTop|AlignHCenter); //pLay->addWidget(iTLabel,1,1); //interactiveTrigger = new TQSpinBox(0, 500, 1, plcBox); //pLay->addWidget(interactiveTrigger,1,2); //pLay->addRowSpacing(2,KDialog::spacingHint()); //lay->addWidget(plcBox); shBox = new TQVButtonGroup(i18n("Shading"), this); animateShade = new TQCheckBox(i18n("Anima&te"), shBox); TQWhatsThis::add(animateShade, i18n("Animate the action of reducing the window to its titlebar (shading)" " as well as the expansion of a shaded window") ); shadeHoverOn = new TQCheckBox(i18n("&Enable hover"), shBox); connect(shadeHoverOn, TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(shadeHoverChanged(bool))); shadeHover = new KIntNumInput(500, shBox); shadeHover->setLabel(i18n("Dela&y:"), TQt::AlignVCenter|TQt::AlignLeft); shadeHover->setRange(0, 3000, 100, true); shadeHover->setSteps(100, 100); shadeHover->setSuffix(i18n(" msec")); TQWhatsThis::add(shadeHoverOn, i18n("If Shade Hover is enabled, a shaded window will un-shade automatically " "when the mouse pointer has been over the title bar for some time.")); wtstr = i18n("Sets the time in milliseconds before the window unshades " "when the mouse pointer goes over the shaded window."); TQWhatsThis::add(shadeHover, wtstr); lay->addWidget(shBox); // Any changes goes to slotChanged() connect(animateShade, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(shadeHoverOn, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(shadeHover, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); hideUtilityWindowsForInactive = new TQCheckBox( i18n( "Hide utility windows for inactive applications" ), this ); TQWhatsThis::add( hideUtilityWindowsForInactive, i18n( "When turned on, utility windows (tool windows, torn-off menus,…) of inactive applications will be" " hidden and will be shown only when the application becomes active. Note that applications" " have to mark the windows with the proper window type for this feature to work." )); connect(hideUtilityWindowsForInactive, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); lay->addWidget( hideUtilityWindowsForInactive ); lay->addStretch(); load(); } void KAdvancedConfig::setShadeHover(bool on) { shadeHoverOn->setChecked(on); shadeHover->setEnabled(on); } void KAdvancedConfig::setShadeHoverInterval(int k) { shadeHover->setValue(k); } int KAdvancedConfig::getShadeHoverInterval() { return shadeHover->value(); } void KAdvancedConfig::shadeHoverChanged(bool a) { shadeHover->setEnabled(a); } void KAdvancedConfig::setAnimateShade(bool a) { animateShade->setChecked(a); } void KAdvancedConfig::setHideUtilityWindowsForInactive(bool s) { hideUtilityWindowsForInactive->setChecked( s ); } void KAdvancedConfig::load( void ) { config->setGroup( "Windows" ); setAnimateShade(config->readBoolEntry(KWIN_ANIMSHADE, true)); setShadeHover(config->readBoolEntry(KWIN_SHADEHOVER, false)); setShadeHoverInterval(config->readNumEntry(KWIN_SHADEHOVER_INTERVAL, 250)); setHideUtilityWindowsForInactive( config->readBoolEntry( KWIN_HIDE_UTILITY, true )); emit TDECModule::changed(false); } void KAdvancedConfig::save( void ) { int v; config->setGroup( "Windows" ); config->writeEntry(KWIN_ANIMSHADE, animateShade->isChecked()); if (shadeHoverOn->isChecked()) config->writeEntry(KWIN_SHADEHOVER, "on"); else config->writeEntry(KWIN_SHADEHOVER, "off"); v = getShadeHoverInterval(); if (v<0) v = 0; config->writeEntry(KWIN_SHADEHOVER_INTERVAL, v); config->writeEntry(KWIN_HIDE_UTILITY, hideUtilityWindowsForInactive->isChecked()); if (standAlone) { config->sync(); if ( !kapp->dcopClient()->isAttached() ) kapp->dcopClient()->attach(); kapp->dcopClient()->send("twin*", "", "reconfigure()", TQString("")); } emit TDECModule::changed(false); } void KAdvancedConfig::defaults() { setAnimateShade(true); setShadeHover(false); setShadeHoverInterval(250); setHideUtilityWindowsForInactive( true ); emit TDECModule::changed(true); } KMovingConfig::~KMovingConfig () { if (standAlone) delete config; } KMovingConfig::KMovingConfig (bool _standAlone, TDEConfig *_config, TQWidget *parent, const char *) : TDECModule(parent, "kcmkwm"), config(_config), standAlone(_standAlone) { TQString wtstr; TQBoxLayout *lay = new TQVBoxLayout (this, 0, KDialog::spacingHint()); windowsBox = new TQButtonGroup(i18n("Windows"), this); windowsBox->setColumnLayout( 0, TQt::Horizontal ); TQBoxLayout *wLay = new TQVBoxLayout (windowsBox->layout(), KDialog::spacingHint()); TQBoxLayout *bLay = new TQVBoxLayout; wLay->addLayout(bLay); moveOpaque = new TQCheckBox(i18n("Di&splay content in moving windows"), windowsBox); bLay->addWidget(moveOpaque); TQWhatsThis::add(moveOpaque, i18n("Enable this option if you want a window's content to be fully shown" " while moving it, instead of just showing a window 'skeleton'. The result may not be satisfying" " on slow machines without graphic acceleration.")); resizeOpaque = new TQCheckBox(i18n("Display content in &resizing windows"), windowsBox); bLay->addWidget(resizeOpaque); TQWhatsThis::add(resizeOpaque, i18n("Enable this option if you want a window's content to be shown" " while resizing it, instead of just showing a window 'skeleton'. The result may not be satisfying" " on slow machines.")); geometryTipOn = new TQCheckBox(i18n("Display window &geometry when moving or resizing"), windowsBox); bLay->addWidget(geometryTipOn); TQWhatsThis::add(geometryTipOn, i18n("Enable this option if you want a window's geometry to be displayed" " while it is being moved or resized. The window position relative" " to the top-left corner of the screen is displayed together with" " its size.")); TQGridLayout *rLay = new TQGridLayout(2,3); bLay->addLayout(rLay); rLay->setColStretch(0,0); rLay->setColStretch(1,1); minimizeAnimOn = new TQCheckBox(i18n("Animate minimi&ze and restore"), windowsBox); TQWhatsThis::add( minimizeAnimOn, i18n("Enable this option if you want an animation shown when" " windows are minimized or restored." ) ); rLay->addWidget(minimizeAnimOn,0,0); minimizeAnimSlider = new TQSlider(0,10,10,0,TQt::Horizontal, windowsBox); minimizeAnimSlider->setSteps(1, 1); // TQSlider::Below clashes with a X11/X.h #define #undef Below minimizeAnimSlider->setTickmarks(TQSlider::Below); rLay->addMultiCellWidget(minimizeAnimSlider,0,0,1,2); connect(minimizeAnimOn, TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(setMinimizeAnim(bool))); connect(minimizeAnimSlider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(setMinimizeAnimSpeed(int))); minimizeAnimSlowLabel= new TQLabel(i18n("Slow"),windowsBox); minimizeAnimSlowLabel->setAlignment(TQt::AlignTop|TQt::AlignLeft); rLay->addWidget(minimizeAnimSlowLabel,1,1); minimizeAnimFastLabel= new TQLabel(i18n("Fast"),windowsBox); minimizeAnimFastLabel->setAlignment(TQt::AlignTop|TQt::AlignRight); rLay->addWidget(minimizeAnimFastLabel,1,2); wtstr = i18n("Here you can set the speed of the animation shown when windows are" " minimized and restored. "); TQWhatsThis::add( minimizeAnimSlider, wtstr ); TQWhatsThis::add( minimizeAnimSlowLabel, wtstr ); TQWhatsThis::add( minimizeAnimFastLabel, wtstr ); moveResizeMaximized = new TQCheckBox( i18n("Allow moving and resizing o&f maximized windows"), windowsBox); bLay->addWidget(moveResizeMaximized); TQWhatsThis::add(moveResizeMaximized, i18n("When enabled, this feature activates the border of maximized windows" " and allows you to move or resize them," " just like for normal windows")); resetMaximizedWindowGeometry = new TQCheckBox( i18n("Restore size of maximized/tiled windows when moving"), windowsBox); bLay->addWidget(resetMaximizedWindowGeometry); TQWhatsThis::add(resetMaximizedWindowGeometry, i18n("If this feature is enabled, dragging a maximized or tiled window" " will restore the window to its original size.")); TQBoxLayout *vLay = new TQHBoxLayout(bLay); TQLabel *plcLabel = new TQLabel(i18n("&Placement:"),windowsBox); placementCombo = new TQComboBox(false, windowsBox); placementCombo->insertItem(i18n("Smart"), SMART_PLACEMENT); placementCombo->insertItem(i18n("Maximizing"), MAXIMIZING_PLACEMENT); placementCombo->insertItem(i18n("Cascade"), CASCADE_PLACEMENT); placementCombo->insertItem(i18n("Random"), RANDOM_PLACEMENT); placementCombo->insertItem(i18n("Centered"), CENTERED_PLACEMENT); placementCombo->insertItem(i18n("Zero-Cornered"), ZEROCORNERED_PLACEMENT); // CT: disabling is needed as long as functionality misses in twin //placementCombo->insertItem(i18n("Interactive"), INTERACTIVE_PLACEMENT); //placementCombo->insertItem(i18n("Manual"), MANUAL_PLACEMENT); placementCombo->setCurrentItem(SMART_PLACEMENT); // FIXME, when more policies have been added to TWin wtstr = i18n("The placement policy determines where a new window" " will appear on the desktop." "
    " "
  • Smart will try to achieve a minimum overlap of windows
  • " "
  • Maximizing will try to maximize every window to fill the whole screen." " It might be useful to selectively affect placement of some windows using" " the window-specific settings.
  • " "
  • Cascade will cascade the windows
  • " "
  • Random will use a random position
  • " "
  • Centered will place the window centered
  • " "
  • Zero-Cornered will place the window in the top-left corner
  • " "
") ; TQWhatsThis::add( plcLabel, wtstr); TQWhatsThis::add( placementCombo, wtstr); plcLabel->setBuddy(placementCombo); vLay->addWidget(plcLabel, 0); vLay->addWidget(placementCombo, 1, TQt::AlignLeft); bLay->addSpacing(10); lay->addWidget(windowsBox); //iTLabel = new TQLabel(i18n(" Allowed overlap:\n" // "(% of desktop space)"), // plcBox); //iTLabel->setAlignment(AlignTop|AlignHCenter); //pLay->addWidget(iTLabel,1,1); //interactiveTrigger = new TQSpinBox(0, 500, 1, plcBox); //pLay->addWidget(interactiveTrigger,1,2); //pLay->addRowSpacing(2,KDialog::spacingHint()); //lay->addWidget(plcBox); //CT 15mar98 - add EdgeResistance, BorderAttractor, WindowsAttractor config MagicBox = new TQVButtonGroup(i18n("Snap Zones"), this); MagicBox->setMargin(15); BrdrSnap = new KIntNumInput(10, MagicBox); BrdrSnap->setSpecialValueText( i18n("none") ); BrdrSnap->setRange( 0, MAX_BRDR_SNAP); BrdrSnap->setLabel(i18n("&Border snap zone:")); BrdrSnap->setSteps(1,10); TQWhatsThis::add( BrdrSnap, i18n("Here you can set the snap zone for screen borders, i.e." " the 'strength' of the magnetic field which will make windows snap to the border when" " moved near it.") ); WndwSnap = new KIntNumInput(10, MagicBox); WndwSnap->setSpecialValueText( i18n("none") ); WndwSnap->setRange( 0, MAX_WNDW_SNAP); WndwSnap->setLabel(i18n("&Window snap zone:")); BrdrSnap->setSteps(1,10); TQWhatsThis::add( WndwSnap, i18n("Here you can set the snap zone for windows, i.e." " the 'strength' of the magnetic field which will make windows snap to each other when" " they're moved near another window.") ); OverlapSnap=new TQCheckBox(i18n("Snap windows onl&y when overlapping"),MagicBox); TQWhatsThis::add( OverlapSnap, i18n("Here you can set that windows will be only" " snapped if you try to overlap them, i.e. they will not be snapped if the windows" " comes only near another window or border.") ); lay->addWidget(MagicBox); lay->addStretch(); load(); // Any changes goes to slotChanged() connect( moveOpaque, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect( resizeOpaque, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect( geometryTipOn, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); connect( minimizeAnimOn, TQ_SIGNAL(clicked() ), TQ_SLOT(changed())); connect( minimizeAnimSlider, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect( moveResizeMaximized, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect( resetMaximizedWindowGeometry, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect( placementCombo, TQ_SIGNAL(activated(int)), TQ_SLOT(changed())); connect( BrdrSnap, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect( BrdrSnap, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(slotBrdrSnapChanged(int))); connect( WndwSnap, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect( WndwSnap, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(slotWndwSnapChanged(int))); connect( OverlapSnap, TQ_SIGNAL(clicked()), TQ_SLOT(changed())); // To get suffix to BrdrSnap and WndwSnap inputs with default values. slotBrdrSnapChanged(BrdrSnap->value()); slotWndwSnapChanged(WndwSnap->value()); } void KMovingConfig::setGeometryTip(bool showGeometryTip) { geometryTipOn->setChecked(showGeometryTip); } bool KMovingConfig::getGeometryTip() { return geometryTipOn->isChecked(); } // placement policy --- CT 31jan98 --- int KMovingConfig::getPlacement() { return placementCombo->currentItem(); } void KMovingConfig::setPlacement(int plac) { placementCombo->setCurrentItem(plac); } bool KMovingConfig::getMinimizeAnim() { return minimizeAnimOn->isChecked(); } int KMovingConfig::getMinimizeAnimSpeed() { return minimizeAnimSlider->value(); } void KMovingConfig::setMinimizeAnim(bool anim) { minimizeAnimOn->setChecked( anim ); minimizeAnimSlider->setEnabled( anim ); minimizeAnimSlowLabel->setEnabled( anim ); minimizeAnimFastLabel->setEnabled( anim ); } void KMovingConfig::setMinimizeAnimSpeed(int speed) { minimizeAnimSlider->setValue(speed); } int KMovingConfig::getMoveMode() { return moveOpaque->isChecked() ? OPAQUE : TRANSPARENT; } void KMovingConfig::setMoveMode(int opaque) { moveOpaque->setChecked(opaque == OPAQUE); } int KMovingConfig::getResizeMode() { return resizeOpaque->isChecked() ? OPAQUE : TRANSPARENT; } void KMovingConfig::setResizeMode(int opaque) { resizeOpaque->setChecked(opaque == OPAQUE); } void KMovingConfig::setMoveResizeMaximized(bool a) { moveResizeMaximized->setChecked(a); } void KMovingConfig::setResetMaximizedWindowGeometry(bool a) { resetMaximizedWindowGeometry->setChecked(a); } void KMovingConfig::slotBrdrSnapChanged(int value) { BrdrSnap->setSuffix(i18n(" pixel", " pixels", value)); } void KMovingConfig::slotWndwSnapChanged(int value) { WndwSnap->setSuffix(i18n(" pixel", " pixels", value)); } void KMovingConfig::load( void ) { TQString key; config->setGroup( "Windows" ); // DF: please keep the default consistent with twin (options.cpp) key = config->readEntry(KWIN_MOVE_MODE, "Opaque"); if (key == "Opaque") setMoveMode(OPAQUE); else if (key == "Transparent") setMoveMode(TRANSPARENT); key = config->readEntry(KWIN_RESIZE_MODE, "Opaque"); if (key == "Opaque") setResizeMode(OPAQUE); else if (key == "Transparent") setResizeMode(TRANSPARENT); //CT 17Jun1998 - variable animation speed from 0 (none!!) to 10 (max) bool anim = config->readBoolEntry(KWIN_MINIMIZE_ANIM, true ); int animSpeed = config->readNumEntry(KWIN_MINIMIZE_ANIM_SPEED, 5); if( animSpeed < 1 ) animSpeed = 0; if( animSpeed > 10 ) animSpeed = 10; setMinimizeAnim( anim ); setMinimizeAnimSpeed( animSpeed ); //KS 10Jan2003 - Geometry Tip during window move/resize bool showGeomTip = config->readBoolEntry(KWIN_GEOMETRY, false); setGeometryTip( showGeomTip ); // placement policy --- CT 19jan98 --- key = config->readEntry(KWIN_PLACEMENT); //CT 13mar98 interactive placement // if( key.left(11) == "interactive") { // setPlacement(INTERACTIVE_PLACEMENT); // int comma_pos = key.find(','); // if (comma_pos < 0) // interactiveTrigger->setValue(0); // else // interactiveTrigger->setValue (key.right(key.length() // - comma_pos).toUInt(0)); // iTLabel->setEnabled(true); // interactiveTrigger->show(); // } // else { // interactiveTrigger->setValue(0); // iTLabel->setEnabled(false); // interactiveTrigger->hide(); if( key == "Random") setPlacement(RANDOM_PLACEMENT); else if( key == "Cascade") setPlacement(CASCADE_PLACEMENT); //CT 31jan98 //CT 31mar98 manual placement else if( key == "manual") setPlacement(MANUAL_PLACEMENT); else if( key == "Centered") setPlacement(CENTERED_PLACEMENT); else if( key == "ZeroCornered") setPlacement(ZEROCORNERED_PLACEMENT); else if( key == "Maximizing") setPlacement(MAXIMIZING_PLACEMENT); else setPlacement(SMART_PLACEMENT); // } setMoveResizeMaximized(config->readBoolEntry(KWIN_MOVE_RESIZE_MAXIMIZED, false)); setResetMaximizedWindowGeometry(config->readBoolEntry(KWIN_RESET_MAX_WIN_GEOM, false)); int v; v = config->readNumEntry(KWM_BRDR_SNAP_ZONE, KWM_BRDR_SNAP_ZONE_DEFAULT); if (v > MAX_BRDR_SNAP) setBorderSnapZone(MAX_BRDR_SNAP); else if (v < 0) setBorderSnapZone (0); else setBorderSnapZone(v); v = config->readNumEntry(KWM_WNDW_SNAP_ZONE, KWM_WNDW_SNAP_ZONE_DEFAULT); if (v > MAX_WNDW_SNAP) setWindowSnapZone(MAX_WNDW_SNAP); else if (v < 0) setWindowSnapZone (0); else setWindowSnapZone(v); OverlapSnap->setChecked(config->readBoolEntry("SnapOnlyWhenOverlapping",false)); emit TDECModule::changed(false); } void KMovingConfig::save( void ) { int v; config->setGroup( "Windows" ); v = getMoveMode(); if (v == OPAQUE) config->writeEntry(KWIN_MOVE_MODE, "Opaque"); else config->writeEntry(KWIN_MOVE_MODE, "Transparent"); v = getResizeMode(); if (v == OPAQUE) config->writeEntry(KWIN_RESIZE_MODE, "Opaque"); else config->writeEntry(KWIN_RESIZE_MODE, "Transparent"); config->writeEntry(KWIN_GEOMETRY, getGeometryTip()); // placement policy --- CT 31jan98 --- v = getPlacement(); if (v == RANDOM_PLACEMENT) config->writeEntry(KWIN_PLACEMENT, "Random"); else if (v == CASCADE_PLACEMENT) config->writeEntry(KWIN_PLACEMENT, "Cascade"); else if (v == CENTERED_PLACEMENT) config->writeEntry(KWIN_PLACEMENT, "Centered"); else if (v == ZEROCORNERED_PLACEMENT) config->writeEntry(KWIN_PLACEMENT, "ZeroCornered"); else if (v == MAXIMIZING_PLACEMENT) config->writeEntry(KWIN_PLACEMENT, "Maximizing"); //CT 13mar98 manual and interactive placement // else if (v == MANUAL_PLACEMENT) // config->writeEntry(KWIN_PLACEMENT, "Manual"); // else if (v == INTERACTIVE_PLACEMENT) { // TQString tmpstr = TQString("Interactive,%1").arg(interactiveTrigger->value()); // config->writeEntry(KWIN_PLACEMENT, tmpstr); // } else config->writeEntry(KWIN_PLACEMENT, "Smart"); config->writeEntry(KWIN_MINIMIZE_ANIM, getMinimizeAnim()); config->writeEntry(KWIN_MINIMIZE_ANIM_SPEED, getMinimizeAnimSpeed()); config->writeEntry(KWIN_MOVE_RESIZE_MAXIMIZED, moveResizeMaximized->isChecked()); config->writeEntry(KWIN_RESET_MAX_WIN_GEOM, resetMaximizedWindowGeometry->isChecked()); config->writeEntry(KWM_BRDR_SNAP_ZONE,getBorderSnapZone()); config->writeEntry(KWM_WNDW_SNAP_ZONE,getWindowSnapZone()); config->writeEntry("SnapOnlyWhenOverlapping",OverlapSnap->isChecked()); if (standAlone) { config->sync(); if ( !kapp->dcopClient()->isAttached() ) kapp->dcopClient()->attach(); kapp->dcopClient()->send("twin*", "", "reconfigure()", TQString("")); } emit TDECModule::changed(false); } void KMovingConfig::defaults() { setMoveMode(OPAQUE); setResizeMode(TRANSPARENT); setGeometryTip(false); setPlacement(SMART_PLACEMENT); setMoveResizeMaximized(false); setResetMaximizedWindowGeometry(false); //copied from kcontrol/konq/twindesktop, aleXXX setWindowSnapZone(KWM_WNDW_SNAP_ZONE_DEFAULT); setBorderSnapZone(KWM_BRDR_SNAP_ZONE_DEFAULT); OverlapSnap->setChecked(false); setMinimizeAnim( true ); setMinimizeAnimSpeed( 5 ); emit TDECModule::changed(true); } int KMovingConfig::getBorderSnapZone() { return BrdrSnap->value(); } void KMovingConfig::setBorderSnapZone(int pxls) { BrdrSnap->setValue(pxls); } int KMovingConfig::getWindowSnapZone() { return WndwSnap->value(); } void KMovingConfig::setWindowSnapZone(int pxls) { WndwSnap->setValue(pxls); } KTranslucencyConfig::~KTranslucencyConfig () { if (standAlone) delete config; if (kompmgr) kompmgr->detach(); } KTranslucencyConfig::KTranslucencyConfig (bool _standAlone, TDEConfig *_config, TQWidget *parent, const char *) : TDECModule(parent, "kcmkwm"), config(_config), standAlone(_standAlone) { kompmgr = 0L; resetKompmgr_ = FALSE; TQVBoxLayout *lay = new TQVBoxLayout (this); kompmgrAvailable_ = kompmgrAvailable(); if (!kompmgrAvailable_){ KActiveLabel *label = new KActiveLabel(i18n("It seems that alpha channel support is not available.

" "Please make sure you have " "Xorg ≥ 6.8," " and installed the composition manager that came with twin.
" "Also, make sure you have the following entries in your XConfig (e.g. /etc/X11/xorg.conf):

" "Section \"Extensions\"
" "Option \"Composite\" \"Enable\"
" "EndSection


" "And if your GPU provides hardware-accelerated Xrender support (mainly nVidia cards):

" "Option \"RenderAccel\" \"true\"
" "In Section \"Device\"
"), this); lay->addWidget(label); } else { TQTabWidget *tabW = new TQTabWidget(this); TQWidget *tGroup = new TQWidget(tabW); TQVBoxLayout *vLay = new TQVBoxLayout (tGroup,KDialog::marginHint(), KDialog::spacingHint()); vLay->addSpacing(11); // to get the proper gb top offset onlyDecoTranslucent = new TQCheckBox(i18n("Apply translucency only to decoration"),tGroup); vLay->addWidget(onlyDecoTranslucent); vLay->addSpacing(11); TQGridLayout *gLay = new TQGridLayout(vLay,4,2,KDialog::spacingHint()); gLay->setColStretch(1,1); activeWindowTransparency = new TQCheckBox(i18n("Active windows:"),tGroup); gLay->addWidget(activeWindowTransparency,0,0); activeWindowOpacity = new KIntNumInput(100, tGroup); activeWindowOpacity->setRange(0,100); activeWindowOpacity->setSuffix("%"); gLay->addWidget(activeWindowOpacity,0,1); inactiveWindowTransparency = new TQCheckBox(i18n("Inactive windows:"),tGroup); gLay->addWidget(inactiveWindowTransparency,1,0); inactiveWindowOpacity = new KIntNumInput(100, tGroup); inactiveWindowOpacity->setRange(0,100); inactiveWindowOpacity->setSuffix("%"); gLay->addWidget(inactiveWindowOpacity,1,1); movingWindowTransparency = new TQCheckBox(i18n("Moving windows:"),tGroup); gLay->addWidget(movingWindowTransparency,2,0); movingWindowOpacity = new KIntNumInput(100, tGroup); movingWindowOpacity->setRange(0,100); movingWindowOpacity->setSuffix("%"); gLay->addWidget(movingWindowOpacity,2,1); dockWindowTransparency = new TQCheckBox(i18n("Dock windows:"),tGroup); gLay->addWidget(dockWindowTransparency,3,0); dockWindowOpacity = new KIntNumInput(100, tGroup); dockWindowOpacity->setRange(0,100); dockWindowOpacity->setSuffix("%"); gLay->addWidget(dockWindowOpacity,3,1); vLay->addSpacing(11); keepAboveAsActive = new TQCheckBox(i18n("Treat 'keep above' windows as active ones"),tGroup); vLay->addWidget(keepAboveAsActive); disableARGB = new TQCheckBox(i18n("Disable ARGB windows (ignores window alpha maps, fixes gtk1 apps)"),tGroup); vLay->addWidget(disableARGB); if (TDECompositor == "compton-tde") { disableARGB->hide(); } useOpenGL = new TQCheckBox(i18n("Use OpenGL compositor (best performance)"),tGroup); vLay->addWidget(useOpenGL); blurBackground = new TQCheckBox(i18n("Blur the background of transparent windows"),tGroup); vLay->addWidget(blurBackground); greyscaleBackground = new TQCheckBox(i18n("Desaturate the background of transparent windows"),tGroup); vLay->addWidget(greyscaleBackground); if (TDECompositor != "compton-tde") { useOpenGL->hide(); blurBackground->hide(); greyscaleBackground->hide(); } vLay->addStretch(); tabW->addTab(tGroup, i18n("Opacity")); TQWidget *sGroup = new TQWidget(tabW); // sGroup->setCheckable(TRUE); TQVBoxLayout *vLay2 = new TQVBoxLayout (sGroup,11,6); vLay2->addSpacing(11); // to get the proper gb top offset useShadows = new TQCheckBox(i18n("Use shadows on windows (standard effects should be disabled in the Styles module if this is checked)"),sGroup); vLay2->addWidget(useShadows); useShadowsOnMenuWindows = new TQCheckBox(i18n("Use shadows on menus (requires menu fade effect to be disabled in the Styles module)"),sGroup); vLay2->addWidget(useShadowsOnMenuWindows); useShadowsOnToolTipWindows = new TQCheckBox(i18n("Use shadows on tooltips"),sGroup); vLay2->addWidget(useShadowsOnToolTipWindows); useShadowsOnDockWindows = new TQCheckBox(i18n("Use shadows on panels"),sGroup); vLay2->addWidget(useShadowsOnDockWindows); if (TDECompositor != "compton-tde") { useShadowsOnMenuWindows->hide(); useShadowsOnToolTipWindows->hide(); useShadowsOnDockWindows->hide(); } vLay2->addSpacing(11); TQGridLayout *gLay2 = new TQGridLayout(vLay2,6,2); gLay2->setColStretch(1,1); TQLabel *label2 = new TQLabel(i18n("Base shadow radius:"),sGroup); gLay2->addWidget(label2,0,0); baseShadowSize = new KIntNumInput(6,sGroup); baseShadowSize->setRange(0,32); // inactiveWindowShadowSize->setSuffix("px"); gLay2->addWidget(baseShadowSize,0,1); TQLabel *label2a = new TQLabel(i18n("Inactive window distance from background:"),sGroup); gLay2->addWidget(label2a,1,0); inactiveWindowShadowSize = new KIntNumInput(6,sGroup); inactiveWindowShadowSize->setRange(0,16); // inactiveWindowShadowSize->setSuffix("px"); gLay2->addWidget(inactiveWindowShadowSize,1,1); TQLabel *label1 = new TQLabel(i18n("Active window distance from background:"),sGroup); gLay2->addWidget(label1,2,0); activeWindowShadowSize = new KIntNumInput(12,sGroup); activeWindowShadowSize->setRange(0,16); // activeWindowShadowSize->setSuffix("px"); gLay2->addWidget(activeWindowShadowSize,2,1); TQLabel *label3 = new TQLabel(i18n("Dock distance from background:"),sGroup); gLay2->addWidget(label3,3,0); dockWindowShadowSize = new KIntNumInput(6,sGroup); dockWindowShadowSize->setRange(0,16); // dockWindowShadowSize->setSuffix("px"); gLay2->addWidget(dockWindowShadowSize,3,1); TQLabel *label3a = new TQLabel(i18n("Menu distance from background:"),sGroup); gLay2->addWidget(label3a,4,0); menuWindowShadowSize = new KIntNumInput(6,sGroup); menuWindowShadowSize->setRange(0,16); // menuWindowShadowSize->setSuffix("px"); gLay2->addWidget(menuWindowShadowSize,4,1); // FIXME // Menu control does not work! // Menus appear to be controlled by the base shadow radius ONLY label3a->hide(); menuWindowShadowSize->hide(); TQLabel *label4 = new TQLabel(i18n("Vertical offset:"),sGroup); gLay2->addWidget(label4,5,0); shadowTopOffset = new KIntNumInput(80,sGroup); shadowTopOffset->setSuffix("%"); shadowTopOffset->setRange(-200,200); gLay2->addWidget(shadowTopOffset,5,1); TQLabel *label5 = new TQLabel(i18n("Horizontal offset:"),sGroup); gLay2->addWidget(label5,6,0); shadowLeftOffset = new KIntNumInput(0,sGroup); shadowLeftOffset->setSuffix("%"); shadowLeftOffset->setRange(-200,200); gLay2->addWidget(shadowLeftOffset,6,1); TQLabel *label6 = new TQLabel(i18n("Shadow color:"),sGroup); gLay2->addWidget(label6,7,0); shadowColor = new KColorButton(TQt::black,sGroup); gLay2->addWidget(shadowColor,7,1); gLay2->setColStretch(1,1); vLay2->addSpacing(11); removeShadowsOnMove = new TQCheckBox(i18n("Remove shadows on move"),sGroup); vLay2->addWidget(removeShadowsOnMove); removeShadowsOnResize = new TQCheckBox(i18n("Remove shadows on resize"),sGroup); vLay2->addWidget(removeShadowsOnResize); vLay2->addStretch(); tabW->addTab(sGroup, i18n("Shadows")); TQWidget *eGroup = new TQWidget(this); TQVBoxLayout *vLay3 = new TQVBoxLayout (eGroup,11,6); fadeInWindows = new TQCheckBox(i18n("Fade-in windows (including popups)"),eGroup); fadeInMenuWindows = new TQCheckBox(i18n("Fade-in menus (requires menu fade effect to be disabled in the Styles module)"),eGroup); fadeInToolTipWindows = new TQCheckBox(i18n("Fade-in tooltips"),eGroup); fadeOnOpacityChange = new TQCheckBox(i18n("Fade between opacity changes"),eGroup); fadeInSpeed = new KIntNumInput(100, eGroup); fadeInSpeed->setRange(1,100); fadeInSpeed->setLabel(i18n("Fade-in speed:")); fadeOutSpeed = new KIntNumInput(100, eGroup); fadeOutSpeed->setRange(1,100); fadeOutSpeed->setLabel(i18n("Fade-out speed:")); vLay3->addWidget(fadeInWindows); vLay3->addWidget(fadeInMenuWindows); vLay3->addWidget(fadeInToolTipWindows); vLay3->addWidget(fadeOnOpacityChange); vLay3->addWidget(fadeInSpeed); vLay3->addWidget(fadeOutSpeed); vLay3->addStretch(); tabW->addTab(eGroup, i18n("Effects")); useTranslucency = new TQCheckBox(i18n("Enable the Trinity window composition manager"),this); lay->addWidget(useTranslucency); lay->addWidget(tabW); connect(useTranslucency, TQ_SIGNAL(toggled(bool)), tabW, TQ_SLOT(setEnabled(bool))); connect(activeWindowTransparency, TQ_SIGNAL(toggled(bool)), activeWindowOpacity, TQ_SLOT(setEnabled(bool))); connect(inactiveWindowTransparency, TQ_SIGNAL(toggled(bool)), inactiveWindowOpacity, TQ_SLOT(setEnabled(bool))); connect(movingWindowTransparency, TQ_SIGNAL(toggled(bool)), movingWindowOpacity, TQ_SLOT(setEnabled(bool))); connect(dockWindowTransparency, TQ_SIGNAL(toggled(bool)), dockWindowOpacity, TQ_SLOT(setEnabled(bool))); connect(useTranslucency, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(onlyDecoTranslucent, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(activeWindowTransparency, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(inactiveWindowTransparency, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(movingWindowTransparency, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(dockWindowTransparency, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(keepAboveAsActive, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(disableARGB, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(useOpenGL, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(useOpenGL, TQ_SIGNAL(toggled(bool)), blurBackground, TQ_SLOT(setEnabled(bool))); connect(blurBackground, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(useOpenGL, TQ_SIGNAL(toggled(bool)), greyscaleBackground, TQ_SLOT(setEnabled(bool))); connect(greyscaleBackground, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(useShadows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(useShadowsOnMenuWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(useShadowsOnToolTipWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(useShadowsOnDockWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(removeShadowsOnResize, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(removeShadowsOnMove, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(activeWindowOpacity, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(inactiveWindowOpacity, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(movingWindowOpacity, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(dockWindowOpacity, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(dockWindowShadowSize, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(menuWindowShadowSize, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(activeWindowShadowSize, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(inactiveWindowShadowSize, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(baseShadowSize, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(shadowTopOffset, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(shadowLeftOffset, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(shadowColor, TQ_SIGNAL(changed(const TQColor&)), TQ_SLOT(changed())); connect(fadeInWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(fadeInMenuWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(fadeInToolTipWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(fadeOnOpacityChange, TQ_SIGNAL(toggled(bool)), TQ_SLOT(changed())); connect(fadeInSpeed, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(fadeOutSpeed, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(changed())); connect(useShadows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(processShadowLockouts())); connect(useShadowsOnMenuWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(processShadowLockouts())); connect(useShadowsOnToolTipWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(processShadowLockouts())); connect(useShadowsOnDockWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(processShadowLockouts())); load(); tabW->setEnabled(useTranslucency->isChecked()); connect(useTranslucency, TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(showWarning(bool))); // handle kompmgr restarts if necessary connect(useTranslucency, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(disableARGB, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(useOpenGL, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(blurBackground, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(greyscaleBackground, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(useShadows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(useShadowsOnMenuWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(useShadowsOnToolTipWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(useShadowsOnDockWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(inactiveWindowShadowSize, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(resetKompmgr())); connect(baseShadowSize, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(resetKompmgr())); connect(shadowTopOffset, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(resetKompmgr())); connect(shadowLeftOffset, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(resetKompmgr())); connect(shadowColor, TQ_SIGNAL(changed(const TQColor&)), TQ_SLOT(resetKompmgr())); connect(fadeInWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(fadeInMenuWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(fadeInToolTipWindows, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(fadeOnOpacityChange, TQ_SIGNAL(toggled(bool)), TQ_SLOT(resetKompmgr())); connect(fadeInSpeed, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(resetKompmgr())); connect(fadeOutSpeed, TQ_SIGNAL(valueChanged(int)), TQ_SLOT(resetKompmgr())); } } void KTranslucencyConfig::processShadowLockouts() { bool enabled = (useShadows->isChecked() || useShadowsOnMenuWindows->isChecked() || useShadowsOnToolTipWindows->isChecked() || useShadowsOnDockWindows->isChecked()); dockWindowShadowSize->setEnabled(enabled); menuWindowShadowSize->setEnabled(enabled); activeWindowShadowSize->setEnabled(enabled); inactiveWindowShadowSize->setEnabled(enabled); baseShadowSize->setEnabled(enabled); shadowTopOffset->setEnabled(enabled); shadowLeftOffset->setEnabled(enabled); shadowColor->setEnabled(enabled); } void KTranslucencyConfig::resetKompmgr() { resetKompmgr_ = TRUE; } void KTranslucencyConfig::load( void ) { if (!kompmgrAvailable_) return; config->setGroup( "Notification Messages" ); useTranslucency->setChecked(config->readBoolEntry("UseTranslucency",false)); config->setGroup( "Translucency" ); activeWindowTransparency->setChecked(config->readBoolEntry("TranslucentActiveWindows",false)); inactiveWindowTransparency->setChecked(config->readBoolEntry("TranslucentInactiveWindows",false)); movingWindowTransparency->setChecked(config->readBoolEntry("TranslucentMovingWindows",false)); removeShadowsOnMove->setChecked(config->readBoolEntry("RemoveShadowsOnMove",false)); removeShadowsOnResize->setChecked(config->readBoolEntry("RemoveShadowsOnResize",false)); dockWindowTransparency->setChecked(config->readBoolEntry("TranslucentDocks",false)); keepAboveAsActive->setChecked(config->readBoolEntry("TreatKeepAboveAsActive",true)); onlyDecoTranslucent->setChecked(config->readBoolEntry("OnlyDecoTranslucent",false)); activeWindowOpacity->setValue(config->readNumEntry("ActiveWindowOpacity",100)); inactiveWindowOpacity->setValue(config->readNumEntry("InactiveWindowOpacity",75)); movingWindowOpacity->setValue(config->readNumEntry("MovingWindowOpacity",25)); dockWindowOpacity->setValue(config->readNumEntry("DockOpacity",80)); int ass, iss, dss, mss; dss = config->readNumEntry("DockShadowSize", 0*100); mss = config->readNumEntry("MenuShadowSize", 1*100); ass = config->readNumEntry("ActiveWindowShadowSize", 2*100); iss = config->readNumEntry("InactiveWindowShadowSize", 1*100); activeWindowOpacity->setEnabled(activeWindowTransparency->isChecked()); inactiveWindowOpacity->setEnabled(inactiveWindowTransparency->isChecked()); movingWindowOpacity->setEnabled(movingWindowTransparency->isChecked()); dockWindowOpacity->setEnabled(dockWindowTransparency->isChecked()); TDEConfig conf_(TQDir::homeDirPath() + "/.xcompmgrrc"); conf_.setGroup("xcompmgr"); disableARGB->setChecked(conf_.readBoolEntry("DisableARGB",FALSE)); useOpenGL->setChecked(conf_.readBoolEntry("useOpenGL",FALSE)); blurBackground->setChecked(conf_.readBoolEntry("blurBackground",FALSE)); blurBackground->setEnabled(useOpenGL->isChecked()); greyscaleBackground->setChecked(conf_.readBoolEntry("greyscaleBackground",FALSE)); greyscaleBackground->setEnabled(useOpenGL->isChecked()); useShadows->setChecked(conf_.readEntry("Compmode","").compare("CompClientShadows") == 0); useShadowsOnMenuWindows->setChecked(conf_.readBoolEntry("ShadowsOnMenuWindows",TRUE)); useShadowsOnToolTipWindows->setChecked(conf_.readBoolEntry("ShadowsOnToolTipWindows",TRUE)); useShadowsOnDockWindows->setChecked(conf_.readBoolEntry("ShadowsOnDockWindows",FALSE)); shadowTopOffset->setValue(-1*(conf_.readNumEntry("ShadowOffsetY",0))); shadowLeftOffset->setValue(-1*(conf_.readNumEntry("ShadowOffsetX",0))); int ss = conf_.readNumEntry("ShadowRadius",4); dockWindowShadowSize->setValue((int)(dss/100.0)); menuWindowShadowSize->setValue((int)(mss/100.0)); activeWindowShadowSize->setValue((int)(ass/100.0)); inactiveWindowShadowSize->setValue((int)(iss/100.0)); baseShadowSize->setValue((int)(ss)); TQString hex = conf_.readEntry("ShadowColor","#000000"); uint r, g, b; r = g = b = 256; if (sscanf(hex.latin1(), "0x%02x%02x%02x", &r, &g, &b)!=3 || r > 255 || g > 255 || b > 255) shadowColor->setColor(TQt::black); else shadowColor->setColor(TQColor(r,g,b)); fadeInWindows->setChecked(conf_.readBoolEntry("FadeWindows",FALSE)); fadeInMenuWindows->setChecked(conf_.readBoolEntry("FadeMenuWindows",TRUE)); fadeInToolTipWindows->setChecked(conf_.readBoolEntry("FadeToolTipWindows",TRUE)); fadeOnOpacityChange->setChecked(conf_.readBoolEntry("FadeTrans",FALSE)); fadeInSpeed->setValue((int)(conf_.readDoubleNumEntry("FadeInStep",0.070)*1000.0)); fadeOutSpeed->setValue((int)(conf_.readDoubleNumEntry("FadeOutStep",0.070)*1000.0)); emit TDECModule::changed(false); } void KTranslucencyConfig::save( void ) { if (!kompmgrAvailable_) return; config->setGroup( "Notification Messages" ); config->writeEntry("UseTranslucency",useTranslucency->isChecked()); config->setGroup( "Translucency" ); config->writeEntry("TranslucentActiveWindows",activeWindowTransparency->isChecked()); config->writeEntry("TranslucentInactiveWindows",inactiveWindowTransparency->isChecked()); config->writeEntry("TranslucentMovingWindows",movingWindowTransparency->isChecked()); config->writeEntry("TranslucentDocks",dockWindowTransparency->isChecked()); config->writeEntry("TreatKeepAboveAsActive",keepAboveAsActive->isChecked()); config->writeEntry("ActiveWindowOpacity",activeWindowOpacity->value()); config->writeEntry("InactiveWindowOpacity",inactiveWindowOpacity->value()); config->writeEntry("MovingWindowOpacity",movingWindowOpacity->value()); config->writeEntry("DockOpacity",dockWindowOpacity->value()); // for simplification: // xcompmgr supports a general shadow radius and additionally lets external apps set a multiplicator for each window // (speed reasons, so the shadow matrix hasn't to be recreated for every window) // we set inactive windows to 100%, the radius to the inactive window value and adjust the multiplicators for docks and active windows // this way the user can set the three values without caring about the radius/multiplicator stuff // additionally we find a value between big and small values to have a more smooth appereance config->writeEntry("DockShadowSize",(int)(100.0 * dockWindowShadowSize->value())); config->writeEntry("MenuShadowSize",(int)(100.0 * menuWindowShadowSize->value())); config->writeEntry("ActiveWindowShadowSize",(int)(100.0 * activeWindowShadowSize->value())); config->writeEntry("InactiveWindowShadowSize",(int)(100.0 * inactiveWindowShadowSize->value())); config->writeEntry("RemoveShadowsOnMove",removeShadowsOnMove->isChecked()); config->writeEntry("RemoveShadowsOnResize",removeShadowsOnResize->isChecked()); config->writeEntry("OnlyDecoTranslucent", onlyDecoTranslucent->isChecked()); config->writeEntry("ResetKompmgr",resetKompmgr_); TDEConfig *conf_ = new TDEConfig(TQDir::homeDirPath() + "/.xcompmgrrc"); conf_->setGroup("xcompmgr"); conf_->writeEntry("Compmode",useShadows->isChecked()?"CompClientShadows":""); conf_->writeEntry("ShadowsOnMenuWindows",useShadowsOnMenuWindows->isChecked()); conf_->writeEntry("ShadowsOnToolTipWindows",useShadowsOnToolTipWindows->isChecked()); conf_->writeEntry("ShadowsOnDockWindows",useShadowsOnDockWindows->isChecked()); conf_->writeEntry("DisableARGB",disableARGB->isChecked()); conf_->writeEntry("useOpenGL",useOpenGL->isChecked()); conf_->writeEntry("blurBackground",blurBackground->isChecked()); conf_->writeEntry("greyscaleBackground",greyscaleBackground->isChecked()); conf_->writeEntry("ShadowOffsetY",-1*shadowTopOffset->value()); conf_->writeEntry("ShadowOffsetX",-1*shadowLeftOffset->value()); int r, g, b; shadowColor->color().rgb( &r, &g, &b ); TQString hex; hex.sprintf("0x%02X%02X%02X", r,g,b); conf_->writeEntry("ShadowColor",hex); conf_->writeEntry("ShadowRadius",baseShadowSize->value()); conf_->writeEntry("FadeWindows",fadeInWindows->isChecked()); conf_->writeEntry("FadeMenuWindows",fadeInMenuWindows->isChecked()); conf_->writeEntry("FadeToolTipWindows",fadeInToolTipWindows->isChecked()); conf_->writeEntry("FadeTrans",fadeOnOpacityChange->isChecked()); conf_->writeEntry("FadeInStep",fadeInSpeed->value()/1000.0); conf_->writeEntry("FadeOutStep",fadeOutSpeed->value()/1000.0); delete conf_; // Now write out compton settings TQFile* compton_conf_file_ = new TQFile(TQDir::homeDirPath() + "/.compton-tde.conf"); if ( compton_conf_file_->open( IO_WriteOnly ) ) { TQTextStream stream(compton_conf_file_); stream << "# WARNING\n"; stream << "# This file was automatically generated by TDE\n"; stream << "# All changes will be lost!\n"; stream << "shadow = " << (useShadows->isChecked()?"true":"false") << ";\n"; stream << "shadow-offset-y = " << (-1*shadowTopOffset->value()) << ";\n"; stream << "shadow-offset-x = " << (-1*shadowLeftOffset->value()) << ";\n"; int r, g, b; shadowColor->color().rgb( &r, &g, &b ); stream << "shadow-red = " << (r/255.0) << ";\n"; stream << "shadow-green = " << (g/255.0) << ";\n"; stream << "shadow-blue = " << (b/255.0) << ";\n"; stream << "shadow-radius = " << baseShadowSize->value() << ";\n"; bool fadeOpacity = fadeOnOpacityChange->isChecked(); bool fadeWindows = fadeInWindows->isChecked(); bool fadeMenuWindows = fadeInMenuWindows->isChecked(); bool fadeToolTipWindows = fadeInToolTipWindows->isChecked(); bool shadows = useShadows->isChecked(); bool shadowsOnMenuWindows = useShadowsOnMenuWindows->isChecked(); bool shadowsOnToolTipWindows = useShadowsOnToolTipWindows->isChecked(); bool shadowsOnDockWindows = useShadowsOnDockWindows->isChecked(); stream << "fading = " << ((fadeWindows || fadeMenuWindows || fadeOpacity)?"true":"false") << ";\n"; stream << "no-fading-opacitychange = " << (fadeOpacity?"false":"true") << ";\n"; stream << "no-fading-openclose = " << ((fadeWindows||fadeMenuWindows)?"false":"true") << ";\n"; stream << "wintypes:" << "\n"; stream << "{" << "\n"; stream << " menu = { shadow = " << (shadowsOnMenuWindows?"true":"false") << "; fade = " << (fadeMenuWindows?"true":"false") << "; no-fading-openclose = " << (fadeMenuWindows?"false":"true") << "; };" << "\n"; stream << " dropdown_menu = { shadow = " << (shadowsOnMenuWindows?"true":"false") << "; fade = " << (fadeMenuWindows?"true":"false") << "; no-fading-openclose = " << (fadeMenuWindows?"false":"true") << "; };" << "\n"; stream << " popup_menu = { shadow = " << (shadowsOnMenuWindows?"true":"false") << "; fade = " << (fadeMenuWindows?"true":"false") << "; no-fading-openclose = " << (fadeMenuWindows?"false":"true") << "; };" << "\n"; stream << " tooltip = { shadow = " << (shadowsOnToolTipWindows?"true":"false") << "; fade = " << (fadeToolTipWindows?"true":"false") << "; no-fading-openclose = " << (fadeToolTipWindows?"false":"true") << "; };" << "\n"; stream << " normal = { shadow = " << (shadows?"true":"false") << "; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " dialog = { shadow = " << (shadows?"true":"false") << "; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " unknown = { shadow = " << (shadows?"true":"false") << "; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " toolbar = { shadow = " << (shadows?"true":"false") << "; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " utility = { shadow = " << (shadows?"true":"false") << "; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " splash = { shadow = " << (shadows?"true":"false") << "; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " notify = { shadow = false; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " combo = { shadow = false; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " desktop = { shadow = false; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " dnd = { shadow = false; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << " dock = { shadow = " << (shadowsOnDockWindows?"true":"false") << "; fade = " << (fadeWindows?"true":"false") << "; no-fading-openclose = " << (fadeWindows?"false":"true") << "; };" << "\n"; stream << "};" << "\n"; stream << "fade-in-step = " << (fadeInSpeed->value()/1000.0) << ";\n"; stream << "fade-out-step = " << (fadeOutSpeed->value()/1000.0) << ";\n"; stream << "backend = \"" << (useOpenGL->isChecked()?"glx":"xrender") << "\";\n"; stream << "vsync = \"" << (useOpenGL->isChecked()?"opengl":"none") << "\";\n"; stream << "blur-background = " << ((blurBackground->isChecked() && useOpenGL->isChecked())?"true":"false") << ";\n"; stream << "blur-background-fixed = true;\n"; stream << "blur-background-exclude = [\n"; stream << " \"window_type = 'dock'\",\n"; stream << " \"window_type = 'desktop'\"\n"; stream << "];\n"; stream << "greyscale-background = " << ((greyscaleBackground->isChecked() && useOpenGL->isChecked())?"true":"false") << ";\n"; // Global settings stream << "no-dock-shadow = " << (shadowsOnDockWindows?"false":"true") << ";\n"; stream << "no-dnd-shadow = true;\n"; stream << "clear-shadow = true;\n"; stream << "shadow-ignore-shaped = false;\n"; // Features not currently supported by compton // stream << "DisableARGB = " << (disableARGB->isChecked()?"true":"false") << ";\n"; compton_conf_file_->close(); } delete compton_conf_file_; if (standAlone) { config->sync(); if ( !kapp->dcopClient()->isAttached() ) kapp->dcopClient()->attach(); kapp->dcopClient()->send("twin*", "", "reconfigure()", TQString("")); } if (useTranslucency->isChecked()) startKompmgr(); else stopKompmgr(); emit TDECModule::changed(false); } void KTranslucencyConfig::defaults() { if (!kompmgrAvailable_) return; useTranslucency->setChecked(false); onlyDecoTranslucent->setChecked(false); activeWindowTransparency->setChecked(false); inactiveWindowTransparency->setChecked(false); movingWindowTransparency->setChecked(false); dockWindowTransparency->setChecked(false); keepAboveAsActive->setChecked(true); disableARGB->setChecked(false); activeWindowOpacity->setValue(100); inactiveWindowOpacity->setValue(75); movingWindowOpacity->setValue(25); dockWindowOpacity->setValue(80); dockWindowShadowSize->setValue(0); menuWindowShadowSize->setValue(1); activeWindowShadowSize->setValue(2); inactiveWindowShadowSize->setValue(1); baseShadowSize->setValue(4); shadowTopOffset->setValue(0); shadowLeftOffset->setValue(0); activeWindowOpacity->setEnabled(false); inactiveWindowOpacity->setEnabled(false); movingWindowOpacity->setEnabled(false); dockWindowOpacity->setEnabled(false); useShadows->setChecked(FALSE); useShadowsOnMenuWindows->setChecked(TRUE); useShadowsOnToolTipWindows->setChecked(TRUE); useShadowsOnDockWindows->setChecked(FALSE); removeShadowsOnMove->setChecked(FALSE); removeShadowsOnResize->setChecked(FALSE); shadowColor->setColor(TQt::black); fadeInWindows->setChecked(FALSE); fadeInMenuWindows->setChecked(TRUE); fadeInToolTipWindows->setChecked(TRUE); fadeOnOpacityChange->setChecked(FALSE); fadeInSpeed->setValue(70); fadeOutSpeed->setValue(70); emit TDECModule::changed(true); } bool KTranslucencyConfig::kompmgrAvailable() { bool ret; TDEProcess proc; proc << TDECompositor << "-v"; ret = proc.start(TDEProcess::DontCare, TDEProcess::AllOutput); proc.detach(); return ret; } void KTranslucencyConfig::startKompmgr() { kapp->dcopClient()->send("twin*", "", "startKompmgr()", TQString("")); } void KTranslucencyConfig::stopKompmgr() { kapp->dcopClient()->send("twin*", "", "stopKompmgr()", TQString("")); } void KTranslucencyConfig::showWarning(bool alphaActivated) { // if (alphaActivated) // KMessageBox::information(this, i18n("Translucency support is new and may cause problems
including crashes (sometimes the translucency engine, seldom even X).
"), i18n("Warning")); } #include "windows.moc"