diff --git a/kcmkwin/kwinrules/main.cpp b/kcmkwin/kwinrules/main.cpp index 32c3550afd..41ccfa5123 100644 --- a/kcmkwin/kwinrules/main.cpp +++ b/kcmkwin/kwinrules/main.cpp @@ -66,7 +66,7 @@ static void saveRules( const Q3ValueList< Rules* >& rules ) } } -static Rules* findRule( const Q3ValueList< Rules* >& rules, Window wid ) +static Rules* findRule( const Q3ValueList< Rules* >& rules, Window wid, bool whole_app ) { KWin::WindowInfo info = KWin::windowInfo( wid, NET::WMName | NET::WMWindowType, @@ -102,29 +102,37 @@ static Rules* findRule( const Q3ValueList< Rules* >& rules, Window wid ) quality += 1; generic = false; // this can be considered specific enough (old X apps) } - if( rule->windowrolematch != Rules::UnimportantMatch ) + if( !whole_app ) { - quality += rule->windowrolematch == Rules::ExactMatch ? 5 : 1; - generic = false; + 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( int bit = 1; + bit < 1 << 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; } - if( rule->titlematch != Rules::UnimportantMatch ) + else { - quality += rule->titlematch == Rules::ExactMatch ? 3 : 1; - generic = false; - } - if( rule->types != NET::AllTypesMask ) - { - int bits = 0; - for( int bit = 1; - bit < 1 << 31; - bit <<= 1 ) - if( rule->types & bit ) - ++bits; - if( bits == 1 ) + if( rule->types == NET::AllTypesMask ) quality += 2; } - if( generic ) // ignore generic rules, use only the ones that are for this window - continue; if( !rule->matchType( type ) || !rule->matchRole( role ) || !rule->matchTitle( title ) @@ -139,7 +147,33 @@ static Rules* findRule( const Q3ValueList< Rules* >& rules, Window wid ) if( best_match != NULL ) return best_match; Rules* ret = new Rules; - ret->description = i18n( "Settings for %1" ).arg( QString::fromLatin1( wmclass_class ) ); + if( whole_app ) + { + ret->description = i18n( "Application settings for %1" ).arg( QString::fromLatin1( 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( QString::fromLatin1( wmclass_class )); if( type == NET::Unknown ) ret->types = NET::NormalMask; else @@ -195,11 +229,11 @@ static Rules* findRule( const Q3ValueList< Rules* >& rules, Window wid ) return ret; } -static int edit( Window wid ) +static int edit( Window wid, bool whole_app ) { Q3ValueList< Rules* > rules; loadRules( rules ); - Rules* orig_rule = findRule( rules, wid ); + 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 ); @@ -232,6 +266,7 @@ static const KCmdLineOptions options[] = { // no need for I18N_NOOP(), this is not supposed to be used directly { "wid ", "WId of the window for special window settings.", 0 }, + { "whole-app", "Whether the settings should affect all windows of the application.", 0 }, KCmdLineLastOption }; @@ -246,11 +281,12 @@ KDE_EXPORT int kdemain( int argc, char* argv[] ) KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); bool id_ok = false; Window id = args->getOption( "wid" ).toULongLong( &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 ); + return KWinInternal::edit( id, whole_app ); } diff --git a/lib/kdecoration.h b/lib/kdecoration.h index 5455a4b495..b49201eda6 100644 --- a/lib/kdecoration.h +++ b/lib/kdecoration.h @@ -99,7 +99,8 @@ public: FullScreenOp, NoBorderOp, NoOp, - SetupWindowShortcutOp + SetupWindowShortcutOp, + ApplicationRulesOp ///< @since 3.5 }; /** * Basic color types that should be recognized by all decoration styles. diff --git a/rules.cpp b/rules.cpp index 6224fb6aca..a8d52a040c 100644 --- a/rules.cpp +++ b/rules.cpp @@ -940,10 +940,14 @@ WindowRules Workspace::findWindowRules( const Client* c, bool ignore_temporary ) return WindowRules( ret ); } -void Workspace::editWindowRules( Client* c ) +void Workspace::editWindowRules( Client* c, bool whole_app ) { writeWindowRules(); - KApplication::kdeinitExec( "kwin_rules_dialog", QStringList() << "--wid" << QString::number( c->window())); + QStringList args; + args << "--wid" << QString::number( c->window()); + if( whole_app ) + args << "--whole-app"; + KApplication::kdeinitExec( "kwin_rules_dialog", args ); } void Workspace::loadWindowRules() diff --git a/useractions.cpp b/useractions.cpp index bdfa5efc9a..dc81c69180 100644 --- a/useractions.cpp +++ b/useractions.cpp @@ -68,6 +68,7 @@ Q3PopupMenu* Workspace::clientPopup() advanced_popup->insertItem( SmallIconSet("key_bindings"), i18n("Window &Shortcut...")+'\t'+keys->shortcut("Setup Window Shortcut").seq(0).toString(), Options::SetupWindowShortcutOp ); advanced_popup->insertItem( SmallIconSet( "wizard" ), i18n("&Special Window Settings..."), Options::WindowRulesOp ); + advanced_popup->insertItem( SmallIconSet( "wizard" ), i18n("&Special Application Settings..."), Options::ApplicationRulesOp ); popup->insertItem(i18n("Ad&vanced"), advanced_popup ); desk_popup_index = popup->count(); @@ -427,7 +428,10 @@ void Workspace::performWindowOperation( Client* c, Options::WindowOperation op ) c->performMouseCommand( Options::MouseShade, QCursor::pos()); break; case Options::WindowRulesOp: - editWindowRules( c ); + editWindowRules( c, false ); + break; + case Options::ApplicationRulesOp: + editWindowRules( c, true ); break; case Options::SetupWindowShortcutOp: setupWindowShortcut( c ); diff --git a/workspace.h b/workspace.h index 0ac20c23ac..a2b4751909 100644 --- a/workspace.h +++ b/workspace.h @@ -482,7 +482,7 @@ class Workspace : public QObject, public KWinInterface, public KDecorationDefine void loadSessionInfo(); void loadWindowRules(); - void editWindowRules( Client* ); + void editWindowRules( Client* c, bool whole_app ); QList session; QList rules;