kwin Library API Documentation

ruleswidget.cpp

00001 /*
00002  * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org>
00003  *
00004  *  This program is free software; you can redistribute it and/or modify
00005  *  it under the terms of the GNU General Public License as published by
00006  *  the Free Software Foundation; either version 2 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  This program is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU General Public License
00015  *  along with this program; if not, write to the Free Software
00016  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017  */
00018 
00019 #include "ruleswidget.h"
00020 
00021 #include <klineedit.h>
00022 #include <krestrictedline.h>
00023 #include <kcombobox.h>
00024 #include <qcheckbox.h>
00025 #include <kpushbutton.h>
00026 #include <qlabel.h>
00027 #include <kwinmodule.h>
00028 #include <klocale.h>
00029 #include <qregexp.h>
00030 #include <qwhatsthis.h>
00031 #include <assert.h>
00032 #include <kmessagebox.h>
00033 
00034 #include "../../rules.h"
00035 
00036 #include "detectwidget.h"
00037 
00038 namespace KWinInternal
00039 {
00040 
00041 #define SETUP( var, type ) \
00042     connect( enable_##var, SIGNAL( toggled( bool )), rule_##var, SLOT( setEnabled( bool ))); \
00043     connect( enable_##var, SIGNAL( toggled( bool )), this, SLOT( updateEnable##var())); \
00044     connect( rule_##var, SIGNAL( activated( int )), this, SLOT( updateEnable##var())); \
00045     QWhatsThis::add( enable_##var, enableDesc ); \
00046     QWhatsThis::add( rule_##var, type##RuleDesc );
00047 
00048 RulesWidget::RulesWidget( QWidget* parent, const char* name )
00049 : RulesWidgetBase( parent, name )
00050 , detect_dlg( NULL )
00051     {
00052     QString enableDesc =
00053         i18n( "Enable this checkbox to alter this window property for the specified window(s)." );
00054     QString setRuleDesc =
00055         i18n( "Specify how the window property should be affected:<ul>"
00056               "<li><em>Do Not Affect:</em> The window property will not be affected and therefore"
00057               " the default handling for it will be used. Specifying this will block more generic"
00058               " window settings from taking effect.</li>"
00059               "<li><em>Apply Initially:</em> The window property will be only set to the given value"
00060               " after the window is created. No further changes will be affected.</li>"
00061               "<li><em>Remember:</em> The value of the window property will be remembered and every time"
00062               " time the window is created, the last remembered value will be applied.</li>"
00063               "<li><em>Force:</em> The window property will be always forced to the given value.</li></ul>" );
00064     QString forceRuleDesc =
00065         i18n( "Specify how the window property should be affected:<ul>"
00066               "<li><em>Do Not Affect:</em> The window property will not be affected and therefore"
00067               " the default handling for it will be used. Specifying this will block more generic"
00068               " window settings from taking effect.</li>"
00069               "<li><em>Force:</em> The window property will be always forced to the given value.</li></ul>" );
00070     // window tabs have enable signals done in designer
00071     // geometry tab
00072     SETUP( position, set );
00073     SETUP( size, set );
00074     SETUP( desktop, set );
00075     SETUP( maximizehoriz, set );
00076     SETUP( maximizevert, set );
00077     SETUP( minimize, set );
00078     SETUP( shade, set );
00079     SETUP( fullscreen, set );
00080     SETUP( placement, force );
00081     // preferences tab
00082     SETUP( above, set );
00083     SETUP( below, set );
00084     SETUP( noborder, set );
00085     SETUP( skiptaskbar, set );
00086     SETUP( skippager, set );
00087     SETUP( acceptfocus, force );
00088     SETUP( closeable, force );
00089     // workarounds tab
00090     SETUP( fsplevel, force );
00091     SETUP( moveresizemode, force );
00092     SETUP( type, force );
00093     SETUP( ignoreposition, force );
00094     SETUP( minsize, force );
00095     SETUP( maxsize, force );
00096     KWinModule module;
00097     int i;
00098     for( i = 1;
00099          i <= module.numberOfDesktops();
00100          ++i )
00101         desktop->insertItem( QString::number( i ).rightJustify( 2 ) + ":" + module.desktopName( i ));
00102     for(;
00103          i <= 16;
00104          ++i )
00105         desktop->insertItem( QString::number( i ).rightJustify( 2 ));
00106     desktop->insertItem( i18n( "All Desktops" ));
00107     }
00108 
00109 #undef SETUP
00110 
00111 #define UPDATE_ENABLE_SLOT( var ) \
00112 void RulesWidget::updateEnable##var() \
00113     { \
00114     /* leave the label readable label_##var->setEnabled( enable_##var->isChecked() && rule_##var->currentItem() != 0 );*/ \
00115     var->setEnabled( enable_##var->isChecked() && rule_##var->currentItem() != 0 ); \
00116     }
00117 
00118 // geometry tab
00119 UPDATE_ENABLE_SLOT( position )
00120 UPDATE_ENABLE_SLOT( size )
00121 UPDATE_ENABLE_SLOT( desktop )
00122 UPDATE_ENABLE_SLOT( maximizehoriz )
00123 UPDATE_ENABLE_SLOT( maximizevert )
00124 UPDATE_ENABLE_SLOT( minimize )
00125 UPDATE_ENABLE_SLOT( shade )
00126 UPDATE_ENABLE_SLOT( fullscreen )
00127 UPDATE_ENABLE_SLOT( placement )
00128 // preferences tab
00129 UPDATE_ENABLE_SLOT( above )
00130 UPDATE_ENABLE_SLOT( below )
00131 UPDATE_ENABLE_SLOT( noborder )
00132 UPDATE_ENABLE_SLOT( skiptaskbar )
00133 UPDATE_ENABLE_SLOT( skippager )
00134 UPDATE_ENABLE_SLOT( acceptfocus )
00135 UPDATE_ENABLE_SLOT( closeable )
00136 // workarounds tab
00137 UPDATE_ENABLE_SLOT( fsplevel )
00138 UPDATE_ENABLE_SLOT( moveresizemode )
00139 UPDATE_ENABLE_SLOT( type )
00140 UPDATE_ENABLE_SLOT( ignoreposition )
00141 UPDATE_ENABLE_SLOT( minsize )
00142 UPDATE_ENABLE_SLOT( maxsize )
00143 
00144 #undef UPDATE_ENABLE_SLOT
00145 
00146 static const int set_rule_to_combo[] =
00147     {
00148     0, // Unused
00149     0, // Don't Affect
00150     3, // Force
00151     1, // Apply
00152     2, // Remember
00153     };
00154 
00155 static const Rules::SetRule combo_to_set_rule[] =
00156     {
00157     ( Rules::SetRule )Rules::DontAffect,
00158     ( Rules::SetRule )Rules::Apply,
00159     ( Rules::SetRule )Rules::Remember,
00160     ( Rules::SetRule )Rules::Force
00161     };
00162 
00163 static const int force_rule_to_combo[] =
00164     {
00165     0, // Unused
00166     0, // Don't Affect
00167     1 // Force
00168     };
00169 
00170 static const Rules::ForceRule combo_to_force_rule[] =
00171     {
00172     ( Rules::ForceRule )Rules::DontAffect,
00173     ( Rules::ForceRule )Rules::Force
00174     };
00175 
00176 static QString positionToStr( const QPoint& p )
00177     {
00178     if( p == invalidPoint )
00179         return QString::null;
00180     return QString::number( p.x()) + "," + QString::number( p.y());
00181     }
00182 
00183 static QPoint strToPosition( const QString& str )
00184     {            // two numbers, with + or -, separated by any of , x X :
00185     QRegExp reg( "\\s*([+-]?[0-9]*)\\s*[,xX:]\\s*([+-]?[0-9]*)\\s*" );
00186     if( !reg.exactMatch( str ))
00187         return invalidPoint;
00188     return QPoint( reg.cap( 1 ).toInt(), reg.cap( 2 ).toInt());
00189     }
00190 
00191 static QString sizeToStr( const QSize& s )
00192     {
00193     if( !s.isValid())
00194         return QString::null;
00195     return QString::number( s.width()) + "," + QString::number( s.height());
00196     }
00197 
00198 static QSize strToSize( const QString& str )
00199     {            // two numbers, with + or -, separated by any of , x X :
00200     QRegExp reg( "\\s*([+-]?[0-9]*)\\s*[,xX:]\\s*([+-]?[0-9]*)\\s*" );
00201     if( !reg.exactMatch( str ))
00202         return QSize();
00203     return QSize( reg.cap( 1 ).toInt(), reg.cap( 2 ).toInt());
00204     }
00205 
00206 
00207 static int desktopToCombo( int desktop )
00208     {
00209     if( desktop >= 1 && desktop <= 16 )
00210         return desktop - 1;
00211     return 16; // on all desktops
00212     }
00213 
00214 static int comboToDesktop( int val )
00215     {
00216     if( val == 16 )
00217         return NET::OnAllDesktops;
00218     return val + 1;
00219     }
00220 
00221 static int placementToCombo( Placement::Policy placement )
00222     {
00223     static const int conv[] = 
00224         {
00225         1, // NoPlacement
00226         0, // Default
00227         5, // Random
00228         2, // Smart
00229         3, // Cascade
00230         4, // Centered
00231         6, // ZeroCornered
00232         7, // UnderMouse
00233         8 // OnMainWindow
00234         };
00235     return conv[ placement ];
00236     }
00237 
00238 static Placement::Policy comboToPlacement( int val )
00239     {
00240     static const Placement::Policy conv[] =
00241         {
00242         Placement::Default,
00243         Placement::NoPlacement,
00244         Placement::Smart,
00245         Placement::Cascade,
00246         Placement::Centered,
00247         Placement::Random,
00248         Placement::ZeroCornered,
00249         Placement::UnderMouse,
00250         Placement::OnMainWindow
00251         };
00252     return conv[ val ];
00253     }
00254 
00255 static int moveresizeToCombo( Options::MoveResizeMode mode )
00256     {
00257     return mode == Options::Opaque ? 0 : 1;
00258     }
00259 
00260 static Options::MoveResizeMode comboToMoveResize( int val )
00261     {
00262     return val == 0 ? Options::Opaque : Options::Transparent;
00263     }
00264 
00265 static int typeToCombo( NET::WindowType type )
00266     {
00267     if( type < NET::Normal || type > NET::Splash )
00268         return 0; // Normal
00269     static const int conv[] =
00270         {
00271         0, // Normal
00272         7, // Desktop
00273     3, // Dock
00274     4, // Toolbar
00275         5, // Menu
00276     1, // Dialog
00277     8, // Override
00278         9, // TopMenu
00279     2, // Utility
00280     6  // Splash
00281         };
00282     return conv[ type ];
00283     }
00284 
00285 static NET::WindowType comboToType( int val )
00286     {
00287     static const NET::WindowType conv[] =
00288         {
00289         NET::Normal,
00290         NET::Dialog,
00291         NET::Utility,
00292         NET::Dock,
00293         NET::Toolbar,
00294         NET::Menu,
00295         NET::Splash,
00296         NET::Desktop,
00297         NET::Override,
00298         NET::TopMenu
00299         };
00300     return conv[ val ];
00301     }
00302 
00303 #define GENERIC_RULE( var, func, Type, type, uimethod, uimethod0 ) \
00304     if( rules->var##rule == Rules::Unused##Type##Rule ) \
00305         { \
00306         enable_##var->setChecked( false ); \
00307         rule_##var->setCurrentItem( 0 ); \
00308         var->uimethod0; \
00309         updateEnable##var(); \
00310         } \
00311     else \
00312         { \
00313         enable_##var->setChecked( true ); \
00314         rule_##var->setCurrentItem( type##_rule_to_combo[ rules->var##rule ] ); \
00315         var->uimethod( func( rules->var )); \
00316         updateEnable##var(); \
00317         }
00318 
00319 #define CHECKBOX_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, setChecked, setChecked( false ))
00320 #define LINEEDIT_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, setText, setText( "" ))
00321 #define COMBOBOX_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, setCurrentItem, setCurrentItem( 0 ))
00322 #define CHECKBOX_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, setChecked, setChecked( false ))
00323 #define LINEEDIT_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, setText, setText( "" ))
00324 #define COMBOBOX_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, setCurrentItem, setCurrentItem( 0 ))
00325 
00326 void RulesWidget::setRules( Rules* rules )
00327     {
00328     Rules tmp;
00329     if( rules == NULL )
00330         rules = &tmp; // empty
00331     description->setText( rules->description );
00332     wmclass->setText( rules->wmclass );
00333     whole_wmclass->setChecked( rules->wmclasscomplete );
00334     wmclass_match->setCurrentItem( rules->wmclassmatch );
00335     wmclassMatchChanged();
00336     role->setText( rules->windowrole );
00337     role_match->setCurrentItem( rules->windowrolematch );
00338     roleMatchChanged();
00339     types->setSelected( 0, rules->types & NET::NormalMask );
00340     types->setSelected( 1, rules->types & NET::DialogMask );
00341     types->setSelected( 2, rules->types & NET::UtilityMask );
00342     types->setSelected( 3, rules->types & NET::DockMask );
00343     types->setSelected( 4, rules->types & NET::ToolbarMask );
00344     types->setSelected( 5, rules->types & NET::MenuMask );
00345     types->setSelected( 6, rules->types & NET::SplashMask );
00346     types->setSelected( 7, rules->types & NET::DesktopMask );
00347     types->setSelected( 8, rules->types & NET::OverrideMask );
00348     types->setSelected( 9, rules->types & NET::TopMenuMask );
00349     title->setText( rules->title );
00350     title_match->setCurrentItem( rules->titlematch );
00351     titleMatchChanged();
00352     extra->setText( rules->extrarole );
00353     extra_match->setCurrentItem( rules->extrarolematch );
00354     extraMatchChanged();
00355     machine->setText( rules->clientmachine );
00356     machine_match->setCurrentItem( rules->clientmachinematch );
00357     machineMatchChanged();
00358     LINEEDIT_SET_RULE( position, positionToStr );
00359     LINEEDIT_SET_RULE( size, sizeToStr );
00360     COMBOBOX_SET_RULE( desktop, desktopToCombo );
00361     CHECKBOX_SET_RULE( maximizehoriz, );
00362     CHECKBOX_SET_RULE( maximizevert, );
00363     CHECKBOX_SET_RULE( minimize, );
00364     CHECKBOX_SET_RULE( shade, );
00365     CHECKBOX_SET_RULE( fullscreen, );
00366     COMBOBOX_FORCE_RULE( placement, placementToCombo );
00367     CHECKBOX_SET_RULE( above, );
00368     CHECKBOX_SET_RULE( below, );
00369     CHECKBOX_SET_RULE( noborder, );
00370     CHECKBOX_SET_RULE( skiptaskbar, );
00371     CHECKBOX_SET_RULE( skippager, );
00372     CHECKBOX_FORCE_RULE( acceptfocus, );
00373     CHECKBOX_FORCE_RULE( closeable, );
00374     COMBOBOX_FORCE_RULE( fsplevel, );
00375     COMBOBOX_FORCE_RULE( moveresizemode, moveresizeToCombo );
00376     COMBOBOX_FORCE_RULE( type, typeToCombo );
00377     CHECKBOX_FORCE_RULE( ignoreposition, );
00378     LINEEDIT_FORCE_RULE( minsize, sizeToStr );
00379     LINEEDIT_FORCE_RULE( maxsize, sizeToStr );
00380     }
00381 
00382 #undef GENERIC_RULE
00383 #undef CHECKBOX_SET_RULE
00384 #undef LINEEDIT_SET_RULE
00385 #undef COMBOBOX_SET_RULE
00386 #undef CHECKBOX_FORCE_RULE
00387 #undef LINEEDIT_FORCE_RULE
00388 #undef COMBOBOX_FORCE_RULE
00389 
00390 #define GENERIC_RULE( var, func, Type, type, uimethod ) \
00391     if( enable_##var->isChecked()) \
00392         { \
00393         rules->var##rule = combo_to_##type##_rule[ rule_##var->currentItem() ]; \
00394         rules->var = func( var->uimethod()); \
00395         } \
00396     else \
00397         rules->var##rule = Rules::Unused##Type##Rule;
00398 
00399 #define CHECKBOX_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, isChecked )
00400 #define LINEEDIT_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, text )
00401 #define COMBOBOX_SET_RULE( var, func ) GENERIC_RULE( var, func, Set, set, currentItem )
00402 #define CHECKBOX_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, isChecked )
00403 #define LINEEDIT_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, text )
00404 #define COMBOBOX_FORCE_RULE( var, func ) GENERIC_RULE( var, func, Force, force, currentItem )
00405 
00406 Rules* RulesWidget::rules() const
00407     {
00408     Rules* rules = new Rules();
00409     rules->description = description->text();
00410     rules->wmclass = wmclass->text().utf8();
00411     rules->wmclasscomplete = whole_wmclass->isChecked();
00412     rules->wmclassmatch = static_cast< Rules::StringMatch >( wmclass_match->currentItem());
00413     rules->windowrole = role->text().utf8();
00414     rules->windowrolematch = static_cast< Rules::StringMatch >( role_match->currentItem());
00415     rules->types = 0;
00416     bool all_types = true;
00417     for( unsigned int i = 0;
00418          i < types->count();
00419          ++i )
00420         if( !types->isSelected( i ))
00421             all_types = false;
00422     if( all_types ) // if all types are selected, use AllTypesMask (for future expansion)
00423         rules->types = NET::AllTypesMask;
00424     else
00425         {
00426         rules->types |= types->isSelected( 0 ) ? NET::NormalMask : 0;
00427         rules->types |= types->isSelected( 1 ) ? NET::DialogMask : 0;
00428         rules->types |= types->isSelected( 2 ) ? NET::UtilityMask : 0;
00429         rules->types |= types->isSelected( 3 ) ? NET::DockMask : 0;
00430         rules->types |= types->isSelected( 4 ) ? NET::ToolbarMask : 0;
00431         rules->types |= types->isSelected( 5 ) ? NET::MenuMask : 0;
00432         rules->types |= types->isSelected( 6 ) ? NET::SplashMask : 0;
00433         rules->types |= types->isSelected( 7 ) ? NET::DesktopMask : 0;
00434         rules->types |= types->isSelected( 8 ) ? NET::OverrideMask : 0;
00435         rules->types |= types->isSelected( 9 ) ? NET::TopMenuMask : 0;
00436         }
00437     rules->title = title->text();
00438     rules->titlematch = static_cast< Rules::StringMatch >( title_match->currentItem());
00439     rules->extrarole = extra->text().utf8();
00440     rules->extrarolematch = static_cast< Rules::StringMatch >( extra_match->currentItem());
00441     rules->clientmachine = machine->text().utf8();
00442     rules->clientmachinematch = static_cast< Rules::StringMatch >( machine_match->currentItem());
00443     LINEEDIT_SET_RULE( position, strToPosition );
00444     LINEEDIT_SET_RULE( size, strToSize );
00445     COMBOBOX_SET_RULE( desktop, comboToDesktop );
00446     CHECKBOX_SET_RULE( maximizehoriz, );
00447     CHECKBOX_SET_RULE( maximizevert, );
00448     CHECKBOX_SET_RULE( minimize, );
00449     CHECKBOX_SET_RULE( shade, );
00450     CHECKBOX_SET_RULE( fullscreen, );
00451     COMBOBOX_FORCE_RULE( placement, comboToPlacement );
00452     CHECKBOX_SET_RULE( above, );
00453     CHECKBOX_SET_RULE( below, );
00454     CHECKBOX_SET_RULE( noborder, );
00455     CHECKBOX_SET_RULE( skiptaskbar, );
00456     CHECKBOX_SET_RULE( skippager, );
00457     CHECKBOX_FORCE_RULE( acceptfocus, );
00458     CHECKBOX_FORCE_RULE( closeable, );
00459     COMBOBOX_FORCE_RULE( fsplevel, );
00460     COMBOBOX_FORCE_RULE( moveresizemode, comboToMoveResize );
00461     COMBOBOX_FORCE_RULE( type, comboToType );
00462     CHECKBOX_FORCE_RULE( ignoreposition, );
00463     LINEEDIT_FORCE_RULE( minsize, strToSize );
00464     LINEEDIT_FORCE_RULE( maxsize, strToSize );
00465     return rules;
00466     }
00467 
00468 #undef GENERIC_RULE
00469 #undef CHECKBOX_SET_RULE
00470 #undef LINEEDIT_SET_RULE
00471 #undef COMBOBOX_SET_RULE
00472 #undef CHECKBOX_FORCE_RULE
00473 #undef LINEEDIT_FORCE_RULE
00474 #undef COMBOBOX_FORCE_RULE
00475 
00476 #define STRING_MATCH_COMBO( type ) \
00477 void RulesWidget::type##MatchChanged() \
00478     { \
00479     edit_reg_##type->setEnabled( type##_match->currentItem() == Rules::RegExpMatch ); \
00480     type->setEnabled( type##_match->currentItem() != Rules::UnimportantMatch ); \
00481     }
00482 
00483 STRING_MATCH_COMBO( wmclass )
00484 STRING_MATCH_COMBO( role )
00485 STRING_MATCH_COMBO( title )
00486 STRING_MATCH_COMBO( extra )
00487 STRING_MATCH_COMBO( machine )
00488 
00489 #undef STRING_MATCH_COMBO
00490 
00491 void RulesWidget::detectClicked()
00492     {
00493     assert( detect_dlg == NULL );
00494     detect_dlg = new DetectDialog;
00495     connect( detect_dlg, SIGNAL( detectionDone( bool )), this, SLOT( detected( bool )));
00496     detect_dlg->detect( 0 );
00497     }
00498 
00499 bool RulesWidget::setWindow( WId w )
00500     {
00501     assert( detect_dlg == NULL );
00502     detect_dlg_ok = false;
00503     detect_dlg = new DetectDialog;
00504     connect( detect_dlg, SIGNAL( detectionDone( bool )), this, SLOT( detected( bool )));
00505     detect_dlg->detect( w );
00506     return detect_dlg_ok;
00507     }
00508 
00509 #define GENERIC_PREFILL( var, func, info, uimethod ) \
00510     if( !enable_##var->isChecked()) \
00511         { \
00512         var->uimethod( func( info )); \
00513         }
00514 
00515 #define CHECKBOX_PREFILL( var, func, info ) GENERIC_PREFILL( var, func, info, setChecked )
00516 #define LINEEDIT_PREFILL( var, func, info ) GENERIC_PREFILL( var, func, info, setText )
00517 #define COMBOBOX_PREFILL( var, func, info ) GENERIC_PREFILL( var, func, info, setCurrentItem )
00518 
00519 void RulesWidget::detected( bool ok )
00520     {
00521     if( ok )
00522         {
00523         wmclass->setText( detect_dlg->selectedClass());
00524         wmclass_match->setCurrentItem( Rules::ExactMatch );
00525         wmclassMatchChanged(); // grrr
00526         whole_wmclass->setChecked( detect_dlg->selectedWholeClass());
00527         role->setText( detect_dlg->selectedRole());
00528         role_match->setCurrentItem( detect_dlg->selectedRole().isEmpty()
00529             ? Rules::UnimportantMatch : Rules::ExactMatch );
00530         roleMatchChanged();
00531         if( detect_dlg->selectedWholeApp())
00532             {
00533             for( unsigned int i = 0;
00534                  i < types->count();
00535                  ++i )
00536                 types->setSelected( i, true );
00537             }
00538         else
00539             {
00540             NET::WindowType type = detect_dlg->selectedType();
00541             for( unsigned int i = 0;
00542                  i < types->count();
00543                  ++i )
00544                 types->setSelected( i, false );
00545             types->setSelected( typeToCombo( type ), true );
00546             }
00547         title->setText( detect_dlg->selectedTitle());
00548         title_match->setCurrentItem( detect_dlg->titleMatch());
00549         titleMatchChanged();
00550         machine->setText( detect_dlg->selectedMachine());
00551         machine_match->setCurrentItem( Rules::UnimportantMatch );
00552         machineMatchChanged();
00553         // prefill values from to window to settings which already set
00554         const KWin::WindowInfo& info = detect_dlg->windowInfo();
00555         LINEEDIT_PREFILL( position, positionToStr, info.frameGeometry().topLeft() );
00556         LINEEDIT_PREFILL( size, sizeToStr, info.frameGeometry().size() );
00557         COMBOBOX_PREFILL( desktop, desktopToCombo, info.desktop() );
00558         CHECKBOX_PREFILL( maximizehoriz,, info.state() & NET::MaxHoriz );
00559         CHECKBOX_PREFILL( maximizevert,, info.state() & NET::MaxVert );
00560         CHECKBOX_PREFILL( minimize,, info.isMinimized() );
00561         CHECKBOX_PREFILL( shade,, info.state() & NET::Shaded );
00562         CHECKBOX_PREFILL( fullscreen,, info.state() & NET::FullScreen );
00563         //COMBOBOX_PREFILL( placement, placementToCombo );
00564         CHECKBOX_PREFILL( above,, info.state() & NET::KeepAbove );
00565         CHECKBOX_PREFILL( below,, info.state() & NET::KeepBelow );
00566         // noborder is only internal KWin information, so let's guess
00567         CHECKBOX_PREFILL( noborder,, info.frameGeometry() == info.geometry() );
00568         CHECKBOX_PREFILL( skiptaskbar,, info.state() & NET::SkipTaskbar );
00569         CHECKBOX_PREFILL( skippager,, info.state() & NET::SkipPager );
00570         //CHECKBOX_PREFILL( acceptfocus, );
00571         //CHECKBOX_PREFILL( closeable, );
00572         //COMBOBOX_PREFILL( fsplevel, );
00573         //COMBOBOX_PREFILL( moveresizemode, moveresizeToCombo );
00574         COMBOBOX_PREFILL( type, typeToCombo, info.windowType( SUPPORTED_WINDOW_TYPES_MASK ) );
00575         //CHECKBOX_PREFILL( ignoreposition, );
00576         LINEEDIT_PREFILL( minsize, sizeToStr, info.frameGeometry().size() );
00577         LINEEDIT_PREFILL( maxsize, sizeToStr, info.frameGeometry().size() );
00578         }
00579     delete detect_dlg;
00580     detect_dlg = NULL;
00581     detect_dlg_ok = ok;
00582     }
00583 
00584 #undef GENERIC_PREFILL
00585 #undef CHECKBOX_PREFILL
00586 #undef LINEEDIT_PREFILL
00587 #undef COMBOBOX_PREFILL
00588 
00589 bool RulesWidget::finalCheck()
00590     {
00591     if( description->text().isEmpty())
00592         {
00593         if( !wmclass->text().isEmpty())
00594             description->setText( i18n( "Settings for %1" ).arg( wmclass->text()));
00595         else
00596             description->setText( i18n( "Unnamed entry" ));
00597         }
00598     bool all_types = true;
00599     for( unsigned int i = 0;
00600          i < types->count();
00601          ++i )
00602         if( !types->isSelected( i ))
00603             all_types = false;
00604     if( wmclass_match->currentItem() == Rules::UnimportantMatch && all_types )
00605         {
00606         if( KMessageBox::warningContinueCancel( topLevelWidget(),
00607             i18n( "You have specified the window class as unimportant.\n"
00608                   "This means the settings will possibly apply to windows from all applications. "
00609                   "If you really want to create a generic setting, it is recommended you at least "
00610                   "limit the window types to avoid special window types." )) != KMessageBox::Continue )
00611             return false;
00612         }
00613     return true;
00614     }
00615 
00616 RulesDialog::RulesDialog( QWidget* parent, const char* name )
00617 : KDialogBase( parent, name, true, "", Ok | Cancel )
00618     {
00619     widget = new RulesWidget( this );
00620     setMainWidget( widget );
00621     }
00622 
00623 Rules* RulesDialog::edit( Rules* r, WId w )
00624     {
00625     rules = r;
00626     widget->setRules( rules );
00627     if( rules == NULL && w != 0 ) // creating new one, read data from window
00628         if( !widget->setWindow( w ))
00629             return rules;
00630     exec();
00631     return rules;
00632     }
00633 
00634 void RulesDialog::accept()
00635     {
00636     if( !widget->finalCheck())
00637         return;
00638     rules = widget->rules();
00639     KDialogBase::accept();
00640     }
00641 
00642 } // namespace
00643 
00644 #include "ruleswidget.moc"
KDE Logo
This file is part of the documentation for kwin Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Sep 25 20:35:06 2004 by doxygen 1.3.8-20040913 written by Dimitri van Heesch, © 1997-2003