From 76f21da02b375aace817ce11e260ebbc8ab48842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Wed, 9 Jun 2004 08:29:35 +0000 Subject: [PATCH] KWin rule for adjusting focus stealing prevention level. svn path=/trunk/kdebase/kwin/; revision=318991 --- activation.cpp | 25 +++++++++++++------------ rules.cpp | 16 +++++++++++++++- rules.h | 3 +++ 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/activation.cpp b/activation.cpp index 0153d57543..92d5ec3ec7 100644 --- a/activation.cpp +++ b/activation.cpp @@ -26,6 +26,7 @@ License. See the file "COPYING" for the exact licensing terms. #include "notifications.h" #include "atoms.h" #include "group.h" +#include "rules.h" extern Time qt_x_time; @@ -465,8 +466,8 @@ bool Workspace::allowClientActivation( const Client* c, Time time, bool focus_in // 4 - extreme - no window gets focus without user intervention if( time == -1U ) time = c->userTime(); - if( session_saving - && options->focusStealingPreventionLevel <= 2 ) // <= normal + int level = c->rules()->checkFSP( options->focusStealingPreventionLevel ); + if( session_saving && level <= 2 ) // <= normal { return true; } @@ -481,9 +482,9 @@ bool Workspace::allowClientActivation( const Client* c, Time time, bool focus_in } if( time == 0 ) // explicitly asked not to get focus return false; - if( options->focusStealingPreventionLevel == 0 ) // none + if( level == 0 ) // none return true; - if( options->focusStealingPreventionLevel == 4 ) // extreme + if( level == 4 ) // extreme return false; if( c->ignoreFocusStealing()) return true; @@ -498,7 +499,7 @@ bool Workspace::allowClientActivation( const Client* c, Time time, bool focus_in kdDebug( 1212 ) << "Activation: Belongs to active application" << endl; return true; } - if( options->focusStealingPreventionLevel == 3 ) // high + if( level == 3 ) // high return false; if( time == -1U ) // no time known if( session_active ) @@ -506,14 +507,14 @@ bool Workspace::allowClientActivation( const Client* c, Time time, bool focus_in else { kdDebug( 1212 ) << "Activation: No timestamp at all" << endl; - if( options->focusStealingPreventionLevel == 1 ) // low + if( level == 1 ) // low return true; // no timestamp at all, don't activate - because there's also creation timestamp // done on CreateNotify, this case should happen only in case application // maps again already used window, i.e. this won't happen after app startup return false; } - // options->focusStealingPreventionLevel == 2 // normal + // level == 2 // normal Time user_time = ac->userTime(); kdDebug( 1212 ) << "Activation, compared:" << c << ":" << time << ":" << user_time << ":" << ( timestampCompare( time, user_time ) >= 0 ) << endl; @@ -526,15 +527,15 @@ bool Workspace::allowClientActivation( const Client* c, Time time, bool focus_in // to the same application bool Workspace::allowFullClientRaising( const Client* c, Time time ) { - if( session_saving - && options->focusStealingPreventionLevel <= 2 ) // <= normal + int level = c->rules()->checkFSP( options->focusStealingPreventionLevel ); + if( session_saving && level <= 2 ) // <= normal { return true; } Client* ac = mostRecentlyActivatedClient(); - if( options->focusStealingPreventionLevel == 0 ) // none + if( level == 0 ) // none return true; - if( options->focusStealingPreventionLevel == 4 ) // extreme + if( level == 4 ) // extreme return false; if( ac == NULL || ac->isDesktop()) { @@ -549,7 +550,7 @@ bool Workspace::allowFullClientRaising( const Client* c, Time time ) kdDebug( 1212 ) << "Raising: Belongs to active application" << endl; return true; } - if( options->focusStealingPreventionLevel == 3 ) // high + if( level == 3 ) // high return false; Time user_time = ac->userTime(); kdDebug( 1212 ) << "Raising, compared:" << time << ":" << user_time diff --git a/rules.cpp b/rules.cpp index e027920632..c68845a977 100644 --- a/rules.cpp +++ b/rules.cpp @@ -46,6 +46,7 @@ WindowRules::WindowRules() , belowrule( DontCareRule ) , fullscreenrule( DontCareRule ) , noborderrule( DontCareRule ) + , fspleveladjustrule( DontCareRule ) { } @@ -60,7 +61,11 @@ WindowRules::WindowRules() #define READ_SET_RULE_2( var, type, func, funcarg ) \ var = func ( cfg.read##type##Entry( #var ), funcarg ); \ var##rule = readRule( cfg, #var "rule" ); - + +#define READ_FORCE_RULE( var, type, func ) \ + var = func ( cfg.read##type##Entry( #var )); \ + var##rule = readForceRule( cfg, #var "rule" ); + WindowRules::WindowRules( KConfig& cfg ) { wmclass = cfg.readEntry( "wmclass" ).lower().latin1(); @@ -95,12 +100,14 @@ WindowRules::WindowRules( KConfig& cfg ) READ_SET_RULE( below, Bool, ); READ_SET_RULE( fullscreen, Bool, ); READ_SET_RULE( noborder, Bool, ); + READ_FORCE_RULE( fspleveladjust, Num, ); kdDebug() << "READ RULE:" << wmclass << endl; } #undef READ_MATCH_STRING #undef READ_SET_RULE #undef READ_SET_RULE_2 +#undef READ_FORCE_RULE #define WRITE_MATCH_STRING( var, cast ) \ if( !var.isEmpty()) \ @@ -161,6 +168,7 @@ void WindowRules::write( KConfig& cfg ) const WRITE_SET_RULE( below, ); WRITE_SET_RULE( fullscreen, ); WRITE_SET_RULE( noborder, ); + WRITE_SET_RULE( fspleveladjust, ); } #undef WRITE_MATCH_STRING @@ -365,6 +373,12 @@ bool WindowRules::checkNoBorder( bool noborder, bool init ) const return checkRule( noborderrule, init ) ? this->noborder : noborder; } +int WindowRules::checkFSP( int fsp ) const + { + if( !checkForceRule( fspleveladjustrule )) + return fsp; + return QMIN( 4, QMAX( 0, fsp + fspleveladjust )); + } // Client diff --git a/rules.h b/rules.h index babaf96c02..c444826e0a 100644 --- a/rules.h +++ b/rules.h @@ -62,6 +62,7 @@ class WindowRules bool checkKeepBelow( bool below, bool init = false ) const; bool checkFullScreen( bool fs, bool init = false ) const; bool checkNoBorder( bool noborder, bool init = false ) const; + int checkFSP( int fsp ) const; private: static SettingRule readRule( KConfig&, const QString& key ); static SettingRule readForceRule( KConfig&, const QString& key ); @@ -114,6 +115,8 @@ class WindowRules SettingRule fullscreenrule; bool noborder; SettingRule noborderrule; + int fspleveladjust; + SettingRule fspleveladjustrule; }; inline