diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 4aed2c8219774f5d797760606b8489a92ddc5163 (patch) | |
tree | 3f8c130f7d269626bf6a9447407ef6c35954426a /kwin/kcmkwin/kwinrules | |
download | tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kwin/kcmkwin/kwinrules')
-rw-r--r-- | kwin/kcmkwin/kwinrules/Makefile.am | 29 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/detectwidget.cpp | 223 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/detectwidget.h | 86 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/detectwidgetbase.ui | 218 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/editshortcutbase.ui | 164 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/kcm.cpp | 103 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/kcm.h | 53 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/kwinrules.desktop | 209 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/kwinsrc.cpp | 8 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/main.cpp | 294 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/ruleslist.cpp | 200 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/ruleslist.h | 59 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/ruleslistbase.ui | 91 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/ruleswidget.cpp | 803 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/ruleswidget.h | 148 | ||||
-rw-r--r-- | kwin/kcmkwin/kwinrules/ruleswidgetbase.ui | 2597 |
16 files changed, 5285 insertions, 0 deletions
diff --git a/kwin/kcmkwin/kwinrules/Makefile.am b/kwin/kcmkwin/kwinrules/Makefile.am new file mode 100644 index 000000000..18aef9ccd --- /dev/null +++ b/kwin/kcmkwin/kwinrules/Makefile.am @@ -0,0 +1,29 @@ +METASOURCES = AUTO +AM_CPPFLAGS = $(all_includes) -DKCMRULES +INCLUDES = -I$(top_srcdir)/kwin/lib + +bin_PROGRAMS = +lib_LTLIBRARIES = +kdeinit_LTLIBRARIES = kwin_rules_dialog.la +kde_module_LTLIBRARIES = kcm_kwinrules.la +noinst_LTLIBRARIES = libkwinrules.la + +libkwinrules_la_SOURCES = ruleswidget.cpp ruleslist.cpp kwinsrc.cpp detectwidget.cpp \ + ruleswidgetbase.ui ruleslistbase.ui detectwidgetbase.ui editshortcutbase.ui +libkwinrules_la_LDFLAGS = $(all_libraries) -no-undefined +libkwinrules_la_LIBADD = $(LIB_KDEUI) + +kcm_kwinrules_la_SOURCES = kcm.cpp +kcm_kwinrules_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined +kcm_kwinrules_la_LIBADD = libkwinrules.la +kcm_kwinrules_la_COMPILE_FIRST = ruleslistbase.h ruleswidgetbase.h editshortcutbase.h + +kwin_rules_dialog_la_SOURCES = main.cpp +kwin_rules_dialog_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined +kwin_rules_dialog_la_LIBADD = libkwinrules.la +kwin_rules_dialog_la_COMPILE_FIRST = ruleslistbase.h ruleswidgetbase.h editshortcutbase.h + +messages: rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/kcmkwinrules.pot + +xdg_apps_DATA = kwinrules.desktop diff --git a/kwin/kcmkwin/kwinrules/detectwidget.cpp b/kwin/kcmkwin/kwinrules/detectwidget.cpp new file mode 100644 index 000000000..1a8fa5af5 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/detectwidget.cpp @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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 "detectwidget.h" + +#include <kapplication.h> +#include <klocale.h> +#include <kdebug.h> +#include <kwin.h> +#include <qlabel.h> +#include <qradiobutton.h> +#include <qcheckbox.h> + +#include <X11/Xlib.h> +#include <X11/Xatom.h> +#include <X11/Xutil.h> +#include <fixx11h.h> + +namespace KWinInternal +{ + +DetectWidget::DetectWidget( QWidget* parent, const char* name ) +: DetectWidgetBase( parent, name ) + { + } + +DetectDialog::DetectDialog( QWidget* parent, const char* name ) +: KDialogBase( parent, name, true, "", Ok | Cancel ) +, grabber( NULL ) + { + widget = new DetectWidget( this ); + setMainWidget( widget ); + } + +void DetectDialog::detect( WId window ) + { + if( window == 0 ) + selectWindow(); + else + readWindow( window ); + } + +void DetectDialog::readWindow( WId w ) + { + if( w == 0 ) + { + emit detectionDone( false ); + return; + } + info = KWin::windowInfo( w, -1U, -1U ); // read everything + if( !info.valid()) + { + emit detectionDone( false ); + return; + } + wmclass_class = info.windowClassClass(); + wmclass_name = info.windowClassName(); + role = info.windowRole(); + type = info.windowType( NET::NormalMask | NET::DesktopMask | NET::DockMask + | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask + | NET::UtilityMask | NET::SplashMask ); + title = info.name(); + extrarole = ""; // TODO + machine = info.clientMachine(); + executeDialog(); + } + +void DetectDialog::executeDialog() + { + static const char* const types[] = + { + I18N_NOOP( "Normal Window" ), + I18N_NOOP( "Desktop" ), + I18N_NOOP( "Dock (panel)" ), + I18N_NOOP( "Toolbar" ), + I18N_NOOP( "Torn-Off Menu" ), + I18N_NOOP( "Dialog Window" ), + I18N_NOOP( "Override Type" ), + I18N_NOOP( "Standalone Menubar" ), + I18N_NOOP( "Utility Window" ), + I18N_NOOP( "Splash Screen" ) + }; + widget->class_label->setText( wmclass_class + " (" + wmclass_name + ' ' + wmclass_class + ")" ); + widget->role_label->setText( role ); + widget->use_role->setEnabled( !role.isEmpty()); + if( widget->use_role->isEnabled()) + widget->use_role->setChecked( true ); + else + widget->use_whole_class->setChecked( true ); + if( type == NET::Unknown ) + widget->type_label->setText( i18n( "Unknown - will be treated as Normal Window" )); + else + widget->type_label->setText( i18n( types[ type ] )); + widget->title_label->setText( title ); + widget->extrarole_label->setText( extrarole ); + widget->machine_label->setText( machine ); + emit detectionDone( exec() == QDialog::Accepted ); + } + +QCString DetectDialog::selectedClass() const + { + if( widget->use_class->isChecked() || widget->use_role->isChecked()) + return wmclass_class; + return wmclass_name + ' ' + wmclass_class; + } + +bool DetectDialog::selectedWholeClass() const + { + return widget->use_whole_class->isChecked(); + } + +QCString DetectDialog::selectedRole() const + { + if( widget->use_role->isChecked()) + return role; + return ""; + } + +QString DetectDialog::selectedTitle() const + { + return title; + } + +Rules::StringMatch DetectDialog::titleMatch() const + { + return widget->match_title->isChecked() ? Rules::ExactMatch : Rules::UnimportantMatch; + } + +bool DetectDialog::selectedWholeApp() const + { + return widget->use_class->isChecked(); + } + +NET::WindowType DetectDialog::selectedType() const + { + return type; + } + +QCString DetectDialog::selectedMachine() const + { + return machine; + } + +void DetectDialog::selectWindow() + { + // use a dialog, so that all user input is blocked + // use WX11BypassWM and moving away so that it's not actually visible + // grab only mouse, so that keyboard can be used e.g. for switching windows + grabber = new QDialog( NULL, NULL, true, WX11BypassWM ); + grabber->move( -1000, -1000 ); + grabber->show(); + grabber->grabMouse( crossCursor ); + grabber->installEventFilter( this ); + } + +bool DetectDialog::eventFilter( QObject* o, QEvent* e ) + { + if( o != grabber ) + return false; + if( e->type() != QEvent::MouseButtonRelease ) + return false; + delete grabber; + grabber = NULL; + if( static_cast< QMouseEvent* >( e )->button() != LeftButton ) + { + emit detectionDone( false ); + return true; + } + readWindow( findWindow()); + return true; + } + +WId DetectDialog::findWindow() + { + Window root; + Window child; + uint mask; + int rootX, rootY, x, y; + Window parent = qt_xrootwin(); + Atom wm_state = XInternAtom( qt_xdisplay(), "WM_STATE", False ); + for( int i = 0; + i < 10; + ++i ) + { + XQueryPointer( qt_xdisplay(), parent, &root, &child, + &rootX, &rootY, &x, &y, &mask ); + if( child == None ) + return 0; + Atom type; + int format; + unsigned long nitems, after; + unsigned char* prop; + if( XGetWindowProperty( qt_xdisplay(), child, wm_state, 0, 0, False, AnyPropertyType, + &type, &format, &nitems, &after, &prop ) == Success ) + { + if( prop != NULL ) + XFree( prop ); + if( type != None ) + return child; + } + parent = child; + } + return 0; + } + +} // namespace + +#include "detectwidget.moc" diff --git a/kwin/kcmkwin/kwinrules/detectwidget.h b/kwin/kcmkwin/kwinrules/detectwidget.h new file mode 100644 index 000000000..593f4e056 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/detectwidget.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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. + */ + + +#ifndef __DETECTWIDGET_H__ +#define __DETECTWIDGET_H__ + +#include "detectwidgetbase.h" + +#include <kdialogbase.h> +#include <kwin.h> + +#include "../../rules.h" + +namespace KWinInternal +{ + +class DetectWidget + : public DetectWidgetBase + { + Q_OBJECT + public: + DetectWidget( QWidget* parent = NULL, const char* name = NULL ); + }; + +class DetectDialog + : public KDialogBase + { + Q_OBJECT + public: + DetectDialog( QWidget* parent = NULL, const char* name = NULL ); + void detect( WId window ); + QCString selectedClass() const; + bool selectedWholeClass() const; + QCString selectedRole() const; + bool selectedWholeApp() const; + NET::WindowType selectedType() const; + QString selectedTitle() const; + Rules::StringMatch titleMatch() const; + QCString selectedMachine() const; + const KWin::WindowInfo& windowInfo() const; + signals: + void detectionDone( bool ); + protected: + virtual bool eventFilter( QObject* o, QEvent* e ); + private: + void selectWindow(); + void readWindow( WId window ); + void executeDialog(); + WId findWindow(); + QCString wmclass_class; + QCString wmclass_name; + QCString role; + NET::WindowType type; + QString title; + QCString extrarole; + QCString machine; + DetectWidget* widget; + QDialog* grabber; + KWin::WindowInfo info; + }; + +inline +const KWin::WindowInfo& DetectDialog::windowInfo() const + { + return info; + } + +} // namespace + +#endif diff --git a/kwin/kcmkwin/kwinrules/detectwidgetbase.ui b/kwin/kcmkwin/kwinrules/detectwidgetbase.ui new file mode 100644 index 000000000..31cae3ef3 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/detectwidgetbase.ui @@ -0,0 +1,218 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KWinInternal::DetectWidgetBase</class> +<widget class="QWidget"> + <property name="name"> + <cstring>Form3</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>523</width> + <height>325</height> + </rect> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <spacer row="9" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + <widget class="QLabel" row="6" column="0"> + <property name="name"> + <cstring>textLabel11</cstring> + </property> + <property name="text"> + <string>Extra role:</string> + </property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>Class:</string> + </property> + </widget> + <widget class="QLabel" row="3" column="0"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string>Role:</string> + </property> + </widget> + <widget class="QLabel" row="4" column="1"> + <property name="name"> + <cstring>type_label</cstring> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QLabel" row="5" column="0"> + <property name="name"> + <cstring>textLabel8</cstring> + </property> + <property name="text"> + <string>Title:</string> + </property> + </widget> + <widget class="QLabel" row="2" column="1"> + <property name="name"> + <cstring>class_label</cstring> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QLabel" row="3" column="1"> + <property name="name"> + <cstring>role_label</cstring> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QLabel" row="5" column="1"> + <property name="name"> + <cstring>title_label</cstring> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QLabel" row="7" column="1"> + <property name="name"> + <cstring>machine_label</cstring> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QLabel" row="4" column="0"> + <property name="name"> + <cstring>textLabel4</cstring> + </property> + <property name="text"> + <string>Type:</string> + </property> + </widget> + <widget class="QLabel" row="6" column="1"> + <property name="name"> + <cstring>extrarole_label</cstring> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QLabel" row="7" column="0"> + <property name="name"> + <cstring>textLabel13</cstring> + </property> + <property name="text"> + <string>Machine:</string> + </property> + </widget> + <widget class="Line" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>textLabel9</cstring> + </property> + <property name="text"> + <string>Information About Selected Window</string> + </property> + </widget> + <widget class="QButtonGroup" row="8" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>buttonGroup1</cstring> + </property> + <property name="title"> + <string></string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QRadioButton"> + <property name="name"> + <cstring>use_class</cstring> + </property> + <property name="text"> + <string>Use window &class (whole application)</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>For selecting all windows belonging to a specific application, selecting only window class should usually work.</string> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>use_role</cstring> + </property> + <property name="text"> + <string>Use window class and window &role (specific window)</string> + </property> + <property name="whatsThis" stdset="0"> + <string>For selecting a specific window in an application, both window class and window role should be selected. Window class will determine the application, and window role the specific window in the application; many applications do not provide useful window roles though.</string> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>use_whole_class</cstring> + </property> + <property name="text"> + <string>Use &whole window class (specific window)</string> + </property> + <property name="whatsThis" stdset="0"> + <string>With some (non-KDE) applications whole window class can be sufficient for selecting a specific window in an application, as they set whole window class to contain both application and window role.</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>match_title</cstring> + </property> + <property name="text"> + <string>Match also window &title</string> + </property> + </widget> + </vbox> + </widget> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/> +</UI> diff --git a/kwin/kcmkwin/kwinrules/editshortcutbase.ui b/kwin/kcmkwin/kwinrules/editshortcutbase.ui new file mode 100644 index 000000000..3813ae589 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/editshortcutbase.ui @@ -0,0 +1,164 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>EditShortcutBase</class> +<widget class="QWidget"> + <property name="name"> + <cstring>EditShortcutBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>587</width> + <height>402</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>A single shortcut can be easily assigned or cleared using the two buttons. Only shortcuts with modifiers can be used.<p> +It is possible to have several possible shortcuts, and the first available shortcut will be used. The shortcuts are specified using space-separated shortcut sets. One set is specified as <i>base</i>+(<i>list</i>), where base are modifiers and list is a list of keys.<br> +For example "<b>Shift+Alt+(123) Shift+Ctrl+(ABC)</b>" will first try <b>Shift+Alt+1</b>, then others with <b>Shift+Ctrl+C</b> as the last one.</string> + </property> + <property name="textFormat"> + <enum>RichText</enum> + </property> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="KLineEdit"> + <property name="name"> + <cstring>shortcut</cstring> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>pushButton1</cstring> + </property> + <property name="text"> + <string>&Single Shortcut</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>pushButton2</cstring> + </property> + <property name="text"> + <string>C&lear</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line2</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>pushButton1</sender> + <signal>clicked()</signal> + <receiver>EditShortcutBase</receiver> + <slot>editShortcut()</slot> + </connection> + <connection> + <sender>pushButton2</sender> + <signal>clicked()</signal> + <receiver>EditShortcutBase</receiver> + <slot>clearShortcut()</slot> + </connection> +</connections> +<slots> + <slot access="protected" specifier="pure virtual">editShortcut()</slot> + <slot access="protected" specifier="pure virtual">clearShortcut()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/> +</UI> diff --git a/kwin/kcmkwin/kwinrules/kcm.cpp b/kwin/kcmkwin/kwinrules/kcm.cpp new file mode 100644 index 000000000..b40cfa8b2 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/kcm.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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 "kcm.h" + +#include <kglobal.h> +#include <qlayout.h> +#include <klocale.h> +#include <kapplication.h> +#include <dcopclient.h> +#include <kaboutdata.h> + +#include "ruleslist.h" + +extern "C" + KDE_EXPORT KCModule *create_kwinrules( QWidget *parent, const char *name ) + { + //CT there's need for decision: kwm or kwin? + KGlobal::locale()->insertCatalogue( "kcmkwinrules" ); + return new KWinInternal::KCMRules( parent, name ); + } + +namespace KWinInternal +{ + +KCMRules::KCMRules( QWidget *parent, const char *name ) +: KCModule( parent, name ) +, config( "kwinrulesrc" ) + { + QVBoxLayout *layout = new QVBoxLayout( this ); + widget = new KCMRulesList( this ); + layout->addWidget( widget ); + connect( widget, SIGNAL( changed( bool )), SLOT( moduleChanged( bool ))); + KAboutData *about = new KAboutData(I18N_NOOP( "kcmkwinrules" ), + I18N_NOOP( "Window-Specific Settings Configuration Module" ), + 0, 0, KAboutData::License_GPL, I18N_NOOP( "(c) 2004 KWin and KControl Authors" )); + about->addAuthor("Lubos Lunak",0,"l.lunak@kde.org"); + setAboutData(about); + } + +void KCMRules::load() + { + config.reparseConfiguration(); + widget->load(); + emit KCModule::changed( false ); + } + +void KCMRules::save() + { + widget->save(); + emit KCModule::changed( false ); + // Send signal to kwin + config.sync(); + if( !kapp->dcopClient()->isAttached()) + kapp->dcopClient()->attach(); + kapp->dcopClient()->send("kwin*", "", "reconfigure()", ""); + } + +void KCMRules::defaults() + { + widget->defaults(); + } + +QString KCMRules::quickHelp() const + { + return i18n("<h1>Window-specific Settings</h1> Here you can customize window settings specifically only" + " for some windows." + " <p>Please note that this configuration will not take effect if you do not use" + " KWin as your window manager. If you do use a different window manager, please refer to its documentation" + " for how to customize window behavior."); + } + +void KCMRules::moduleChanged( bool state ) + { + emit KCModule::changed( state ); + } + +} + +// i18n freeze :-/ +#if 0 +I18N_NOOP("Remember settings separately for every window") +I18N_NOOP("Show internal settings for remembering") +I18N_NOOP("Internal setting for remembering") +#endif + + +#include "kcm.moc" diff --git a/kwin/kcmkwin/kwinrules/kcm.h b/kwin/kcmkwin/kwinrules/kcm.h new file mode 100644 index 000000000..47fba75d2 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/kcm.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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. + */ + + +#ifndef __KCM_H__ +#define __KCM_H__ + +#include <kcmodule.h> +#include <kconfig.h> + +class KConfig; +class KAboutData; + +namespace KWinInternal +{ + +class KCMRulesList; + +class KCMRules + : public KCModule + { + Q_OBJECT + public: + KCMRules( QWidget *parent, const char *name ); + virtual void load(); + virtual void save(); + virtual void defaults(); + virtual QString quickHelp() const; + protected slots: + void moduleChanged( bool state ); + private: + KCMRulesList* widget; + KConfig config; + }; + +} // namespace + +#endif diff --git a/kwin/kcmkwin/kwinrules/kwinrules.desktop b/kwin/kcmkwin/kwinrules/kwinrules.desktop new file mode 100644 index 000000000..245994a8a --- /dev/null +++ b/kwin/kcmkwin/kwinrules/kwinrules.desktop @@ -0,0 +1,209 @@ +[Desktop Entry] +Icon=kcmkwm +Type=Application +Exec=kcmshell kwinrules +DocPath=kcontrol/windowmanagement/index.html + +X-KDE-ModuleType=Library +X-KDE-Library=kwinrules +X-KDE-FactoryName=kwinrules + +Name=Window-Specific Settings +Name[af]=Venser spesifike Instellings +Name[ar]=تعيينات خاصة بالنوافذ +Name[be]=Настаўленні для асобных вокнаў +Name[bg]=Специфични прозорци +Name[bn]=উইণ্ডো-প্রতি সেটিংস +Name[bs]=Postavke specifične za ovaj prozor +Name[ca]=Arranjament específic de finestra +Name[cs]=Specifická nastavení oken +Name[csb]=Nastôw specyficzny dlô òkna +Name[cy]=Gosodiadau sy'n Benodol i'r Ffenestr +Name[da]=Vinduesspecifik opsætning +Name[de]=Fensterspezifische Einstellungen +Name[el]=Ρυθμίσεις σχετικές με παράθυρα +Name[eo]=Apartafenestraj Agordoj +Name[es]=Preferencias específicas de la ventana +Name[et]=Akende seadistused +Name[eu]=Leihoen ezarpen espezifikoak +Name[fa]=تنظیمات مشخص پنجره +Name[fi]=Ikkunakohtaiset asetukset +Name[fr]=Paramètres spécifiques à la fenêtre +Name[fy]=Finsterspesifike ynstellings +Name[gl]=Opcións específicas da fiestra +Name[he]=הגדרות חלונות ספציפיות +Name[hi]=विशिष्ट-विंडो विन्यास +Name[hr]=Postavke za prozor +Name[hu]=Egyedi ablakbeállítások +Name[is]=Stillingar einstakra glugga +Name[it]=Impostazioni specifiche della finestra +Name[ja]=ウィンドウ固有の設定 +Name[ka]=ფანჯრის განსაკუთრებული პარამეტრები +Name[kk]=Терезенің ерекше параметрлері +Name[km]=ការកំណត់សម្រាប់បង្អួច +Name[ko]=창 지정 +Name[lt]=Nuo lango priklausantys nustatymai +Name[lv]=Specifiski logu parametri +Name[mk]=Поставувања по прозорец +Name[nb]=Innstillinger for vinduer +Name[nds]=Instellen för enkelte Finstern +Name[ne]=सञ्झ्याल निर्दिष्ट सेटिङ +Name[nl]=Vensterspecifieke instellingen +Name[nn]=Instillingar for vindauge +Name[pa]=ਝਰੋਖਾ-ਖਾਸ ਸਥਾਪਨ +Name[pl]=Ustawienia danego okna +Name[pt]=Opções Específicas da Janela +Name[pt_BR]=Configurações Específicas da Janela +Name[ro]=Setări specifice fereastră +Name[ru]=Особые параметры окна +Name[rw]=Amagenamiterere y'Idirishya-Ryihariye +Name[se]=Láseheivehusat +Name[sk]=Špecifické nastavenia okna +Name[sl]=Nastavitve glede na okno +Name[sr]=Посебне поставке за прозоре +Name[sr@Latn]=Posebne postavke za prozore +Name[sv]=Fönsterspecifika inställningar +Name[ta]=சாளர-குறிப்பிடும் அமைப்புகள் +Name[th]=ตั้งค่าเกี่ยวกับหน้าต่างโดยเฉพาะ +Name[tr]=Pencereye Özel Seçenekler +Name[tt]=Täräzägä-Bäyle Caylawlar +Name[uk]=Параметри для окремих вікон +Name[uz]=Oynaga oid moslamalar +Name[uz@cyrillic]=Ойнага оид мосламалар +Name[vi]=Thiết lập Danh riêng cho Cửa sổ +Name[wa]=Apontiaedjes specifikes a-z on purnea +Name[zh_CN]=特定窗口的设置 +Name[zh_TW]=特定視窗設定 + +Comment=Configure settings specifically for a window +Comment[af]=Stel spesifieke venster instellings op +Comment[ar]=إعداد التعيينات الخاصة بنافذة +Comment[be]=Настаўленні для кожнага вакна асабіста +Comment[bg]=Настройване на специфични особености за отделните прозорци +Comment[bn]=শুধুমাত্র এই বিশেষ উইণ্ডো-টির সেটিংস কনফিগার করুন +Comment[bs]=Podesite postavke specifične za ovaj prozor +Comment[ca]=Configura l'arranjament específicament per a una finestra +Comment[cs]=Nastavení specifická pro okno +Comment[csb]=Kònfigùracëjô nastôwów specyficznëch dlô wëbrónegò òkna +Comment[cy]=Ffurfweddu gosodiadau yn benodol ar gyfer ffenestr +Comment[da]=Indstil opsætning specifikt for et vindue +Comment[de]=Einstellungen für einzelne Fenster vornehmen +Comment[el]=Ρυθμίσεις σχετικές ειδικά με Ένα Παράθυρο +Comment[eo]=Agordi nur por tiu fenestro +Comment[es]=Configurar parámetros específicos de una ventana +Comment[et]=Spetsiaalselt akendega seotud seadistused +Comment[eu]=Konfiguratu leiho jakin baten ezarpenak +Comment[fa]=پیکربندی تنظیمات برای پنجره به طور ویژه +Comment[fi]=Muokkaa ikkunakohtaisia asetuksia +Comment[fr]=Configuration de paramètres spécifiques à une fenêtre +Comment[fy]=Hjir kinne jo ynstellings kieze spesifyk foar ien finster +Comment[ga]=Cumraigh na socruithe le haghaidh fuinneoige ar leith +Comment[gl]=Configuración das opcións específicas para unha fiestra +Comment[he]=קבע הגדרות לחלון מסוים +Comment[hi]=किसी खास विंडो के लिए विन्यास कॉन्फ़िगर करें +Comment[hr]=Konfiguriranje određenih postavki za prozor +Comment[hu]=Egy adott ablak beállításai +Comment[is]=Stillingar sem varða tiltekinn glugga +Comment[it]=Configura le impostazioni specifiche di una finestra +Comment[ja]=特定のウィンドウに固有の設定を行います +Comment[ka]=ფანჯრის განსაკუთრებული პარამეტრების კონფიგურაცია +Comment[kk]=Терезенің ерекше параметрлерін баптау +Comment[km]=កំណត់រចនាសម្ព័ន្ធការកំណត់ពិសេសសម្រាប់បង្អួចមួយ +Comment[ko]=창마다의 개별 설정 +Comment[lt]=Čia galite konfigūruoti konkretaus lango nustatymus +Comment[lv]=Konfigurē parametrus priekš speciāla loga +Comment[mk]=Конфигурирајте ги поставувањата за поодделни прозорци +Comment[mt]=Ikkonfigura setings li jistgħu itejbu l-veloċità ta' KDE +Comment[nb]=Innstillinger som er knyttet til et spesielt vindu +Comment[nds]=Instellen för enkelte Finstern +Comment[ne]=सञ्झ्यालका लागि निर्दिष्ट तरिकाले सेटिङ कन्फिगर गर्नुहोस् +Comment[nl]=Hier kunt u instellingen kiezen specifiek voor één venster +Comment[nn]=Innstillingar som er knytte til eitt særskilt vindauge +Comment[pa]=ਇੱਕ ਝਰੋਖੇ ਲਈ ਖਾਸ ਸਥਾਪਨ ਸੰਰਚਨਾ +Comment[pl]=Konfiguracja ustawień wybranego okna +Comment[pt]=Configura as opções especificamente para uma janela +Comment[pt_BR]=Configurações específicas para uma janela +Comment[ro]=Configurează setări specifice anumitor ferestre +Comment[ru]=Настройка особых параметров окна +Comment[rw]=Kuboneza Amagenamiterere mu buryo bwihariye bw'idirishya +Comment[se]=Heivehusat erenoamáš láse várás +Comment[sk]=Nastavenie pre jednotlivé okná +Comment[sl]=Nastavite možnosti glede na posamezno okno +Comment[sr]=Подешавање поставки посебно за прозор +Comment[sr@Latn]=Podešavanje postavki posebno za prozor +Comment[sv]=Anpassa inställningar specifikt för ett fönster +Comment[ta]=KDE செயல்திறனை அதிகப்படுத்தும் அமைப்புகளை அமை +Comment[th]=ปรับแต่งค่าต่างๆ ที่เกี่ยวกับหน้าต่างโดยเฉพาะ +Comment[tr]=Bir pencere için özel olan seçenekleri yapılandır +Comment[tt]=Täräzä öçen ayırım caylawlar +Comment[uk]=Налаштування параметрів для окремого типу вікон +Comment[uz]=Oynaga oid boʻlgan moslamalarni moslash +Comment[uz@cyrillic]=Ойнага оид бўлган мосламаларни мослаш +Comment[vi]=Thiết lập cài đặt dành riêng cho cửa sổ +Comment[wa]=Apontiaedjes specifikes po-z on purnea +Comment[zh_CN]=配置一个窗口的设置 +Comment[zh_TW]=設定特定視窗設定值 + +Keywords=size,position,state,window behavior,windows,specific,workarounds,remember,rules +Keywords[ar]=القياس,الموضع,الحالة,سلوك النافذة,نوافذ,خاص,تدكر,قواعد,معاملات +Keywords[be]=Памер,Пазіцыя,Стан,Паводзіны акна,Вокны,Акно,Спецыфічныя,Запомніць,Правілы,size,position,state,window behavior,windows,specific,workarounds,remember,rules +Keywords[bg]=размер, позиция, състояние, прозорец, поведение,правила, запомняне,size,position,state,window behavior,windows,specific,workarounds,remember,rules +Keywords[bs]=size,position,state,window behavior,windows,specific,workarounds,remember,rules,veličina,položaj,ponašanje prozora,prozori,specifično,pravila +Keywords[ca]=mida,posició,estat,comportament de finestra,finestres,específic,reparacions,recorda,regles +Keywords[cs]=velikost,pozice,umístění,stav,chování oken,pravidla +Keywords[csb]=miara,pòłożenié,stón,ùchòwanié òknół,òkna,spamiãtanié nastôwów,zapamiãtanié nastôwów,regle +Keywords[cy]=maint,lleoliad,cyflwr,ffenestr,ymddygiad,ffenestri,penodol,ffyrdd osgoi,cofio,rheolau +Keywords[da]=størrelse,position,tilstand,vinduesopførsel,vinduer,specifik, omgåelse,husk,regler +Keywords[de]=Größe,Position,Status,Fensterverhalten,Fenster,Regeln +Keywords[el]=μέγεθος,θέση,κατάσταση,συμπεριφορά παραθύρου,παράθυρα,ειδικές,λύσεις,αποθήκευση,κανόνων +Keywords[en_GB]=size,position,state,window behaviour,windows,specific,workarounds,remember,rules +Keywords[eo]=grandeco,pozicio,stato,fenestra konduto,fenestroj,reguloj +Keywords[es]=tamaño,posición,estado,comportamiento de la ventana,ventanas,específico,soluciones,recordar,reglas +Keywords[et]=suurus,asend,olek,akna käitumine,aknad,spetsiaalne,kohandamine,reeglid +Keywords[eu]=neurria,kokapena,egoera,leihoaren portaera,leihoak,espezifikoa,konponbideak,gogoratu,arauak +Keywords[fa]=اندازه، موقعیت، وضعیت، رفتار پنجره، پنجرهها، مشخص، workarounds، یادآوری، قواعد +Keywords[fi]=koko,sijainti,tila,ikkunan käyttäytyminen,ikkunat,ikkunakohtainen,säännöt +Keywords[fr]=taille,position,état,comportement de fenêtre,fenêtres,spécifique,astuces,souvenir,règles +Keywords[fy]=grootte,grutte,positie,posysje,venstergedrag,finstergedrach,vensters,finsters,specifiek,spesifyk,alternatieven,alternativen,onthouden,ûnthâlde,regels +Keywords[ga]=méid,ionad,staid,oibriú na bhfuinneog,fuinneoga,sainiúil,réitigh seiftithe,meabhraigh,rialacha +Keywords[gl]=tamaño,posición,estado,comportamento da fiestra,fiestras,específico,lembrar,reglas +Keywords[he]=גודל, מיקום, מצב, חלון, התנהגות, חלונות, אישית, זכור, חוקים, size,position,state,window behavior,windows,specific,workarounds,remember,rules +Keywords[hi]=आकार,स्थान,स्थिति,विंडो व्यवहार,विंडोज़,विशिष्ट,कार्य-विकल्प,याददाश्त,नियम +Keywords[hr]=size,position,state,window behavior,windows,specific,workarounds,remember,rules,veličina,položaj,smještaj,stanje,ponašanje prozora,prozori,rješenja,zapamti,upamti,pravila +Keywords[hu]=méret,pozíció,állapot,ablakműködés,ablakok,specifikus,megjegyzés,szabályok +Keywords[id]=ukuran,posisi,status,perilaku jendela,jendela, spesifik,solusi,remember,aturan +Keywords[it]=dimensione,posizione,stato,comportamento finestra,finestre,specifico,ricorda,regole +Keywords[ja]=サイズ,位置,状態,ウィンドウの挙動,windows,特定,ワークアラウンド,記憶,ルール +Keywords[km]=ទំហំ,ទីតាំង,សភាព,ឥរិយាបថបង្អួច បង្អួចs ជាក់លាក់c ចងចាំr ច្បាប់s +Keywords[lt]=size,position,state,window behavior,windows,specific,workarounds,remember,rules,dydis,pozicija,būsena,lango eelgesys,langai,atsiminti,taisyklės +Keywords[lv]=izmērs,novietojums,statuss,loga izturēšanās,logi,specifisks,apjājiens,atcerēties,noteikumi +Keywords[mk]=size,position,state,window behavior,windows,specific,workarounds,remember,rules,големина,позиција,состојба,однесување на прозорец,специфично,заобиколни +Keywords[mt]=size,position,state,window behavior,windows,specific,workarounds,remember,rules,daqs +Keywords[nb]=størrelse,posisjon,status,vindusoppførsel,vinduer,spesifikk,jukseløsninger,husk,regler +Keywords[nds]=Grött,Positschoon,Status,Finsterbedregen,Finstern,enkel,enkelte,Regeln,behollen,workaround +Keywords[ne]=साइज, स्थिति, अवस्था, सञ्झ्याल व्यवहार, सञ्झ्यालहरू, निर्दिष्ट, कार्यक्षेत्र, याद गर्नुहोस्, नियम +Keywords[nl]=grootte,positie,venstergedrag,vensters,specifiek,alternatieven,onthouden,regels +Keywords[nn]=storleik,plassering,tilstand,vindaugsåtferd,vindauge,spesifikk,jukseløysingar,hugs,reglar +Keywords[pa]=ਅਕਾਰ,ਸਥਿਤੀ,ਝਰੋਖਾ ਵਿਵਹਾਰ,ਝਰੋਖੇ,ਖਾਸ,ਯਾਦ ਰੱਖੋ,ਨਿਯਮ +Keywords[pl]=rozmiar,położenie,stan,zachowanie okien,okna,zapamiętywanie ustawień,reguły +Keywords[pt]=tamanho,posição,estado,comportamento da janela,janelas,específico,recordar,regras +Keywords[pt_BR]=tamanho,posição, estado, comportamento da janela, janelas, específica, elementos, lembrar, regras +Keywords[ro]=mărime,poziție,stare,comportament fereastră,ferestre,specific,reguli +Keywords[rw]=Ingano,Ibirindiro,leta, imyitwarire y'idirishya,amadirishya,byihariye, amakorahafi,kwibuka,amategeko +Keywords[se]=sturrodat,sajádat,dilli,láseláhtten,láset,erenoamáš,fillenčovdosat,muitte,njuolggadusat +Keywords[sk]=veľkosť,pozícia,stav,správanie okna,okná,špecifické,jedno okno,opravy,pravidlá +Keywords[sl]=velikost,položaj,stanje,obnašanje okna,okna,posebno,obvoz,zapomni,pravila +Keywords[sr]=величина,позиција,стање,понашање прозора,прозори,запамти,правила +Keywords[sr@Latn]=veličina,pozicija,stanje,ponašanje prozora,prozori,zapamti,pravila +Keywords[sv]=storlek,position,tillstånd,fönsterbeteende,fönster,specifik,komma runt,komma ihåg,regler +Keywords[ta]=அளவு,நிலை,மாநிலம்,சாளர நடத்தை,சாளரங்கள்,குறிப்பிட்ட,பணிவட்டாரங்கள்,விதிகள் +Keywords[th]=ขนาด,ตำแหน่ง,สถานะ,พฤติกรรมหน้าต่าง,หน้าต่าง,โดยเฉพาะ,หารอบๆ,จำ,กฎ +Keywords[tr]=boyut,yer,pozisyon,durum,pencere davranışı,pencereler,özel,çalışma alanı,hatırla,kurallar +Keywords[uk]=розмір,позиція,стан,поведінка вікна,вікна,окремі,підігнати,запам'ятати,правила +Keywords[uz]=oʻlcham,joy,holat,oynaning xususiyatlari,oynalar,maxsus,eslab qolish,qoidalar +Keywords[uz@cyrillic]=ўлчам,жой,ҳолат,ойнанинг хусусиятлари,ойналар,махсус,эслаб қолиш,қоидалар +Keywords[vi]=kích cỡ,vị trí,trạng thái,ứng xử cửa sổ,cửa sổ,dành riêng,cách chữa chạy,nhớ,quy tắc +Keywords[wa]=grandeu,plaece,estat,estance,dujhance des purneas,purneas,specifike,workarounds,remember,rîles,sovni,sovnance +Keywords[zh_CN]=size,position,state,window behavior,windows,specific,workarounds,remember,rules,大小,位置,状态,窗口行为,窗口,特定,工作区,记住,规则 +Keywords[zh_TW]=size,position,state,window behavior,windows,specific,workarounds,remember,rules,大小,位置,狀態,視窗行為,視窗,指定,記憶,規則 +Categories=Qt;KDE;X-KDE-settings-desktop; diff --git a/kwin/kcmkwin/kwinrules/kwinsrc.cpp b/kwin/kcmkwin/kwinrules/kwinsrc.cpp new file mode 100644 index 000000000..38f48e003 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/kwinsrc.cpp @@ -0,0 +1,8 @@ +// Include some code from kwin core in order to avoid +// double implementation. + +#include "ruleslist.h" +#include "../../rules.cpp" +#include "../../placement.cpp" +#include "../../options.cpp" +#include "../../utils.cpp" diff --git a/kwin/kcmkwin/kwinrules/main.cpp b/kwin/kcmkwin/kwinrules/main.cpp new file mode 100644 index 000000000..9657e3649 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/main.cpp @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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 <kcmdlineargs.h> +#include <kapplication.h> +#include <dcopclient.h> +#include <kconfig.h> +#include <klocale.h> +#include <kwin.h> + +#include <X11/Xlib.h> +#include <fixx11h.h> + +#include "ruleswidget.h" +#include "../../rules.h" + +namespace KWinInternal +{ + +static void loadRules( QValueList< Rules* >& rules ) + { + KConfig cfg( "kwinrulesrc", true ); + cfg.setGroup( "General" ); + int count = cfg.readNumEntry( "count" ); + for( int i = 1; + i <= count; + ++i ) + { + cfg.setGroup( QString::number( i )); + Rules* rule = new Rules( cfg ); + rules.append( rule ); + } + } + +static void saveRules( const QValueList< Rules* >& rules ) + { + KConfig cfg( "kwinrulesrc" ); + QStringList groups = cfg.groupList(); + for( QStringList::ConstIterator it = groups.begin(); + it != groups.end(); + ++it ) + cfg.deleteGroup( *it ); + cfg.setGroup( "General" ); + cfg.writeEntry( "count", rules.count()); + int i = 1; + for( QValueList< Rules* >::ConstIterator it = rules.begin(); + it != rules.end(); + ++it ) + { + cfg.setGroup( QString::number( i )); + (*it)->write( cfg ); + ++i; + } + } + +static Rules* findRule( const QValueList< Rules* >& rules, Window wid, bool whole_app ) + { + KWin::WindowInfo info = KWin::windowInfo( wid, + NET::WMName | NET::WMWindowType, + NET::WM2WindowClass | NET::WM2WindowRole | NET::WM2ClientMachine ); + if( !info.valid()) // shouldn't really happen + return NULL; + QCString wmclass_class = info.windowClassClass().lower(); + QCString wmclass_name = info.windowClassName().lower(); + QCString role = info.windowRole().lower(); + NET::WindowType type = info.windowType( NET::NormalMask | NET::DesktopMask | NET::DockMask + | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask + | NET::UtilityMask | NET::SplashMask ); + QString title = info.name(); +// QCString extrarole = ""; // TODO + QCString machine = info.clientMachine().lower(); + Rules* best_match = NULL; + int match_quality = 0; + for( QValueList< Rules* >::ConstIterator it = rules.begin(); + it != rules.end(); + ++it ) + { + // try to find an exact match, i.e. not a generic rule + Rules* rule = *it; + int quality = 0; + bool generic = true; + if( rule->wmclassmatch != Rules::ExactMatch ) + continue; // too generic + if( !rule->matchWMClass( wmclass_class, wmclass_name )) + continue; + // from now on, it matches the app - now try to match for a specific window + if( rule->wmclasscomplete ) + { + quality += 1; + generic = false; // this can be considered specific enough (old X apps) + } + if( !whole_app ) + { + if( rule->windowrolematch != Rules::UnimportantMatch ) + { + quality += rule->windowrolematch == Rules::ExactMatch ? 5 : 1; + generic = false; + } + if( rule->titlematch != Rules::UnimportantMatch ) + { + quality += rule->titlematch == Rules::ExactMatch ? 3 : 1; + generic = false; + } + if( rule->types != NET::AllTypesMask ) + { + int bits = 0; + for( unsigned int bit = 1; + bit < 1U << 31; + bit <<= 1 ) + if( rule->types & bit ) + ++bits; + if( bits == 1 ) + quality += 2; + } + if( generic ) // ignore generic rules, use only the ones that are for this window + continue; + } + else + { + if( rule->types == NET::AllTypesMask ) + quality += 2; + } + if( !rule->matchType( type ) + || !rule->matchRole( role ) + || !rule->matchTitle( title ) + || !rule->matchClientMachine( machine )) + continue; + if( quality > match_quality ) + { + best_match = rule; + match_quality = quality; + } + } + if( best_match != NULL ) + return best_match; + Rules* ret = new Rules; + if( whole_app ) + { + ret->description = i18n( "Application settings for %1" ).arg( wmclass_class ); + // TODO maybe exclude some types? If yes, then also exclude them above + // when searching. + ret->types = NET::AllTypesMask; + ret->titlematch = Rules::UnimportantMatch; + ret->clientmachine = machine; // set, but make unimportant + ret->clientmachinematch = Rules::UnimportantMatch; + ret->extrarolematch = Rules::UnimportantMatch; + ret->windowrolematch = Rules::UnimportantMatch; + if( wmclass_name == wmclass_class ) + { + ret->wmclasscomplete = false; + ret->wmclass = wmclass_class; + ret->wmclassmatch = Rules::ExactMatch; + } + else + { + // WM_CLASS components differ - perhaps the app got -name argument + ret->wmclasscomplete = true; + ret->wmclass = wmclass_name + ' ' + wmclass_class; + ret->wmclassmatch = Rules::ExactMatch; + } + return ret; + } + ret->description = i18n( "Window settings for %1" ).arg( wmclass_class ); + if( type == NET::Unknown ) + ret->types = NET::NormalMask; + else + ret->types = 1 << type; // convert type to its mask + ret->title = title; // set, but make unimportant + ret->titlematch = Rules::UnimportantMatch; + ret->clientmachine = machine; // set, but make unimportant + ret->clientmachinematch = Rules::UnimportantMatch; +// ret->extrarole = extra; TODO + ret->extrarolematch = Rules::UnimportantMatch; + if( !role.isEmpty() + && role != "unknown" && role != "unnamed" ) // Qt sets this if not specified + { + ret->windowrole = role; + ret->windowrolematch = Rules::ExactMatch; + if( wmclass_name == wmclass_class ) + { + ret->wmclasscomplete = false; + ret->wmclass = wmclass_class; + ret->wmclassmatch = Rules::ExactMatch; + } + else + { + // WM_CLASS components differ - perhaps the app got -name argument + ret->wmclasscomplete = true; + ret->wmclass = wmclass_name + ' ' + wmclass_class; + ret->wmclassmatch = Rules::ExactMatch; + } + } + else // no role set + { + if( wmclass_name != wmclass_class ) + { + ret->wmclasscomplete = true; + ret->wmclass = wmclass_name + ' ' + wmclass_class; + ret->wmclassmatch = Rules::ExactMatch; + } + else + { + // This is a window that has no role set, and both components of WM_CLASS + // match (possibly only differing in case), which most likely means either + // the application doesn't give a damn about distinguishing its various + // windows, or it's an app that uses role for that, but this window + // lacks it for some reason. Use non-complete WM_CLASS matching, also + // include window title in the matching, and pray it causes many more positive + // matches than negative matches. + ret->titlematch = Rules::ExactMatch; + ret->wmclasscomplete = false; + ret->wmclass = wmclass_class; + ret->wmclassmatch = Rules::ExactMatch; + } + } + return ret; + } + +static int edit( Window wid, bool whole_app ) + { + QValueList< Rules* > rules; + loadRules( rules ); + Rules* orig_rule = findRule( rules, wid, whole_app ); + RulesDialog dlg; + // dlg.edit() creates new Rules instance if edited + Rules* edited_rule = dlg.edit( orig_rule, wid, true ); + if( edited_rule == NULL || edited_rule->isEmpty()) + { + rules.remove( orig_rule ); + delete orig_rule; + if( orig_rule != edited_rule ) + delete edited_rule; + } + else if( edited_rule != orig_rule ) + { + QValueList< Rules* >::Iterator pos = rules.find( orig_rule ); + if( pos != rules.end()) + *pos = edited_rule; + else + rules.prepend( edited_rule ); + delete orig_rule; + } + saveRules( rules ); + if( !kapp->dcopClient()->isAttached()) + kapp->dcopClient()->attach(); + kapp->dcopClient()->send("kwin*", "", "reconfigure()", ""); + return 0; + } + +} // namespace + +static const KCmdLineOptions options[] = + { + // no need for I18N_NOOP(), this is not supposed to be used directly + { "wid <wid>", "WId of the window for special window settings.", 0 }, + { "whole-app", "Whether the settings should affect all windows of the application.", 0 }, + KCmdLineLastOption + }; + +extern "C" +KDE_EXPORT int kdemain( int argc, char* argv[] ) + { + KLocale::setMainCatalogue( "kcmkwinrules" ); + KCmdLineArgs::init( argc, argv, "kwin_rules_dialog", I18N_NOOP( "KWin" ), + I18N_NOOP( "KWin helper utility" ), "1.0" ); + KCmdLineArgs::addCmdLineOptions( options ); + KApplication app; + KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); + bool id_ok = false; + Window id = args->getOption( "wid" ).toULong( &id_ok ); + bool whole_app = args->isSet( "whole-app" ); + args->clear(); + if( !id_ok || id == None ) + { + KCmdLineArgs::usage( i18n( "This helper utility is not supposed to be called directly." )); + return 1; + } + return KWinInternal::edit( id, whole_app ); + } diff --git a/kwin/kcmkwin/kwinrules/ruleslist.cpp b/kwin/kcmkwin/kwinrules/ruleslist.cpp new file mode 100644 index 000000000..f4704089f --- /dev/null +++ b/kwin/kcmkwin/kwinrules/ruleslist.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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 "ruleslist.h" + +#include <klistbox.h> +#include <kpushbutton.h> +#include <assert.h> +#include <kdebug.h> +#include <kconfig.h> + +#include "ruleswidget.h" + +namespace KWinInternal +{ + +KCMRulesList::KCMRulesList( QWidget* parent, const char* name ) +: KCMRulesListBase( parent, name ) + { + // connect both current/selected, so that current==selected (stupid QListBox :( ) + connect( rules_listbox, SIGNAL( currentChanged( QListBoxItem* )), + SLOT( activeChanged( QListBoxItem*))); + connect( rules_listbox, SIGNAL( selectionChanged( QListBoxItem* )), + SLOT( activeChanged( QListBoxItem*))); + connect( new_button, SIGNAL( clicked()), + SLOT( newClicked())); + connect( modify_button, SIGNAL( clicked()), + SLOT( modifyClicked())); + connect( delete_button, SIGNAL( clicked()), + SLOT( deleteClicked())); + connect( moveup_button, SIGNAL( clicked()), + SLOT( moveupClicked())); + connect( movedown_button, SIGNAL( clicked()), + SLOT( movedownClicked())); + connect( rules_listbox, SIGNAL( doubleClicked ( QListBoxItem * ) ), + SLOT( modifyClicked())); + load(); + } + +KCMRulesList::~KCMRulesList() + { + for( QValueVector< Rules* >::Iterator it = rules.begin(); + it != rules.end(); + ++it ) + delete *it; + rules.clear(); + } + +void KCMRulesList::activeChanged( QListBoxItem* item ) + { + if( item != NULL ) + rules_listbox->setSelected( item, true ); // make current==selected + modify_button->setEnabled( item != NULL ); + delete_button->setEnabled( item != NULL ); + moveup_button->setEnabled( item != NULL && item->prev() != NULL ); + movedown_button->setEnabled( item != NULL && item->next() != NULL ); + } + +void KCMRulesList::newClicked() + { + RulesDialog dlg; + Rules* rule = dlg.edit( NULL, 0, false ); + if( rule == NULL ) + return; + int pos = rules_listbox->currentItem() + 1; + rules_listbox->insertItem( rule->description, pos ); + rules_listbox->setSelected( pos, true ); + rules.insert( rules.begin() + pos, rule ); + emit changed( true ); + } + +void KCMRulesList::modifyClicked() + { + int pos = rules_listbox->currentItem(); + if ( pos == -1 ) + return; + RulesDialog dlg; + Rules* rule = dlg.edit( rules[ pos ], 0, false ); + if( rule == rules[ pos ] ) + return; + delete rules[ pos ]; + rules[ pos ] = rule; + rules_listbox->changeItem( rule->description, pos ); + emit changed( true ); + } + +void KCMRulesList::deleteClicked() + { + int pos = rules_listbox->currentItem(); + assert( pos != -1 ); + rules_listbox->removeItem( pos ); + rules.erase( rules.begin() + pos ); + emit changed( true ); + } + +void KCMRulesList::moveupClicked() + { + int pos = rules_listbox->currentItem(); + assert( pos != -1 ); + if( pos > 0 ) + { + QString txt = rules_listbox->text( pos ); + rules_listbox->removeItem( pos ); + rules_listbox->insertItem( txt, pos - 1 ); + rules_listbox->setSelected( pos - 1, true ); + Rules* rule = rules[ pos ]; + rules[ pos ] = rules[ pos - 1 ]; + rules[ pos - 1 ] = rule; + } + emit changed( true ); + } + +void KCMRulesList::movedownClicked() + { + int pos = rules_listbox->currentItem(); + assert( pos != -1 ); + if( pos < int( rules_listbox->count()) - 1 ) + { + QString txt = rules_listbox->text( pos ); + rules_listbox->removeItem( pos ); + rules_listbox->insertItem( txt, pos + 1 ); + rules_listbox->setSelected( pos + 1, true ); + Rules* rule = rules[ pos ]; + rules[ pos ] = rules[ pos + 1 ]; + rules[ pos + 1 ] = rule; + } + emit changed( true ); + } + +void KCMRulesList::load() + { + rules_listbox->clear(); + for( QValueVector< Rules* >::Iterator it = rules.begin(); + it != rules.end(); + ++it ) + delete *it; + rules.clear(); + KConfig cfg( "kwinrulesrc", true ); + cfg.setGroup( "General" ); + int count = cfg.readNumEntry( "count" ); + rules.reserve( count ); + for( int i = 1; + i <= count; + ++i ) + { + cfg.setGroup( QString::number( i )); + Rules* rule = new Rules( cfg ); + rules.append( rule ); + rules_listbox->insertItem( rule->description ); + } + if( rules.count() > 0 ) + rules_listbox->setSelected( 0, true ); + else + activeChanged( NULL ); + } + +void KCMRulesList::save() + { + KConfig cfg( "kwinrulesrc" ); + QStringList groups = cfg.groupList(); + for( QStringList::ConstIterator it = groups.begin(); + it != groups.end(); + ++it ) + cfg.deleteGroup( *it ); + cfg.setGroup( "General" ); + cfg.writeEntry( "count", rules.count()); + int i = 1; + for( QValueVector< Rules* >::ConstIterator it = rules.begin(); + it != rules.end(); + ++it ) + { + cfg.setGroup( QString::number( i )); + (*it)->write( cfg ); + ++i; + } + } + +void KCMRulesList::defaults() + { + load(); + } + +} // namespace + +#include "ruleslist.moc" diff --git a/kwin/kcmkwin/kwinrules/ruleslist.h b/kwin/kcmkwin/kwinrules/ruleslist.h new file mode 100644 index 000000000..b192d2f4e --- /dev/null +++ b/kwin/kcmkwin/kwinrules/ruleslist.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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. + */ + + +#ifndef __RULESLIST_H__ +#define __RULESLIST_H__ + +#include "ruleslistbase.h" + +#include <qvaluevector.h> + +#include "../../rules.h" + +class QListBoxItem; + +namespace KWinInternal +{ + +class KCMRulesList + : public KCMRulesListBase + { + Q_OBJECT + public: + KCMRulesList( QWidget* parent = NULL, const char* name = NULL ); + virtual ~KCMRulesList(); + void load(); + void save(); + void defaults(); + signals: + void changed( bool ); + private slots: + void newClicked(); + void modifyClicked(); + void deleteClicked(); + void moveupClicked(); + void movedownClicked(); + void activeChanged( QListBoxItem* ); + private: + QValueVector< Rules* > rules; + }; + +} // namespace + +#endif diff --git a/kwin/kcmkwin/kwinrules/ruleslistbase.ui b/kwin/kcmkwin/kwinrules/ruleslistbase.ui new file mode 100644 index 000000000..c2abdaa9d --- /dev/null +++ b/kwin/kcmkwin/kwinrules/ruleslistbase.ui @@ -0,0 +1,91 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KWinInternal::KCMRulesListBase</class> +<widget class="QWidget"> + <property name="name"> + <cstring>Form1</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>480</height> + </rect> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <widget class="KListBox" row="0" column="0" rowspan="6" colspan="1"> + <property name="name"> + <cstring>rules_listbox</cstring> + </property> + </widget> + <widget class="KPushButton" row="0" column="1"> + <property name="name"> + <cstring>new_button</cstring> + </property> + <property name="text"> + <string>&New...</string> + </property> + </widget> + <widget class="KPushButton" row="1" column="1"> + <property name="name"> + <cstring>modify_button</cstring> + </property> + <property name="text"> + <string>&Modify...</string> + </property> + </widget> + <widget class="KPushButton" row="2" column="1"> + <property name="name"> + <cstring>delete_button</cstring> + </property> + <property name="text"> + <string>Delete</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <widget class="KPushButton" row="3" column="1"> + <property name="name"> + <cstring>moveup_button</cstring> + </property> + <property name="text"> + <string>Move &Up</string> + </property> + </widget> + <widget class="KPushButton" row="4" column="1"> + <property name="name"> + <cstring>movedown_button</cstring> + </property> + <property name="text"> + <string>Move &Down</string> + </property> + </widget> + <spacer row="5" column="1"> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>294</height> + </size> + </property> + </spacer> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/> +</UI> diff --git a/kwin/kcmkwin/kwinrules/ruleswidget.cpp b/kwin/kcmkwin/kwinrules/ruleswidget.cpp new file mode 100644 index 000000000..7a8afe292 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/ruleswidget.cpp @@ -0,0 +1,803 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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 "ruleswidget.h" + +#include <klineedit.h> +#include <krestrictedline.h> +#include <kcombobox.h> +#include <qcheckbox.h> +#include <kpushbutton.h> +#include <qlabel.h> +#include <kwinmodule.h> +#include <klocale.h> +#include <qregexp.h> +#include <qwhatsthis.h> +#include <assert.h> +#include <kmessagebox.h> +#include <qtabwidget.h> +#include <qtimer.h> + +#include "../../rules.h" + +#include "detectwidget.h" + +namespace KWinInternal +{ + +#define SETUP( var, type ) \ + connect( enable_##var, SIGNAL( toggled( bool )), rule_##var, SLOT( setEnabled( bool ))); \ + connect( enable_##var, SIGNAL( toggled( bool )), this, SLOT( updateEnable##var())); \ + connect( rule_##var, SIGNAL( activated( int )), this, SLOT( updateEnable##var())); \ + QWhatsThis::add( enable_##var, enableDesc ); \ + QWhatsThis::add( rule_##var, type##RuleDesc ); + +RulesWidget::RulesWidget( QWidget* parent, const char* name ) +: RulesWidgetBase( parent, name ) +, detect_dlg( NULL ) + { + QString enableDesc = + i18n( "Enable this checkbox to alter this window property for the specified window(s)." ); + QString setRuleDesc = + i18n( "Specify how the window property should be affected:<ul>" + "<li><em>Do Not Affect:</em> The window property will not be affected and therefore" + " the default handling for it will be used. Specifying this will block more generic" + " window settings from taking effect.</li>" + "<li><em>Apply Initially:</em> The window property will be only set to the given value" + " after the window is created. No further changes will be affected.</li>" + "<li><em>Remember:</em> The value of the window property will be remembered and every time" + " time the window is created, the last remembered value will be applied.</li>" + "<li><em>Force:</em> The window property will be always forced to the given value.</li>" + "<li><em>Apply Now:</em> The window property will be set to the given value immediately" + " and will not be affected later (this action will be deleted afterwards).</li>" + "<li><em>Force temporarily:</em> The window property will be forced to the given value" + " until it is hidden (this action will be deleted after the window is hidden).</li>" + "</ul>" ); + QString forceRuleDesc = + i18n( "Specify how the window property should be affected:<ul>" + "<li><em>Do Not Affect:</em> The window property will not be affected and therefore" + " the default handling for it will be used. Specifying this will block more generic" + " window settings from taking effect.</li>" + "<li><em>Force:</em> The window property will be always forced to the given value.</li>" + "<li><em>Force temporarily:</em> The window property will be forced to the given value" + " until it is hidden (this action will be deleted after the window is hidden).</li>" + "</ul>" ); + // window tabs have enable signals done in designer + // geometry tab + SETUP( position, set ); + SETUP( size, set ); + SETUP( desktop, set ); + SETUP( maximizehoriz, set ); + SETUP( maximizevert, set ); + SETUP( minimize, set ); + SETUP( shade, set ); + SETUP( fullscreen, set ); + SETUP( placement, force ); + // preferences tab + SETUP( above, set ); + SETUP( below, set ); + SETUP( noborder, set ); + SETUP( skiptaskbar, set ); + SETUP( skippager, set ); + SETUP( acceptfocus, force ); + SETUP( closeable, force ); + SETUP( opacityactive, force ); + SETUP( opacityinactive, force ); + SETUP( shortcut, force ); + // workarounds tab + SETUP( fsplevel, force ); + SETUP( moveresizemode, force ); + SETUP( type, force ); + SETUP( ignoreposition, force ); + SETUP( minsize, force ); + SETUP( maxsize, force ); + SETUP( strictgeometry, force ); + SETUP( disableglobalshortcuts, force ); + KWinModule module; + int i; + for( i = 1; + i <= module.numberOfDesktops(); + ++i ) + desktop->insertItem( QString::number( i ).rightJustify( 2 ) + ":" + module.desktopName( i )); + desktop->insertItem( i18n( "All Desktops" )); + } + +#undef SETUP + +#define UPDATE_ENABLE_SLOT( var ) \ +void RulesWidget::updateEnable##var() \ + { \ + /* leave the label readable label_##var->setEnabled( enable_##var->isChecked() && rule_##var->currentItem() != 0 );*/ \ + var->setEnabled( enable_##var->isChecked() && rule_##var->currentItem() != 0 ); \ + } + +// geometry tab +UPDATE_ENABLE_SLOT( position ) +UPDATE_ENABLE_SLOT( size ) +UPDATE_ENABLE_SLOT( desktop ) +UPDATE_ENABLE_SLOT( maximizehoriz ) +UPDATE_ENABLE_SLOT( maximizevert ) +UPDATE_ENABLE_SLOT( minimize ) +UPDATE_ENABLE_SLOT( shade ) +UPDATE_ENABLE_SLOT( fullscreen ) +UPDATE_ENABLE_SLOT( placement ) +// preferences tab +UPDATE_ENABLE_SLOT( above ) +UPDATE_ENABLE_SLOT( below ) +UPDATE_ENABLE_SLOT( noborder ) +UPDATE_ENABLE_SLOT( skiptaskbar ) +UPDATE_ENABLE_SLOT( skippager ) +UPDATE_ENABLE_SLOT( acceptfocus ) +UPDATE_ENABLE_SLOT( closeable ) +UPDATE_ENABLE_SLOT( opacityactive ) +UPDATE_ENABLE_SLOT( opacityinactive ) +void RulesWidget::updateEnableshortcut() + { + shortcut->setEnabled( enable_shortcut->isChecked() && rule_shortcut->currentItem() != 0 ); + shortcut_edit->setEnabled( enable_shortcut->isChecked() && rule_shortcut->currentItem() != 0 ); + } +// workarounds tab +UPDATE_ENABLE_SLOT( fsplevel ) +UPDATE_ENABLE_SLOT( moveresizemode ) +UPDATE_ENABLE_SLOT( type ) +UPDATE_ENABLE_SLOT( ignoreposition ) +UPDATE_ENABLE_SLOT( minsize ) +UPDATE_ENABLE_SLOT( maxsize ) +UPDATE_ENABLE_SLOT( strictgeometry ) +UPDATE_ENABLE_SLOT( disableglobalshortcuts ) + +#undef UPDATE_ENABLE_SLOT + +static const int set_rule_to_combo[] = + { + 0, // Unused + 0, // Don't Affect + 3, // Force + 1, // Apply + 2, // Remember + 4, // ApplyNow + 5 // ForceTemporarily + }; + +static const Rules::SetRule combo_to_set_rule[] = + { + ( Rules::SetRule )Rules::DontAffect, + ( Rules::SetRule )Rules::Apply, + ( Rules::SetRule )Rules::Remember, + ( Rules::SetRule )Rules::Force, + ( Rules::SetRule )Rules::ApplyNow, + ( Rules::SetRule )Rules::ForceTemporarily + }; + +static const int force_rule_to_combo[] = + { + 0, // Unused + 0, // Don't Affect + 1, // Force + 0, // Apply + 0, // Remember + 0, // ApplyNow + 2 // ForceTemporarily + }; + +static const Rules::ForceRule combo_to_force_rule[] = + { + ( Rules::ForceRule )Rules::DontAffect, + ( Rules::ForceRule )Rules::Force, + ( Rules::ForceRule )Rules::ForceTemporarily + }; + +static QString positionToStr( const QPoint& p ) + { + if( p == invalidPoint ) + return QString::null; + return QString::number( p.x()) + "," + QString::number( p.y()); + } + +static QPoint strToPosition( const QString& str ) + { // two numbers, with + or -, separated by any of , x X : + QRegExp reg( "\\s*([+-]?[0-9]*)\\s*[,xX:]\\s*([+-]?[0-9]*)\\s*" ); + if( !reg.exactMatch( str )) + return invalidPoint; + return QPoint( reg.cap( 1 ).toInt(), reg.cap( 2 ).toInt()); + } + +static QString sizeToStr( const QSize& s ) + { + if( !s.isValid()) + return QString::null; + return QString::number( s.width()) + "," + QString::number( s.height()); + } + +static QSize strToSize( const QString& str ) + { // two numbers, with + or -, separated by any of , x X : + QRegExp reg( "\\s*([+-]?[0-9]*)\\s*[,xX:]\\s*([+-]?[0-9]*)\\s*" ); + if( !reg.exactMatch( str )) + return QSize(); + return QSize( reg.cap( 1 ).toInt(), reg.cap( 2 ).toInt()); + } + +//used for opacity settings +static QString intToStr( const int& s ) + { + if( s < 1 || s > 100 ) + return QString::null; + return QString::number(s); + } + +static int strToInt( const QString& str ) + { + int tmp = str.toInt(); + if( tmp < 1 || tmp > 100 ) + return 100; + return tmp; + } + +int RulesWidget::desktopToCombo( int d ) const + { + if( d >= 1 && d < desktop->count()) + return d - 1; + return desktop->count() - 1; // on all desktops + } + +int RulesWidget::comboToDesktop( int val ) const + { + if( val == desktop->count() - 1 ) + return NET::OnAllDesktops; + return val + 1; + } + +static int placementToCombo( Placement::Policy placement ) + { + static const int conv[] = + { + 1, // NoPlacement + 0, // Default + 0, // Unknown + 6, // Random + 2, // Smart + 4, // Cascade + 5, // Centered + 7, // ZeroCornered + 8, // UnderMouse + 9, // OnMainWindow + 3 // Maximizing + }; + return conv[ placement ]; + } + +static Placement::Policy comboToPlacement( int val ) + { + static const Placement::Policy conv[] = + { + Placement::Default, + Placement::NoPlacement, + Placement::Smart, + Placement::Maximizing, + Placement::Cascade, + Placement::Centered, + Placement::Random, + Placement::ZeroCornered, + Placement::UnderMouse, + Placement::OnMainWindow + // no Placement::Unknown + }; + return conv[ val ]; + } + +static int moveresizeToCombo( Options::MoveResizeMode mode ) + { + return mode == Options::Opaque ? 0 : 1; + } + +static Options::MoveResizeMode comboToMoveResize( int val ) + { + return val == 0 ? Options::Opaque : Options::Transparent; + } + +static int typeToCombo( NET::WindowType type ) + { + if( type < NET::Normal || type > NET::Splash ) + return 0; // Normal + static const int conv[] = + { + 0, // Normal + 7, // Desktop + 3, // Dock + 4, // Toolbar + 5, // Menu + 1, // Dialog + 8, // Override + 9, // TopMenu + 2, // Utility + 6 // Splash + }; + return conv[ type ]; + } + +static NET::WindowType comboToType( int val ) + { + static const NET::WindowType conv[] = + { + NET::Normal, + NET::Dialog, + NET::Utility, + NET::Dock, + NET::Toolbar, + NET::Menu, + NET::Splash, + NET::Desktop, + NET::Override, + NET::TopMenu + }; + return conv[ val ]; + } + +#define GENERIC_RULE( var, func, Type, type, uimethod, uimethod0 ) \ + if( rules->var##rule == Rules::Unused##Type##Rule ) \ + { \ + enable_##var->setChecked( false ); \ + rule_##var->setCurrentItem( 0 ); \ + var->uimethod0; \ + updateEnable##var(); \ + } \ + else \ + { \ + enable_##var->setChecked( true ); \ + rule_##var->setCurrentItem( type##_rule_to_combo[ rules->var##rule ] ); \ + var->uimethod( func( rules->var )); \ + updateEnable##var(); \ + } + +#define CHECKBOX_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, setChecked, setChecked( false )) +#define LINEEDIT_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, setText, setText( "" )) +#define COMBOBOX_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, setCurrentItem, setCurrentItem( 0 )) +#define CHECKBOX_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, setChecked, setChecked( false )) +#define LINEEDIT_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, setText, setText( "" )) +#define COMBOBOX_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, setCurrentItem, setCurrentItem( 0 )) + +void RulesWidget::setRules( Rules* rules ) + { + Rules tmp; + if( rules == NULL ) + rules = &tmp; // empty + description->setText( rules->description ); + wmclass->setText( rules->wmclass ); + whole_wmclass->setChecked( rules->wmclasscomplete ); + wmclass_match->setCurrentItem( rules->wmclassmatch ); + wmclassMatchChanged(); + role->setText( rules->windowrole ); + role_match->setCurrentItem( rules->windowrolematch ); + roleMatchChanged(); + types->setSelected( 0, rules->types & NET::NormalMask ); + types->setSelected( 1, rules->types & NET::DialogMask ); + types->setSelected( 2, rules->types & NET::UtilityMask ); + types->setSelected( 3, rules->types & NET::DockMask ); + types->setSelected( 4, rules->types & NET::ToolbarMask ); + types->setSelected( 5, rules->types & NET::MenuMask ); + types->setSelected( 6, rules->types & NET::SplashMask ); + types->setSelected( 7, rules->types & NET::DesktopMask ); + types->setSelected( 8, rules->types & NET::OverrideMask ); + types->setSelected( 9, rules->types & NET::TopMenuMask ); + title->setText( rules->title ); + title_match->setCurrentItem( rules->titlematch ); + titleMatchChanged(); + extra->setText( rules->extrarole ); + extra_match->setCurrentItem( rules->extrarolematch ); + extraMatchChanged(); + machine->setText( rules->clientmachine ); + machine_match->setCurrentItem( rules->clientmachinematch ); + machineMatchChanged(); + LINEEDIT_SET_RULE( position, positionToStr ); + LINEEDIT_SET_RULE( size, sizeToStr ); + COMBOBOX_SET_RULE( desktop, desktopToCombo ); + CHECKBOX_SET_RULE( maximizehoriz, ); + CHECKBOX_SET_RULE( maximizevert, ); + CHECKBOX_SET_RULE( minimize, ); + CHECKBOX_SET_RULE( shade, ); + CHECKBOX_SET_RULE( fullscreen, ); + COMBOBOX_FORCE_RULE( placement, placementToCombo ); + CHECKBOX_SET_RULE( above, ); + CHECKBOX_SET_RULE( below, ); + CHECKBOX_SET_RULE( noborder, ); + CHECKBOX_SET_RULE( skiptaskbar, ); + CHECKBOX_SET_RULE( skippager, ); + CHECKBOX_FORCE_RULE( acceptfocus, ); + CHECKBOX_FORCE_RULE( closeable, ); + LINEEDIT_FORCE_RULE( opacityactive, intToStr ); + LINEEDIT_FORCE_RULE( opacityinactive, intToStr ); + LINEEDIT_SET_RULE( shortcut, ); + COMBOBOX_FORCE_RULE( fsplevel, ); + COMBOBOX_FORCE_RULE( moveresizemode, moveresizeToCombo ); + COMBOBOX_FORCE_RULE( type, typeToCombo ); + CHECKBOX_FORCE_RULE( ignoreposition, ); + LINEEDIT_FORCE_RULE( minsize, sizeToStr ); + LINEEDIT_FORCE_RULE( maxsize, sizeToStr ); + CHECKBOX_FORCE_RULE( strictgeometry, ); + CHECKBOX_FORCE_RULE( disableglobalshortcuts, ); + } + +#undef GENERIC_RULE +#undef CHECKBOX_SET_RULE +#undef LINEEDIT_SET_RULE +#undef COMBOBOX_SET_RULE +#undef CHECKBOX_FORCE_RULE +#undef LINEEDIT_FORCE_RULE +#undef COMBOBOX_FORCE_RULE + +#define GENERIC_RULE( var, func, Type, type, uimethod ) \ + if( enable_##var->isChecked()) \ + { \ + rules->var##rule = combo_to_##type##_rule[ rule_##var->currentItem() ]; \ + rules->var = func( var->uimethod()); \ + } \ + else \ + rules->var##rule = Rules::Unused##Type##Rule; + +#define CHECKBOX_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, isChecked ) +#define LINEEDIT_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, text ) +#define COMBOBOX_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, currentItem ) +#define CHECKBOX_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, isChecked ) +#define LINEEDIT_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, text ) +#define COMBOBOX_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, currentItem ) + +Rules* RulesWidget::rules() const + { + Rules* rules = new Rules(); + rules->description = description->text(); + rules->wmclass = wmclass->text().utf8(); + rules->wmclasscomplete = whole_wmclass->isChecked(); + rules->wmclassmatch = static_cast< Rules::StringMatch >( wmclass_match->currentItem()); + rules->windowrole = role->text().utf8(); + rules->windowrolematch = static_cast< Rules::StringMatch >( role_match->currentItem()); + rules->types = 0; + bool all_types = true; + for( unsigned int i = 0; + i < types->count(); + ++i ) + if( !types->isSelected( i )) + all_types = false; + if( all_types ) // if all types are selected, use AllTypesMask (for future expansion) + rules->types = NET::AllTypesMask; + else + { + rules->types |= types->isSelected( 0 ) ? NET::NormalMask : 0; + rules->types |= types->isSelected( 1 ) ? NET::DialogMask : 0; + rules->types |= types->isSelected( 2 ) ? NET::UtilityMask : 0; + rules->types |= types->isSelected( 3 ) ? NET::DockMask : 0; + rules->types |= types->isSelected( 4 ) ? NET::ToolbarMask : 0; + rules->types |= types->isSelected( 5 ) ? NET::MenuMask : 0; + rules->types |= types->isSelected( 6 ) ? NET::SplashMask : 0; + rules->types |= types->isSelected( 7 ) ? NET::DesktopMask : 0; + rules->types |= types->isSelected( 8 ) ? NET::OverrideMask : 0; + rules->types |= types->isSelected( 9 ) ? NET::TopMenuMask : 0; + } + rules->title = title->text(); + rules->titlematch = static_cast< Rules::StringMatch >( title_match->currentItem()); + rules->extrarole = extra->text().utf8(); + rules->extrarolematch = static_cast< Rules::StringMatch >( extra_match->currentItem()); + rules->clientmachine = machine->text().utf8(); + rules->clientmachinematch = static_cast< Rules::StringMatch >( machine_match->currentItem()); + LINEEDIT_SET_RULE( position, strToPosition ); + LINEEDIT_SET_RULE( size, strToSize ); + COMBOBOX_SET_RULE( desktop, comboToDesktop ); + CHECKBOX_SET_RULE( maximizehoriz, ); + CHECKBOX_SET_RULE( maximizevert, ); + CHECKBOX_SET_RULE( minimize, ); + CHECKBOX_SET_RULE( shade, ); + CHECKBOX_SET_RULE( fullscreen, ); + COMBOBOX_FORCE_RULE( placement, comboToPlacement ); + CHECKBOX_SET_RULE( above, ); + CHECKBOX_SET_RULE( below, ); + CHECKBOX_SET_RULE( noborder, ); + CHECKBOX_SET_RULE( skiptaskbar, ); + CHECKBOX_SET_RULE( skippager, ); + CHECKBOX_FORCE_RULE( acceptfocus, ); + CHECKBOX_FORCE_RULE( closeable, ); + LINEEDIT_FORCE_RULE( opacityactive, strToInt ); + LINEEDIT_FORCE_RULE( opacityinactive, strToInt ); + LINEEDIT_SET_RULE( shortcut, ); + COMBOBOX_FORCE_RULE( fsplevel, ); + COMBOBOX_FORCE_RULE( moveresizemode, comboToMoveResize ); + COMBOBOX_FORCE_RULE( type, comboToType ); + CHECKBOX_FORCE_RULE( ignoreposition, ); + LINEEDIT_FORCE_RULE( minsize, strToSize ); + LINEEDIT_FORCE_RULE( maxsize, strToSize ); + CHECKBOX_FORCE_RULE( strictgeometry, ); + CHECKBOX_FORCE_RULE( disableglobalshortcuts, ); + return rules; + } + +#undef GENERIC_RULE +#undef CHECKBOX_SET_RULE +#undef LINEEDIT_SET_RULE +#undef COMBOBOX_SET_RULE +#undef CHECKBOX_FORCE_RULE +#undef LINEEDIT_FORCE_RULE +#undef COMBOBOX_FORCE_RULE + +#define STRING_MATCH_COMBO( type ) \ +void RulesWidget::type##MatchChanged() \ + { \ + edit_reg_##type->setEnabled( type##_match->currentItem() == Rules::RegExpMatch ); \ + type->setEnabled( type##_match->currentItem() != Rules::UnimportantMatch ); \ + } + +STRING_MATCH_COMBO( wmclass ) +STRING_MATCH_COMBO( role ) +STRING_MATCH_COMBO( title ) +STRING_MATCH_COMBO( extra ) +STRING_MATCH_COMBO( machine ) + +#undef STRING_MATCH_COMBO + +void RulesWidget::detectClicked() + { + assert( detect_dlg == NULL ); + detect_dlg = new DetectDialog; + connect( detect_dlg, SIGNAL( detectionDone( bool )), this, SLOT( detected( bool ))); + detect_dlg->detect( 0 ); + } + +void RulesWidget::detected( bool ok ) + { + if( ok ) + { + wmclass->setText( detect_dlg->selectedClass()); + wmclass_match->setCurrentItem( Rules::ExactMatch ); + wmclassMatchChanged(); // grrr + whole_wmclass->setChecked( detect_dlg->selectedWholeClass()); + role->setText( detect_dlg->selectedRole()); + role_match->setCurrentItem( detect_dlg->selectedRole().isEmpty() + ? Rules::UnimportantMatch : Rules::ExactMatch ); + roleMatchChanged(); + if( detect_dlg->selectedWholeApp()) + { + for( unsigned int i = 0; + i < types->count(); + ++i ) + types->setSelected( i, true ); + } + else + { + NET::WindowType type = detect_dlg->selectedType(); + for( unsigned int i = 0; + i < types->count(); + ++i ) + types->setSelected( i, false ); + types->setSelected( typeToCombo( type ), true ); + } + title->setText( detect_dlg->selectedTitle()); + title_match->setCurrentItem( detect_dlg->titleMatch()); + titleMatchChanged(); + machine->setText( detect_dlg->selectedMachine()); + machine_match->setCurrentItem( Rules::UnimportantMatch ); + machineMatchChanged(); + // prefill values from to window to settings which already set + const KWin::WindowInfo& info = detect_dlg->windowInfo(); + prefillUnusedValues( info ); + } + delete detect_dlg; + detect_dlg = NULL; + detect_dlg_ok = ok; + } + +#define GENERIC_PREFILL( var, func, info, uimethod ) \ + if( !enable_##var->isChecked()) \ + { \ + var->uimethod( func( info )); \ + } + +#define CHECKBOX_PREFILL( var, func, info ) GENERIC_PREFILL( var, func, info, setChecked ) +#define LINEEDIT_PREFILL( var, func, info ) GENERIC_PREFILL( var, func, info, setText ) +#define COMBOBOX_PREFILL( var, func, info ) GENERIC_PREFILL( var, func, info, setCurrentItem ) + +void RulesWidget::prefillUnusedValues( const KWin::WindowInfo& info ) + { + LINEEDIT_PREFILL( position, positionToStr, info.frameGeometry().topLeft() ); + LINEEDIT_PREFILL( size, sizeToStr, info.frameGeometry().size() ); + COMBOBOX_PREFILL( desktop, desktopToCombo, info.desktop() ); + CHECKBOX_PREFILL( maximizehoriz,, info.state() & NET::MaxHoriz ); + CHECKBOX_PREFILL( maximizevert,, info.state() & NET::MaxVert ); + CHECKBOX_PREFILL( minimize,, info.isMinimized() ); + CHECKBOX_PREFILL( shade,, info.state() & NET::Shaded ); + CHECKBOX_PREFILL( fullscreen,, info.state() & NET::FullScreen ); + //COMBOBOX_PREFILL( placement, placementToCombo ); + CHECKBOX_PREFILL( above,, info.state() & NET::KeepAbove ); + CHECKBOX_PREFILL( below,, info.state() & NET::KeepBelow ); + // noborder is only internal KWin information, so let's guess + CHECKBOX_PREFILL( noborder,, info.frameGeometry() == info.geometry() ); + CHECKBOX_PREFILL( skiptaskbar,, info.state() & NET::SkipTaskbar ); + CHECKBOX_PREFILL( skippager,, info.state() & NET::SkipPager ); + //CHECKBOX_PREFILL( acceptfocus, ); + //CHECKBOX_PREFILL( closeable, ); + LINEEDIT_PREFILL( opacityactive, intToStr, 100 /*get the actual opacity somehow*/); + LINEEDIT_PREFILL( opacityinactive, intToStr, 100 /*get the actual opacity somehow*/); + //LINEEDIT_PREFILL( shortcut, ); + //COMBOBOX_PREFILL( fsplevel, ); + //COMBOBOX_PREFILL( moveresizemode, moveresizeToCombo ); + COMBOBOX_PREFILL( type, typeToCombo, info.windowType( SUPPORTED_WINDOW_TYPES_MASK ) ); + //CHECKBOX_PREFILL( ignoreposition, ); + LINEEDIT_PREFILL( minsize, sizeToStr, info.frameGeometry().size() ); + LINEEDIT_PREFILL( maxsize, sizeToStr, info.frameGeometry().size() ); + //CHECKBOX_PREFILL( strictgeometry, ); + //CHECKBOX_PREFILL( disableglobalshortcuts, ); + } + +#undef GENERIC_PREFILL +#undef CHECKBOX_PREFILL +#undef LINEEDIT_PREFILL +#undef COMBOBOX_PREFILL + +bool RulesWidget::finalCheck() + { + if( description->text().isEmpty()) + { + if( !wmclass->text().isEmpty()) + description->setText( i18n( "Settings for %1" ).arg( wmclass->text())); + else + description->setText( i18n( "Unnamed entry" )); + } + bool all_types = true; + for( unsigned int i = 0; + i < types->count(); + ++i ) + if( !types->isSelected( i )) + all_types = false; + if( wmclass_match->currentItem() == Rules::UnimportantMatch && all_types ) + { + if( KMessageBox::warningContinueCancel( topLevelWidget(), + i18n( "You have specified the window class as unimportant.\n" + "This means the settings will possibly apply to windows from all applications. " + "If you really want to create a generic setting, it is recommended you at least " + "limit the window types to avoid special window types." )) != KMessageBox::Continue ) + return false; + } + return true; + } + +void RulesWidget::prepareWindowSpecific( WId window ) + { + tabs->setCurrentPage( 2 ); // geometry tab, skip tabs for window identification + KWin::WindowInfo info( window, -1U, -1U ); // read everything + prefillUnusedValues( info ); + } + +void RulesWidget::shortcutEditClicked() + { + EditShortcutDialog dlg( topLevelWidget()); + dlg.setShortcut( shortcut->text()); + if( dlg.exec() == QDialog::Accepted ) + shortcut->setText( dlg.shortcut()); + } + +RulesDialog::RulesDialog( QWidget* parent, const char* name ) +: KDialogBase( parent, name, true, i18n( "Edit Window-Specific Settings" ), Ok | Cancel ) + { + widget = new RulesWidget( this ); + setMainWidget( widget ); + } + +// window is set only for Alt+F3/Window-specific settings, because the dialog +// is then related to one specific window +Rules* RulesDialog::edit( Rules* r, WId window, bool show_hints ) + { + rules = r; + widget->setRules( rules ); + if( window != 0 ) + widget->prepareWindowSpecific( window ); + if( show_hints ) + QTimer::singleShot( 0, this, SLOT( displayHints())); + exec(); + return rules; + } + +void RulesDialog::displayHints() + { + QString str = "<qt><p>"; + str += i18n( "This configuration dialog allows altering settings only for the selected window" + " or application. Find the setting you want to affect, enable the setting using the checkbox," + " select in what way the setting should be affected and to which value." ); +#if 0 // maybe later + str += "</p><p>" + i18n( "Consult the documentation for more details." ); +#endif + str += "</p></qt>"; + KMessageBox::information( this, str, QString::null, "displayhints" ); + } + +void RulesDialog::accept() + { + if( !widget->finalCheck()) + return; + rules = widget->rules(); + KDialogBase::accept(); + } + +EditShortcut::EditShortcut( QWidget* parent, const char* name ) +: EditShortcutBase( parent, name ) + { + } + +void EditShortcut::editShortcut() + { + ShortcutDialog dlg( KShortcut( shortcut->text()), topLevelWidget()); + if( dlg.exec() == QDialog::Accepted ) + shortcut->setText( dlg.shortcut().toString()); + } + +void EditShortcut::clearShortcut() + { + shortcut->setText( "" ); + } + +EditShortcutDialog::EditShortcutDialog( QWidget* parent, const char* name ) +: KDialogBase( parent, name, true, i18n( "Edit Shortcut" ), Ok | Cancel ) + { + widget = new EditShortcut( this ); + setMainWidget( widget ); + } + +void EditShortcutDialog::setShortcut( const QString& cut ) + { + widget->shortcut->setText( cut ); + } + +QString EditShortcutDialog::shortcut() const + { + return widget->shortcut->text(); + } + +ShortcutDialog::ShortcutDialog( const KShortcut& cut, QWidget* parent, const char* name ) + : KShortcutDialog( cut, false /*TODO???*/, parent, name ) + { + } + +void ShortcutDialog::accept() + { + for( int i = 0; + ; + ++i ) + { + KKeySequence seq = shortcut().seq( i ); + if( seq.isNull()) + break; + if( seq.key( 0 ) == Key_Escape ) + { + reject(); + return; + } + if( seq.key( 0 ) == Key_Space ) + { // clear + setShortcut( KShortcut()); + KShortcutDialog::accept(); + return; + } + if( seq.key( 0 ).modFlags() == 0 ) + { // no shortcuts without modifiers + KShortcut cut = shortcut(); + cut.setSeq( i, KKeySequence()); + setShortcut( cut ); + return; + } + } + KShortcutDialog::accept(); + } + +} // namespace + +#include "ruleswidget.moc" diff --git a/kwin/kcmkwin/kwinrules/ruleswidget.h b/kwin/kcmkwin/kwinrules/ruleswidget.h new file mode 100644 index 000000000..94af87ef4 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/ruleswidget.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org> + * + * 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. + */ + + +#ifndef __RULESWIDGET_H__ +#define __RULESWIDGET_H__ + +#include <kdialogbase.h> +#include <kwin.h> +#include <kshortcutdialog.h> + +#include "ruleswidgetbase.h" +#include "editshortcutbase.h" + +namespace KWinInternal +{ + +class Rules; +class DetectDialog; + +class RulesWidget + : public RulesWidgetBase + { + Q_OBJECT + public: + RulesWidget( QWidget* parent = NULL, const char* name = NULL ); + void setRules( Rules* r ); + Rules* rules() const; + bool finalCheck(); + void prepareWindowSpecific( WId window ); + signals: + void changed( bool state ); + protected slots: + virtual void detectClicked(); + virtual void wmclassMatchChanged(); + virtual void roleMatchChanged(); + virtual void titleMatchChanged(); + virtual void extraMatchChanged(); + virtual void machineMatchChanged(); + virtual void shortcutEditClicked(); + private slots: + // geometry tab + void updateEnableposition(); + void updateEnablesize(); + void updateEnabledesktop(); + void updateEnablemaximizehoriz(); + void updateEnablemaximizevert(); + void updateEnableminimize(); + void updateEnableshade(); + void updateEnablefullscreen(); + void updateEnableplacement(); + // preferences tab + void updateEnableabove(); + void updateEnablebelow(); + void updateEnablenoborder(); + void updateEnableskiptaskbar(); + void updateEnableskippager(); + void updateEnableacceptfocus(); + void updateEnablecloseable(); + void updateEnableopacityactive(); + void updateEnableopacityinactive(); + // workarounds tab + void updateEnablefsplevel(); + void updateEnablemoveresizemode(); + void updateEnabletype(); + void updateEnableignoreposition(); + void updateEnableminsize(); + void updateEnablemaxsize(); + void updateEnablestrictgeometry(); + void updateEnableshortcut(); + void updateEnabledisableglobalshortcuts(); + // internal + void detected( bool ); + private: + int desktopToCombo( int d ) const; + int comboToDesktop( int val ) const; + void prefillUnusedValues( const KWin::WindowInfo& info ); + DetectDialog* detect_dlg; + bool detect_dlg_ok; + }; + +class RulesDialog + : public KDialogBase + { + Q_OBJECT + public: + RulesDialog( QWidget* parent = NULL, const char* name = NULL ); + Rules* edit( Rules* r, WId window, bool show_hints ); + protected: + virtual void accept(); + private slots: + void displayHints(); + private: + RulesWidget* widget; + Rules* rules; + }; + +class EditShortcut + : public EditShortcutBase + { + Q_OBJECT + public: + EditShortcut( QWidget* parent = NULL, const char* name = NULL ); + protected: + void editShortcut(); + void clearShortcut(); + }; + +class EditShortcutDialog + : public KDialogBase + { + Q_OBJECT + public: + EditShortcutDialog( QWidget* parent = NULL, const char* name = NULL ); + void setShortcut( const QString& cut ); + QString shortcut() const; + private: + EditShortcut* widget; + }; + +// slightly duped from utils.cpp +class ShortcutDialog + : public KShortcutDialog + { + Q_OBJECT + public: + ShortcutDialog( const KShortcut& cut, QWidget* parent = NULL, const char* name = NULL ); + virtual void accept(); + }; + +} // namespace + +#endif diff --git a/kwin/kcmkwin/kwinrules/ruleswidgetbase.ui b/kwin/kcmkwin/kwinrules/ruleswidgetbase.ui new file mode 100644 index 000000000..01c1b9918 --- /dev/null +++ b/kwin/kcmkwin/kwinrules/ruleswidgetbase.ui @@ -0,0 +1,2597 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KWinInternal::RulesWidgetBase</class> +<widget class="QWidget"> + <property name="name"> + <cstring>Form2</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>630</width> + <height>503</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <widget class="QTabWidget"> + <property name="name"> + <cstring>tabs</cstring> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>&Window</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>De&scription:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>description</cstring> + </property> + </widget> + <widget class="KLineEdit" row="1" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>description</cstring> + </property> + </widget> + <widget class="QLabel" row="2" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Window &class (application type):</string> + </property> + <property name="buddy" stdset="0"> + <cstring>wmclass</cstring> + </property> + </widget> + <widget class="QLabel" row="5" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string>Window &role:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>role</cstring> + </property> + </widget> + <widget class="KLineEdit" row="6" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>role</cstring> + </property> + </widget> + <spacer row="9" column="1"> + <property name="name"> + <cstring>spacer29</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + <widget class="KComboBox" row="7" column="0"> + <item> + <property name="text"> + <string>Unimportant</string> + </property> + </item> + <item> + <property name="text"> + <string>Exact Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Substring Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Regular Expression</string> + </property> + </item> + <property name="name"> + <cstring>role_match</cstring> + </property> + </widget> + <spacer row="7" column="1"> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>212</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KPushButton" row="7" column="2"> + <property name="name"> + <cstring>edit_reg_role</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Edit</string> + </property> + </widget> + <spacer row="7" column="3" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>211</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KComboBox" row="4" column="0"> + <item> + <property name="text"> + <string>Unimportant</string> + </property> + </item> + <item> + <property name="text"> + <string>Exact Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Substring Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Regular Expression</string> + </property> + </item> + <property name="name"> + <cstring>wmclass_match</cstring> + </property> + </widget> + <spacer row="4" column="1"> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>212</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KPushButton" row="4" column="2"> + <property name="name"> + <cstring>edit_reg_wmclass</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Edit</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <spacer row="4" column="3" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>211</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KLineEdit" row="3" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>wmclass</cstring> + </property> + </widget> + <widget class="QCheckBox" row="3" column="4"> + <property name="name"> + <cstring>whole_wmclass</cstring> + </property> + <property name="text"> + <string>Match w&hole window class</string> + </property> + </widget> + <widget class="QGroupBox" row="8" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>groupBox1</cstring> + </property> + <property name="title"> + <string>Detect Window Properties</string> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer27</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>270</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KPushButton"> + <property name="name"> + <cstring>detect1</cstring> + </property> + <property name="text"> + <string>&Detect</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer28</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>269</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </grid> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>Window &Extra</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>textLabel4</cstring> + </property> + <property name="text"> + <string>Window &types:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>types</cstring> + </property> + </widget> + <widget class="KListBox" row="1" column="0" rowspan="1" colspan="4"> + <item> + <property name="text"> + <string>Normal Window</string> + </property> + </item> + <item> + <property name="text"> + <string>Dialog Window</string> + </property> + </item> + <item> + <property name="text"> + <string>Utility Window</string> + </property> + </item> + <item> + <property name="text"> + <string>Dock (panel)</string> + </property> + </item> + <item> + <property name="text"> + <string>Toolbar</string> + </property> + </item> + <item> + <property name="text"> + <string>Torn-Off Menu</string> + </property> + </item> + <item> + <property name="text"> + <string>Splash Screen</string> + </property> + </item> + <item> + <property name="text"> + <string>Desktop</string> + </property> + </item> + <item> + <property name="text"> + <string>Override Type</string> + </property> + </item> + <item> + <property name="text"> + <string>Standalone Menubar</string> + </property> + </item> + <property name="name"> + <cstring>types</cstring> + </property> + <property name="selectionMode"> + <enum>Multi</enum> + </property> + </widget> + <widget class="QLabel" row="2" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>textLabel5</cstring> + </property> + <property name="text"> + <string>Window t&itle:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>title</cstring> + </property> + </widget> + <widget class="KLineEdit" row="3" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>title</cstring> + </property> + </widget> + <widget class="QLabel" row="5" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>textLabel6</cstring> + </property> + <property name="text"> + <string>Extra role:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>extra</cstring> + </property> + </widget> + <widget class="KLineEdit" row="6" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>extra</cstring> + </property> + </widget> + <widget class="QLabel" row="8" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>textLabel7</cstring> + </property> + <property name="text"> + <string>&Machine (hostname):</string> + </property> + <property name="buddy" stdset="0"> + <cstring>machine</cstring> + </property> + </widget> + <widget class="KLineEdit" row="9" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>machine</cstring> + </property> + </widget> + <widget class="KComboBox" row="4" column="0"> + <item> + <property name="text"> + <string>Unimportant</string> + </property> + </item> + <item> + <property name="text"> + <string>Exact Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Substring Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Regular Expression</string> + </property> + </item> + <property name="name"> + <cstring>title_match</cstring> + </property> + </widget> + <spacer row="4" column="1"> + <property name="name"> + <cstring>spacer2_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>199</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KPushButton" row="4" column="2"> + <property name="name"> + <cstring>edit_reg_title</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Edit</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <spacer row="4" column="3"> + <property name="name"> + <cstring>spacer5_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>199</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KComboBox" row="7" column="0"> + <item> + <property name="text"> + <string>Unimportant</string> + </property> + </item> + <item> + <property name="text"> + <string>Exact Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Substring Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Regular Expression</string> + </property> + </item> + <property name="name"> + <cstring>extra_match</cstring> + </property> + </widget> + <spacer row="7" column="1"> + <property name="name"> + <cstring>spacer2_2_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>199</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KPushButton" row="7" column="2"> + <property name="name"> + <cstring>edit_reg_extra</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Edit</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <spacer row="7" column="3"> + <property name="name"> + <cstring>spacer5_2_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>199</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KComboBox" row="10" column="0"> + <item> + <property name="text"> + <string>Unimportant</string> + </property> + </item> + <item> + <property name="text"> + <string>Exact Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Substring Match</string> + </property> + </item> + <item> + <property name="text"> + <string>Regular Expression</string> + </property> + </item> + <property name="name"> + <cstring>machine_match</cstring> + </property> + </widget> + <spacer row="10" column="1"> + <property name="name"> + <cstring>spacer2_2_3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>199</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="KPushButton" row="10" column="2"> + <property name="name"> + <cstring>edit_reg_machine</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Edit</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <spacer row="10" column="3"> + <property name="name"> + <cstring>spacer5_2_3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>199</width> + <height>20</height> + </size> + </property> + </spacer> + </grid> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>TabPage</cstring> + </property> + <attribute name="title"> + <string>&Geometry</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KComboBox" row="1" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_size</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KRestrictedLine" row="1" column="2"> + <property name="name"> + <cstring>size</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="validChars"> + <string>0123456789-+,xX:</string> + </property> + </widget> + <widget class="QCheckBox" row="1" column="0"> + <property name="name"> + <cstring>enable_size</cstring> + </property> + <property name="text"> + <string>&Size</string> + </property> + </widget> + <widget class="QCheckBox" row="0" column="0"> + <property name="name"> + <cstring>enable_position</cstring> + </property> + <property name="text"> + <string>&Position</string> + </property> + </widget> + <widget class="KRestrictedLine" row="0" column="2"> + <property name="name"> + <cstring>position</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="validChars"> + <string>0123456789-+,xX:</string> + </property> + </widget> + <widget class="KComboBox" row="0" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_position</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="3" column="2"> + <property name="name"> + <cstring>maximizevert</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="KComboBox" row="2" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_maximizehoriz</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="4" column="2"> + <property name="name"> + <cstring>fullscreen</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="2" column="0"> + <property name="name"> + <cstring>enable_maximizehoriz</cstring> + </property> + <property name="text"> + <string>Maximized &horizontally</string> + </property> + </widget> + <widget class="QCheckBox" row="2" column="2"> + <property name="name"> + <cstring>maximizehoriz</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="KComboBox" row="4" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_fullscreen</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="4" column="0"> + <property name="name"> + <cstring>enable_fullscreen</cstring> + </property> + <property name="text"> + <string>&Fullscreen</string> + </property> + </widget> + <widget class="KComboBox" row="3" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_maximizevert</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="3" column="0"> + <property name="name"> + <cstring>enable_maximizevert</cstring> + </property> + <property name="text"> + <string>Maximized &vertically</string> + </property> + </widget> + <widget class="KComboBox" row="5" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_desktop</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="5" column="2"> + <property name="name"> + <cstring>desktop</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="5" column="0"> + <property name="name"> + <cstring>enable_desktop</cstring> + </property> + <property name="text"> + <string>&Desktop</string> + </property> + </widget> + <widget class="QCheckBox" row="7" column="0"> + <property name="name"> + <cstring>enable_shade</cstring> + </property> + <property name="text"> + <string>Sh&aded</string> + </property> + </widget> + <widget class="QCheckBox" row="7" column="2"> + <property name="name"> + <cstring>shade</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="KComboBox" row="6" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_minimize</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="6" column="2"> + <property name="name"> + <cstring>minimize</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="6" column="0"> + <property name="name"> + <cstring>enable_minimize</cstring> + </property> + <property name="text"> + <string>M&inimized</string> + </property> + </widget> + <widget class="KComboBox" row="8" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_placement</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="8" column="2"> + <item> + <property name="text"> + <string>Default</string> + </property> + </item> + <item> + <property name="text"> + <string>No Placement</string> + </property> + </item> + <item> + <property name="text"> + <string>Smart</string> + </property> + </item> + <item> + <property name="text"> + <string>Maximizing</string> + </property> + </item> + <item> + <property name="text"> + <string>Cascade</string> + </property> + </item> + <item> + <property name="text"> + <string>Centered</string> + </property> + </item> + <item> + <property name="text"> + <string>Random</string> + </property> + </item> + <item> + <property name="text"> + <string>Top-Left Corner</string> + </property> + </item> + <item> + <property name="text"> + <string>Under Mouse</string> + </property> + </item> + <item> + <property name="text"> + <string>On Main Window</string> + </property> + </item> + <property name="name"> + <cstring>placement</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="8" column="0"> + <property name="name"> + <cstring>enable_placement</cstring> + </property> + <property name="text"> + <string>P&lacement</string> + </property> + </widget> + <spacer row="9" column="1"> + <property name="name"> + <cstring>spacer31</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>16</height> + </size> + </property> + </spacer> + <widget class="KComboBox" row="7" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_shade</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </grid> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>TabPage</cstring> + </property> + <attribute name="title"> + <string>&Preferences</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="0" column="0"> + <property name="name"> + <cstring>enable_above</cstring> + </property> + <property name="text"> + <string>Keep &above</string> + </property> + </widget> + <widget class="QCheckBox" row="1" column="0"> + <property name="name"> + <cstring>enable_below</cstring> + </property> + <property name="text"> + <string>Keep &below</string> + </property> + </widget> + <widget class="QCheckBox" row="4" column="0"> + <property name="name"> + <cstring>enable_skippager</cstring> + </property> + <property name="text"> + <string>Skip pa&ger</string> + </property> + </widget> + <widget class="QCheckBox" row="3" column="0"> + <property name="name"> + <cstring>enable_skiptaskbar</cstring> + </property> + <property name="text"> + <string>Skip &taskbar</string> + </property> + </widget> + <widget class="QCheckBox" row="2" column="0"> + <property name="name"> + <cstring>enable_noborder</cstring> + </property> + <property name="text"> + <string>&No border</string> + </property> + </widget> + <widget class="QCheckBox" row="5" column="0"> + <property name="name"> + <cstring>enable_acceptfocus</cstring> + </property> + <property name="text"> + <string>Accept &focus</string> + </property> + </widget> + <widget class="QCheckBox" row="6" column="0"> + <property name="name"> + <cstring>enable_closeable</cstring> + </property> + <property name="text"> + <string>&Closeable</string> + </property> + </widget> + <widget class="QCheckBox" row="7" column="0"> + <property name="name"> + <cstring>enable_opacityactive</cstring> + </property> + <property name="text"> + <string>A&ctive opacity in %</string> + </property> + </widget> + <widget class="KComboBox" row="7" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_opacityactive</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KRestrictedLine" row="7" column="2" rowspan="1" colspan="2"> + <property name="name"> + <cstring>opacityactive</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="validChars"> + <string>0123456789</string> + </property> + </widget> + <spacer row="7" column="4" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer24</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>171</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="6" column="3" rowspan="1" colspan="3"> + <property name="name"> + <cstring>spacer36_7</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>290</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="5" column="3" rowspan="1" colspan="3"> + <property name="name"> + <cstring>spacer36_6</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>290</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="4" column="3" rowspan="1" colspan="3"> + <property name="name"> + <cstring>spacer36_5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>290</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="3" column="3" rowspan="1" colspan="3"> + <property name="name"> + <cstring>spacer36_4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>290</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="2" column="3" rowspan="1" colspan="3"> + <property name="name"> + <cstring>spacer36_3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>290</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="1" column="3" rowspan="1" colspan="3"> + <property name="name"> + <cstring>spacer36_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>290</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="0" column="3" rowspan="1" colspan="3"> + <property name="name"> + <cstring>spacer36</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>290</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QCheckBox" row="0" column="2"> + <property name="name"> + <cstring>above</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="1" column="2"> + <property name="name"> + <cstring>below</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="2" column="2"> + <property name="name"> + <cstring>noborder</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="3" column="2"> + <property name="name"> + <cstring>skiptaskbar</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="4" column="2"> + <property name="name"> + <cstring>skippager</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="5" column="2"> + <property name="name"> + <cstring>acceptfocus</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="6" column="2"> + <property name="name"> + <cstring>closeable</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="KComboBox" row="6" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_closeable</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="5" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_acceptfocus</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="4" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_skippager</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="3" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_skiptaskbar</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="2" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_noborder</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="1" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_below</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="0" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_above</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <spacer row="10" column="1"> + <property name="name"> + <cstring>spacer33</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>80</height> + </size> + </property> + </spacer> + <widget class="KComboBox" row="8" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_opacityinactive</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KRestrictedLine" row="8" column="2" rowspan="1" colspan="2"> + <property name="name"> + <cstring>opacityinactive</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="validChars"> + <string>0123456789</string> + </property> + </widget> + <spacer row="8" column="4" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer25</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>181</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QCheckBox" row="8" column="0"> + <property name="name"> + <cstring>enable_opacityinactive</cstring> + </property> + <property name="text"> + <string>I&nactive opacity in %</string> + </property> + </widget> + <widget class="QCheckBox" row="9" column="0"> + <property name="name"> + <cstring>enable_shortcut</cstring> + </property> + <property name="text"> + <string>Shortcut</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <widget class="KComboBox" row="9" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Initially</string> + </property> + </item> + <item> + <property name="text"> + <string>Remember</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Apply Now</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_shortcut</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QPushButton" row="9" column="5"> + <property name="name"> + <cstring>shortcut_edit</cstring> + </property> + <property name="text"> + <string>Edit...</string> + </property> + </widget> + <widget class="KRestrictedLine" row="9" column="2" rowspan="1" colspan="3"> + <property name="name"> + <cstring>shortcut</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </grid> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>TabPage</cstring> + </property> + <attribute name="title"> + <string>W&orkarounds</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="0" column="0"> + <property name="name"> + <cstring>enable_fsplevel</cstring> + </property> + <property name="text"> + <string>&Focus stealing prevention</string> + </property> + </widget> + <widget class="KComboBox" row="2" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_type</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="2" column="3"> + <item> + <property name="text"> + <string>Normal Window</string> + </property> + </item> + <item> + <property name="text"> + <string>Dialog Window</string> + </property> + </item> + <item> + <property name="text"> + <string>Utility Window</string> + </property> + </item> + <item> + <property name="text"> + <string>Dock (panel)</string> + </property> + </item> + <item> + <property name="text"> + <string>Toolbar</string> + </property> + </item> + <item> + <property name="text"> + <string>Torn-Off Menu</string> + </property> + </item> + <item> + <property name="text"> + <string>Splash Screen</string> + </property> + </item> + <item> + <property name="text"> + <string>Desktop</string> + </property> + </item> + <item> + <property name="text"> + <string>Override Type</string> + </property> + </item> + <item> + <property name="text"> + <string>Standalone Menubar</string> + </property> + </item> + <property name="name"> + <cstring>type</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="1" column="3"> + <item> + <property name="text"> + <string>Opaque</string> + </property> + </item> + <item> + <property name="text"> + <string>Transparent</string> + </property> + </item> + <property name="name"> + <cstring>moveresizemode</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="2" column="0"> + <property name="name"> + <cstring>enable_type</cstring> + </property> + <property name="text"> + <string>Window &type</string> + </property> + </widget> + <widget class="QCheckBox" row="1" column="0"> + <property name="name"> + <cstring>enable_moveresizemode</cstring> + </property> + <property name="text"> + <string>&Moving/resizing</string> + </property> + </widget> + <widget class="KComboBox" row="0" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_fsplevel</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="1" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_moveresizemode</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KComboBox" row="0" column="3"> + <item> + <property name="text"> + <string>None</string> + </property> + </item> + <item> + <property name="text"> + <string>Low</string> + </property> + </item> + <item> + <property name="text"> + <string>Normal</string> + </property> + </item> + <item> + <property name="text"> + <string>High</string> + </property> + </item> + <item> + <property name="text"> + <string>Extreme</string> + </property> + </item> + <property name="name"> + <cstring>fsplevel</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KRestrictedLine" row="5" column="3"> + <property name="name"> + <cstring>maxsize</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="validChars"> + <string>0123456789-+,xX:</string> + </property> + </widget> + <widget class="QCheckBox" row="4" column="0"> + <property name="name"> + <cstring>enable_minsize</cstring> + </property> + <property name="text"> + <string>M&inimum size</string> + </property> + </widget> + <widget class="KComboBox" row="4" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_minsize</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="5" column="0"> + <property name="name"> + <cstring>enable_maxsize</cstring> + </property> + <property name="text"> + <string>M&aximum size</string> + </property> + </widget> + <widget class="KRestrictedLine" row="4" column="3"> + <property name="name"> + <cstring>minsize</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="validChars"> + <string>0123456789-+,xX:</string> + </property> + </widget> + <widget class="KComboBox" row="5" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_maxsize</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="3" column="0"> + <property name="name"> + <cstring>enable_ignoreposition</cstring> + </property> + <property name="text"> + <string>Ignore requested &geometry</string> + </property> + </widget> + <widget class="KComboBox" row="3" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_ignoreposition</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="3" column="3"> + <property name="name"> + <cstring>ignoreposition</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <spacer row="8" column="2"> + <property name="name"> + <cstring>spacer35</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>160</height> + </size> + </property> + </spacer> + <widget class="QCheckBox" row="6" column="0"> + <property name="name"> + <cstring>enable_strictgeometry</cstring> + </property> + <property name="text"> + <string>Strictly obey geometry</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <widget class="KComboBox" row="6" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_strictgeometry</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QCheckBox" row="6" column="3"> + <property name="name"> + <cstring>strictgeometry</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="7" column="3"> + <property name="name"> + <cstring>disableglobalshortcuts</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string></string> + </property> + </widget> + <widget class="QCheckBox" row="7" column="0"> + <property name="name"> + <cstring>enable_disableglobalshortcuts</cstring> + </property> + <property name="text"> + <string>Block global shortcuts</string> + </property> + <property name="accel"> + <string></string> + </property> + </widget> + <widget class="KComboBox" row="7" column="1"> + <item> + <property name="text"> + <string>Do Not Affect</string> + </property> + </item> + <item> + <property name="text"> + <string>Force</string> + </property> + </item> + <item> + <property name="text"> + <string>Force Temporarily</string> + </property> + </item> + <property name="name"> + <cstring>rule_disableglobalshortcuts</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </grid> + </widget> + </widget> + </vbox> +</widget> +<customwidgets> +</customwidgets> +<connections> + <connection> + <sender>detect1</sender> + <signal>clicked()</signal> + <receiver>Form2</receiver> + <slot>detectClicked()</slot> + </connection> + <connection> + <sender>wmclass_match</sender> + <signal>activated(int)</signal> + <receiver>Form2</receiver> + <slot>wmclassMatchChanged()</slot> + </connection> + <connection> + <sender>role_match</sender> + <signal>activated(int)</signal> + <receiver>Form2</receiver> + <slot>roleMatchChanged()</slot> + </connection> + <connection> + <sender>title_match</sender> + <signal>activated(int)</signal> + <receiver>Form2</receiver> + <slot>titleMatchChanged()</slot> + </connection> + <connection> + <sender>extra_match</sender> + <signal>activated(int)</signal> + <receiver>Form2</receiver> + <slot>extraMatchChanged()</slot> + </connection> + <connection> + <sender>machine_match</sender> + <signal>activated(int)</signal> + <receiver>Form2</receiver> + <slot>machineMatchChanged()</slot> + </connection> + <connection> + <sender>shortcut_edit</sender> + <signal>clicked()</signal> + <receiver>Form2</receiver> + <slot>shortcutEditClicked()</slot> + </connection> +</connections> +<tabstops> + <tabstop>tabs</tabstop> + <tabstop>description</tabstop> + <tabstop>wmclass</tabstop> + <tabstop>whole_wmclass</tabstop> + <tabstop>wmclass_match</tabstop> + <tabstop>edit_reg_wmclass</tabstop> + <tabstop>role</tabstop> + <tabstop>role_match</tabstop> + <tabstop>edit_reg_role</tabstop> + <tabstop>detect1</tabstop> + <tabstop>types</tabstop> + <tabstop>title</tabstop> + <tabstop>title_match</tabstop> + <tabstop>edit_reg_title</tabstop> + <tabstop>extra</tabstop> + <tabstop>extra_match</tabstop> + <tabstop>edit_reg_extra</tabstop> + <tabstop>machine</tabstop> + <tabstop>machine_match</tabstop> + <tabstop>edit_reg_machine</tabstop> + <tabstop>enable_position</tabstop> + <tabstop>rule_position</tabstop> + <tabstop>position</tabstop> + <tabstop>enable_size</tabstop> + <tabstop>rule_size</tabstop> + <tabstop>size</tabstop> + <tabstop>enable_maximizehoriz</tabstop> + <tabstop>rule_maximizehoriz</tabstop> + <tabstop>maximizehoriz</tabstop> + <tabstop>enable_maximizevert</tabstop> + <tabstop>rule_maximizevert</tabstop> + <tabstop>maximizevert</tabstop> + <tabstop>enable_fullscreen</tabstop> + <tabstop>rule_fullscreen</tabstop> + <tabstop>fullscreen</tabstop> + <tabstop>enable_desktop</tabstop> + <tabstop>rule_desktop</tabstop> + <tabstop>desktop</tabstop> + <tabstop>enable_minimize</tabstop> + <tabstop>rule_minimize</tabstop> + <tabstop>minimize</tabstop> + <tabstop>enable_shade</tabstop> + <tabstop>rule_shade</tabstop> + <tabstop>shade</tabstop> + <tabstop>enable_placement</tabstop> + <tabstop>rule_placement</tabstop> + <tabstop>placement</tabstop> + <tabstop>enable_above</tabstop> + <tabstop>rule_above</tabstop> + <tabstop>above</tabstop> + <tabstop>enable_below</tabstop> + <tabstop>rule_below</tabstop> + <tabstop>below</tabstop> + <tabstop>enable_noborder</tabstop> + <tabstop>rule_noborder</tabstop> + <tabstop>noborder</tabstop> + <tabstop>enable_skiptaskbar</tabstop> + <tabstop>rule_skiptaskbar</tabstop> + <tabstop>skiptaskbar</tabstop> + <tabstop>enable_skippager</tabstop> + <tabstop>rule_skippager</tabstop> + <tabstop>skippager</tabstop> + <tabstop>enable_acceptfocus</tabstop> + <tabstop>rule_acceptfocus</tabstop> + <tabstop>acceptfocus</tabstop> + <tabstop>enable_closeable</tabstop> + <tabstop>rule_closeable</tabstop> + <tabstop>closeable</tabstop> + <tabstop>enable_opacityactive</tabstop> + <tabstop>rule_opacityactive</tabstop> + <tabstop>opacityactive</tabstop> + <tabstop>enable_opacityinactive</tabstop> + <tabstop>rule_opacityinactive</tabstop> + <tabstop>opacityinactive</tabstop> + <tabstop>enable_shortcut</tabstop> + <tabstop>rule_shortcut</tabstop> + <tabstop>shortcut</tabstop> + <tabstop>shortcut_edit</tabstop> + <tabstop>enable_fsplevel</tabstop> + <tabstop>rule_fsplevel</tabstop> + <tabstop>fsplevel</tabstop> + <tabstop>enable_moveresizemode</tabstop> + <tabstop>rule_moveresizemode</tabstop> + <tabstop>moveresizemode</tabstop> + <tabstop>enable_type</tabstop> + <tabstop>rule_type</tabstop> + <tabstop>type</tabstop> + <tabstop>enable_ignoreposition</tabstop> + <tabstop>rule_ignoreposition</tabstop> + <tabstop>ignoreposition</tabstop> + <tabstop>enable_minsize</tabstop> + <tabstop>rule_minsize</tabstop> + <tabstop>minsize</tabstop> + <tabstop>enable_maxsize</tabstop> + <tabstop>rule_maxsize</tabstop> + <tabstop>maxsize</tabstop> + <tabstop>enable_strictgeometry</tabstop> + <tabstop>rule_strictgeometry</tabstop> + <tabstop>strictgeometry</tabstop> + <tabstop>enable_disableglobalshortcuts</tabstop> + <tabstop>rule_disableglobalshortcuts</tabstop> + <tabstop>disableglobalshortcuts</tabstop> +</tabstops> +<slots> + <slot access="protected" specifier="pure virtual">detectClicked()</slot> + <slot access="protected" specifier="pure virtual">wmclassMatchChanged()</slot> + <slot access="protected" specifier="pure virtual">roleMatchChanged()</slot> + <slot access="protected" specifier="pure virtual">titleMatchChanged()</slot> + <slot access="protected" specifier="pure virtual">extraMatchChanged()</slot> + <slot access="protected" specifier="pure virtual">machineMatchChanged()</slot> + <slot access="protected" specifier="pure virtual">shortcutEditClicked()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/> +<includehints> + <includehint>kcombobox.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>klistbox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>krestrictedline.h</includehint> + <includehint>krestrictedline.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>krestrictedline.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>krestrictedline.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>krestrictedline.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>krestrictedline.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>krestrictedline.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kcombobox.h</includehint> +</includehints> +</UI> |