summaryrefslogtreecommitdiffstats
path: root/kwin/rules.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kwin/rules.cpp')
-rw-r--r--kwin/rules.cpp1077
1 files changed, 0 insertions, 1077 deletions
diff --git a/kwin/rules.cpp b/kwin/rules.cpp
deleted file mode 100644
index f3479f48f..000000000
--- a/kwin/rules.cpp
+++ /dev/null
@@ -1,1077 +0,0 @@
-/*****************************************************************
- KWin - the KDE window manager
- This file is part of the KDE project.
-
-Copyright (C) 2004 Lubos Lunak <l.lunak@kde.org>
-
-You can Freely distribute this program under the GNU General Public
-License. See the file "COPYING" for the exact licensing terms.
-******************************************************************/
-
-#include "rules.h"
-
-#include <fixx11h.h>
-#include <kconfig.h>
-#include <tqregexp.h>
-#include <ktempfile.h>
-#include <ksimpleconfig.h>
-#include <tqfile.h>
-
-#ifndef KCMRULES
-#include "client.h"
-#include "workspace.h"
-#endif
-
-namespace KWinInternal
-{
-
-Rules::Rules()
- : temporary_state( 0 )
- , wmclassmatch( UnimportantMatch )
- , wmclasscomplete( UnimportantMatch )
- , windowrolematch( UnimportantMatch )
- , titlematch( UnimportantMatch )
- , extrarolematch( UnimportantMatch )
- , clientmachinematch( UnimportantMatch )
- , types( NET::AllTypesMask )
- , placementrule( UnusedForceRule )
- , positionrule( UnusedSetRule )
- , sizerule( UnusedSetRule )
- , minsizerule( UnusedForceRule )
- , maxsizerule( UnusedForceRule )
- , opacityactiverule( UnusedForceRule )
- , opacityinactiverule( UnusedForceRule )
- , ignorepositionrule( UnusedForceRule )
- , desktoprule( UnusedSetRule )
- , typerule( UnusedForceRule )
- , maximizevertrule( UnusedSetRule )
- , maximizehorizrule( UnusedSetRule )
- , minimizerule( UnusedSetRule )
- , shaderule( UnusedSetRule )
- , skiptaskbarrule( UnusedSetRule )
- , skippagerrule( UnusedSetRule )
- , aboverule( UnusedSetRule )
- , belowrule( UnusedSetRule )
- , fullscreenrule( UnusedSetRule )
- , noborderrule( UnusedSetRule )
- , fsplevelrule( UnusedForceRule )
- , acceptfocusrule( UnusedForceRule )
- , moveresizemoderule( UnusedForceRule )
- , closeablerule( UnusedForceRule )
- , strictgeometryrule( UnusedForceRule )
- , shortcutrule( UnusedSetRule )
- , disableglobalshortcutsrule( UnusedForceRule )
- {
- }
-
-Rules::Rules( const TQString& str, bool temporary )
- : temporary_state( temporary ? 2 : 0 )
- {
- KTempFile file;
- TQFile* f = file.file();
- if( f != NULL )
- {
- TQCString s = str.utf8();
- f->writeBlock( s.data(), s.length());
- }
- file.close();
- KSimpleConfig cfg( file.name());
- readFromCfg( cfg );
- if( description.isEmpty())
- description = "temporary";
- file.unlink();
- }
-
-#define READ_MATCH_STRING( var, func ) \
- var = cfg.readEntry( #var ) func; \
- var##match = (StringMatch) TQMAX( FirstStringMatch, TQMIN( LastStringMatch, cfg.readNumEntry( #var "match" )));
-
-#define READ_SET_RULE( var, type, func ) \
- var = func ( cfg.read##type##Entry( #var )); \
- var##rule = readSetRule( cfg, #var "rule" );
-
-#define READ_SET_RULE_DEF( var, type, func, def ) \
- var = func ( cfg.read##type##Entry( #var, def )); \
- var##rule = readSetRule( cfg, #var "rule" );
-
-#define READ_SET_RULE_2( var, type, func, funcarg ) \
- var = func ( cfg.read##type##Entry( #var ), funcarg ); \
- var##rule = readSetRule( cfg, #var "rule" );
-
-#define READ_FORCE_RULE( var, type, func ) \
- var = func ( cfg.read##type##Entry( #var )); \
- var##rule = readForceRule( cfg, #var "rule" );
-
-#define READ_FORCE_RULE_2( var, type, func, funcarg ) \
- var = func ( cfg.read##type##Entry( #var ), funcarg ); \
- var##rule = readForceRule( cfg, #var "rule" );
-
-
-Rules::Rules( KConfig& cfg )
- : temporary_state( 0 )
- {
- readFromCfg( cfg );
- }
-
-static int limit0to4( int i ) { return QMAX( 0, QMIN( 4, i )); }
-
-void Rules::readFromCfg( KConfig& cfg )
- {
- description = cfg.readEntry( "Description" );
- if( description.isEmpty()) // capitalized first, lowercase for backwards compatibility
- description = cfg.readEntry( "description" );
- READ_MATCH_STRING( wmclass, .lower().latin1() );
- wmclasscomplete = cfg.readBoolEntry( "wmclasscomplete" );
- READ_MATCH_STRING( windowrole, .lower().latin1() );
- READ_MATCH_STRING( title, );
- READ_MATCH_STRING( extrarole, .lower().latin1() );
- READ_MATCH_STRING( clientmachine, .lower().latin1() );
- types = cfg.readUnsignedLongNumEntry( "types", NET::AllTypesMask );
- READ_FORCE_RULE_2( placement,, Placement::policyFromString, false );
- READ_SET_RULE_DEF( position, Point,, &invalidPoint );
- READ_SET_RULE( size, Size, );
- if( size.isEmpty() && sizerule != ( SetRule )Remember)
- sizerule = UnusedSetRule;
- READ_FORCE_RULE( minsize, Size, );
- if( !minsize.isValid())
- minsize = TQSize( 1, 1 );
- READ_FORCE_RULE( maxsize, Size, );
- if( maxsize.isEmpty())
- maxsize = TQSize( 32767, 32767 );
- READ_FORCE_RULE( opacityactive, Num, );
- if( opacityactive < 0 || opacityactive > 100 )
- opacityactive = 100;
- READ_FORCE_RULE( opacityinactive, Num, );
- if( opacityinactive < 0 || opacityinactive > 100 )
- opacityinactive = 100;
- READ_FORCE_RULE( ignoreposition, Bool, );
- READ_SET_RULE( desktop, Num, );
- type = readType( cfg, "type" );
- typerule = type != NET::Unknown ? readForceRule( cfg, "typerule" ) : UnusedForceRule;
- READ_SET_RULE( maximizevert, Bool, );
- READ_SET_RULE( maximizehoriz, Bool, );
- READ_SET_RULE( minimize, Bool, );
- READ_SET_RULE( shade, Bool, );
- READ_SET_RULE( skiptaskbar, Bool, );
- READ_SET_RULE( skippager, Bool, );
- READ_SET_RULE( above, Bool, );
- READ_SET_RULE( below, Bool, );
- READ_SET_RULE( fullscreen, Bool, );
- READ_SET_RULE( noborder, Bool, );
- READ_FORCE_RULE( fsplevel, Num, limit0to4 ); // fsp is 0-4
- READ_FORCE_RULE( acceptfocus, Bool, );
- READ_FORCE_RULE( moveresizemode, , Options::stringToMoveResizeMode );
- READ_FORCE_RULE( closeable, Bool, );
- READ_FORCE_RULE( strictgeometry, Bool, );
- READ_SET_RULE( shortcut, , );
- READ_FORCE_RULE( disableglobalshortcuts, Bool, );
- }
-
-#undef READ_MATCH_STRING
-#undef READ_SET_RULE
-#undef READ_SET_RULE_2
-#undef READ_FORCE_RULE
-#undef READ_FORCE_RULE_2
-
-#define WRITE_MATCH_STRING( var, cast, force ) \
- if( !var.isEmpty() || force ) \
- { \
- cfg.writeEntry( #var, cast var ); \
- cfg.writeEntry( #var "match", var##match ); \
- } \
- else \
- { \
- cfg.deleteEntry( #var ); \
- cfg.deleteEntry( #var "match" ); \
- }
-
-#define WRITE_SET_RULE( var, func ) \
- if( var##rule != UnusedSetRule ) \
- { \
- cfg.writeEntry( #var, func ( var )); \
- cfg.writeEntry( #var "rule", var##rule ); \
- } \
- else \
- { \
- cfg.deleteEntry( #var ); \
- cfg.deleteEntry( #var "rule" ); \
- }
-
-#define WRITE_FORCE_RULE( var, func ) \
- if( var##rule != UnusedForceRule ) \
- { \
- cfg.writeEntry( #var, func ( var )); \
- cfg.writeEntry( #var "rule", var##rule ); \
- } \
- else \
- { \
- cfg.deleteEntry( #var ); \
- cfg.deleteEntry( #var "rule" ); \
- }
-
-#define WRITE_WITH_DEFAULT( var, default ) \
- if( var != default ) \
- cfg.writeEntry( #var, var ); \
- else \
- cfg.deleteEntry( #var );
-
-
-void Rules::write( KConfig& cfg ) const
- {
- cfg.writeEntry( "Description", description );
- // always write wmclass
- WRITE_MATCH_STRING( wmclass, (const char*), true );
- cfg.writeEntry( "wmclasscomplete", wmclasscomplete );
- WRITE_MATCH_STRING( windowrole, (const char*), false );
- WRITE_MATCH_STRING( title,, false );
- WRITE_MATCH_STRING( extrarole, (const char*), false );
- WRITE_MATCH_STRING( clientmachine, (const char*), false );
- WRITE_WITH_DEFAULT( types, NET::AllTypesMask );
- WRITE_FORCE_RULE( placement, Placement::policyToString );
- WRITE_SET_RULE( position, );
- WRITE_SET_RULE( size, );
- WRITE_FORCE_RULE( minsize, );
- WRITE_FORCE_RULE( maxsize, );
- WRITE_FORCE_RULE( opacityactive, );
- WRITE_FORCE_RULE( opacityinactive, );
- WRITE_FORCE_RULE( ignoreposition, );
- WRITE_SET_RULE( desktop, );
- WRITE_FORCE_RULE( type, );
- WRITE_SET_RULE( maximizevert, );
- WRITE_SET_RULE( maximizehoriz, );
- WRITE_SET_RULE( minimize, );
- WRITE_SET_RULE( shade, );
- WRITE_SET_RULE( skiptaskbar, );
- WRITE_SET_RULE( skippager, );
- WRITE_SET_RULE( above, );
- WRITE_SET_RULE( below, );
- WRITE_SET_RULE( fullscreen, );
- WRITE_SET_RULE( noborder, );
- WRITE_FORCE_RULE( fsplevel, );
- WRITE_FORCE_RULE( acceptfocus, );
- WRITE_FORCE_RULE( moveresizemode, Options::moveResizeModeToString );
- WRITE_FORCE_RULE( closeable, );
- WRITE_FORCE_RULE( strictgeometry, );
- WRITE_SET_RULE( shortcut, );
- WRITE_FORCE_RULE( disableglobalshortcuts, );
- }
-
-#undef WRITE_MATCH_STRING
-#undef WRITE_SET_RULE
-#undef WRITE_FORCE_RULE
-#undef WRITE_WITH_DEFAULT
-
-// returns true if it doesn't affect anything
-bool Rules::isEmpty() const
- {
- return( placementrule == UnusedForceRule
- && positionrule == UnusedSetRule
- && sizerule == UnusedSetRule
- && minsizerule == UnusedForceRule
- && maxsizerule == UnusedForceRule
- && opacityactiverule == UnusedForceRule
- && opacityinactiverule == UnusedForceRule
- && ignorepositionrule == UnusedForceRule
- && desktoprule == UnusedSetRule
- && typerule == UnusedForceRule
- && maximizevertrule == UnusedSetRule
- && maximizehorizrule == UnusedSetRule
- && minimizerule == UnusedSetRule
- && shaderule == UnusedSetRule
- && skiptaskbarrule == UnusedSetRule
- && skippagerrule == UnusedSetRule
- && aboverule == UnusedSetRule
- && belowrule == UnusedSetRule
- && fullscreenrule == UnusedSetRule
- && noborderrule == UnusedSetRule
- && fsplevelrule == UnusedForceRule
- && acceptfocusrule == UnusedForceRule
- && moveresizemoderule == UnusedForceRule
- && closeablerule == UnusedForceRule
- && strictgeometryrule == UnusedForceRule
- && shortcutrule == UnusedSetRule
- && disableglobalshortcutsrule == UnusedForceRule );
- }
-
-Rules::SetRule Rules::readSetRule( KConfig& cfg, const TQString& key )
- {
- int v = cfg.readNumEntry( key );
- if( v >= DontAffect && v <= ForceTemporarily )
- return static_cast< SetRule >( v );
- return UnusedSetRule;
- }
-
-Rules::ForceRule Rules::readForceRule( KConfig& cfg, const TQString& key )
- {
- int v = cfg.readNumEntry( key );
- if( v == DontAffect || v == Force || v == ForceTemporarily )
- return static_cast< ForceRule >( v );
- return UnusedForceRule;
- }
-
-NET::WindowType Rules::readType( KConfig& cfg, const TQString& key )
- {
- int v = cfg.readNumEntry( key );
- if( v >= NET::Normal && v <= NET::Splash )
- return static_cast< NET::WindowType >( v );
- return NET::Unknown;
- }
-
-bool Rules::matchType( NET::WindowType match_type ) const
- {
- if( types != NET::AllTypesMask )
- {
- if( match_type == NET::Unknown )
- match_type = NET::Normal; // NET::Unknown->NET::Normal is only here for matching
- if( !NET::typeMatchesMask( match_type, types ))
- return false;
- }
- return true;
- }
-
-bool Rules::matchWMClass( const TQCString& match_class, const TQCString& match_name ) const
- {
- if( wmclassmatch != UnimportantMatch )
- { // TODO optimize?
- TQCString cwmclass = wmclasscomplete
- ? match_name + ' ' + match_class : match_class;
- if( wmclassmatch == RegExpMatch && TQRegExp( wmclass ).search( cwmclass ) == -1 )
- return false;
- if( wmclassmatch == ExactMatch && wmclass != cwmclass )
- return false;
- if( wmclassmatch == SubstringMatch && !cwmclass.contains( wmclass ))
- return false;
- }
- return true;
- }
-
-bool Rules::matchRole( const TQCString& match_role ) const
- {
- if( windowrolematch != UnimportantMatch )
- {
- if( windowrolematch == RegExpMatch && TQRegExp( windowrole ).search( match_role ) == -1 )
- return false;
- if( windowrolematch == ExactMatch && windowrole != match_role )
- return false;
- if( windowrolematch == SubstringMatch && !match_role.contains( windowrole ))
- return false;
- }
- return true;
- }
-
-bool Rules::matchTitle( const TQString& match_title ) const
- {
- if( titlematch != UnimportantMatch )
- {
- if( titlematch == RegExpMatch && TQRegExp( title ).search( match_title ) == -1 )
- return false;
- if( titlematch == ExactMatch && title != match_title )
- return false;
- if( titlematch == SubstringMatch && !match_title.contains( title ))
- return false;
- }
- return true;
- }
-
-bool Rules::matchClientMachine( const TQCString& match_machine ) const
- {
- if( clientmachinematch != UnimportantMatch )
- {
- // if it's localhost, check also "localhost" before checking hostname
- if( match_machine != "localhost" && isLocalMachine( match_machine )
- && matchClientMachine( "localhost" ))
- return true;
- if( clientmachinematch == RegExpMatch
- && TQRegExp( clientmachine ).search( match_machine ) == -1 )
- return false;
- if( clientmachinematch == ExactMatch
- && clientmachine != match_machine )
- return false;
- if( clientmachinematch == SubstringMatch
- && !match_machine.contains( clientmachine ))
- return false;
- }
- return true;
- }
-
-#ifndef KCMRULES
-bool Rules::match( const Client* c ) const
- {
- if( !matchType( c->windowType( true )))
- return false;
- if( !matchWMClass( c->resourceClass(), c->resourceName()))
- return false;
- if( !matchRole( c->windowRole()))
- return false;
- if( !matchTitle( c->caption( false )))
- return false;
- // TODO extrarole
- if( !matchClientMachine( c->wmClientMachine( false )))
- return false;
- return true;
- }
-
-bool Rules::update( Client* c )
- {
- // TODO check this setting is for this client ?
- bool updated = false;
- if( positionrule == ( SetRule )Remember)
- {
- if( !c->isFullScreen())
- {
- TQPoint new_pos = position;
- // don't use the position in the direction which is maximized
- if(( c->maximizeMode() & MaximizeHorizontal ) == 0 )
- new_pos.setX( c->pos().x());
- if(( c->maximizeMode() & MaximizeVertical ) == 0 )
- new_pos.setY( c->pos().y());
- updated = updated || position != new_pos;
- position = new_pos;
- }
- }
- if( sizerule == ( SetRule )Remember)
- {
- if( !c->isFullScreen())
- {
- TQSize new_size = size;
- // don't use the position in the direction which is maximized
- if(( c->maximizeMode() & MaximizeHorizontal ) == 0 )
- new_size.setWidth( c->size().width());
- if(( c->maximizeMode() & MaximizeVertical ) == 0 )
- new_size.setHeight( c->size().height());
- updated = updated || size != new_size;
- size = new_size;
- }
- }
- if( desktoprule == ( SetRule )Remember)
- {
- updated = updated || desktop != c->desktop();
- desktop = c->desktop();
- }
- if( maximizevertrule == ( SetRule )Remember)
- {
- updated = updated || maximizevert != bool( c->maximizeMode() & MaximizeVertical );
- maximizevert = c->maximizeMode() & MaximizeVertical;
- }
- if( maximizehorizrule == ( SetRule )Remember)
- {
- updated = updated || maximizehoriz != bool( c->maximizeMode() & MaximizeHorizontal );
- maximizehoriz = c->maximizeMode() & MaximizeHorizontal;
- }
- if( minimizerule == ( SetRule )Remember)
- {
- updated = updated || minimize != c->isMinimized();
- minimize = c->isMinimized();
- }
- if( shaderule == ( SetRule )Remember)
- {
- updated = updated || ( shade != ( c->shadeMode() != ShadeNone ));
- shade = c->shadeMode() != ShadeNone;
- }
- if( skiptaskbarrule == ( SetRule )Remember)
- {
- updated = updated || skiptaskbar != c->skipTaskbar();
- skiptaskbar = c->skipTaskbar();
- }
- if( skippagerrule == ( SetRule )Remember)
- {
- updated = updated || skippager != c->skipPager();
- skippager = c->skipPager();
- }
- if( aboverule == ( SetRule )Remember)
- {
- updated = updated || above != c->keepAbove();
- above = c->keepAbove();
- }
- if( belowrule == ( SetRule )Remember)
- {
- updated = updated || below != c->keepBelow();
- below = c->keepBelow();
- }
- if( fullscreenrule == ( SetRule )Remember)
- {
- updated = updated || fullscreen != c->isFullScreen();
- fullscreen = c->isFullScreen();
- }
- if( noborderrule == ( SetRule )Remember)
- {
- updated = updated || noborder != c->isUserNoBorder();
- noborder = c->isUserNoBorder();
- }
- if (opacityactiverule == ( ForceRule )Force)
- {
- updated = updated || (uint) (opacityactive/100.0*0xffffffff) != c->ruleOpacityActive();
- opacityactive = (uint)(((double)c->ruleOpacityActive())/0xffffffff*100);
- }
- if (opacityinactiverule == ( ForceRule )Force)
- {
- updated = updated || (uint) (opacityinactive/100.0*0xffffffff) != c->ruleOpacityInactive();
- opacityinactive = (uint)(((double)c->ruleOpacityInactive())/0xffffffff*100);
- }
- return updated;
- }
-
-#define APPLY_RULE( var, name, type ) \
-bool Rules::apply##name( type& arg, bool init ) const \
- { \
- if( checkSetRule( var##rule, init )) \
- arg = this->var; \
- return checkSetStop( var##rule ); \
- }
-
-#define APPLY_FORCE_RULE( var, name, type ) \
-bool Rules::apply##name( type& arg ) const \
- { \
- if( checkForceRule( var##rule )) \
- arg = this->var; \
- return checkForceStop( var##rule ); \
- }
-
-APPLY_FORCE_RULE( placement, Placement, Placement::Policy )
-
-bool Rules::applyGeometry( TQRect& rect, bool init ) const
- {
- TQPoint p = rect.topLeft();
- TQSize s = rect.size();
- bool ret = false; // no short-circuiting
- if( applyPosition( p, init ))
- {
- rect.moveTopLeft( p );
- ret = true;
- }
- if( applySize( s, init ))
- {
- rect.setSize( s );
- ret = true;
- }
- return ret;
- }
-
-bool Rules::applyPosition( TQPoint& pos, bool init ) const
- {
- if( this->position != invalidPoint && checkSetRule( positionrule, init ))
- pos = this->position;
- return checkSetStop( positionrule );
- }
-
-bool Rules::applySize( TQSize& s, bool init ) const
- {
- if( this->size.isValid() && checkSetRule( sizerule, init ))
- s = this->size;
- return checkSetStop( sizerule );
- }
-
-APPLY_FORCE_RULE( minsize, MinSize, TQSize )
-APPLY_FORCE_RULE( maxsize, MaxSize, TQSize )
-APPLY_FORCE_RULE( opacityactive, OpacityActive, int )
-APPLY_FORCE_RULE( opacityinactive, OpacityInactive, int )
-APPLY_FORCE_RULE( ignoreposition, IgnorePosition, bool )
-
-// the cfg. entry needs to stay named the say for backwards compatibility
-bool Rules::applyIgnoreGeometry( bool& ignore ) const
- {
- return applyIgnorePosition( ignore );
- }
-
-APPLY_RULE( desktop, Desktop, int )
-APPLY_FORCE_RULE( type, Type, NET::WindowType )
-
-bool Rules::applyMaximizeHoriz( MaximizeMode& mode, bool init ) const
- {
- if( checkSetRule( maximizehorizrule, init ))
- mode = static_cast< MaximizeMode >(( maximizehoriz ? MaximizeHorizontal : 0 ) | ( mode & MaximizeVertical ));
- return checkSetStop( maximizehorizrule );
- }
-
-bool Rules::applyMaximizeVert( MaximizeMode& mode, bool init ) const
- {
- if( checkSetRule( maximizevertrule, init ))
- mode = static_cast< MaximizeMode >(( maximizevert ? MaximizeVertical : 0 ) | ( mode & MaximizeHorizontal ));
- return checkSetStop( maximizevertrule );
- }
-
-APPLY_RULE( minimize, Minimize, bool )
-
-bool Rules::applyShade( ShadeMode& sh, bool init ) const
- {
- if( checkSetRule( shaderule, init ))
- {
- if( !this->shade )
- sh = ShadeNone;
- if( this->shade && sh == ShadeNone )
- sh = ShadeNormal;
- }
- return checkSetStop( shaderule );
- }
-
-APPLY_RULE( skiptaskbar, SkipTaskbar, bool )
-APPLY_RULE( skippager, SkipPager, bool )
-APPLY_RULE( above, KeepAbove, bool )
-APPLY_RULE( below, KeepBelow, bool )
-APPLY_RULE( fullscreen, FullScreen, bool )
-APPLY_RULE( noborder, NoBorder, bool )
-APPLY_FORCE_RULE( fsplevel, FSP, int )
-APPLY_FORCE_RULE( acceptfocus, AcceptFocus, bool )
-APPLY_FORCE_RULE( moveresizemode, MoveResizeMode, Options::MoveResizeMode )
-APPLY_FORCE_RULE( closeable, Closeable, bool )
-APPLY_FORCE_RULE( strictgeometry, StrictGeometry, bool )
-APPLY_RULE( shortcut, Shortcut, TQString )
-APPLY_FORCE_RULE( disableglobalshortcuts, DisableGlobalShortcuts, bool )
-
-
-#undef APPLY_RULE
-#undef APPLY_FORCE_RULE
-
-bool Rules::isTemporary() const
- {
- return temporary_state > 0;
- }
-
-bool Rules::discardTemporary( bool force )
- {
- if( temporary_state == 0 ) // not temporary
- return false;
- if( force || --temporary_state == 0 ) // too old
- {
- delete this;
- return true;
- }
- return false;
- }
-
-#define DISCARD_USED_SET_RULE( var ) \
- do { \
- if( var##rule == ( SetRule ) ApplyNow || ( withdrawn && var##rule == ( SetRule ) ForceTemporarily )) \
- var##rule = UnusedSetRule; \
- } while( false )
-#define DISCARD_USED_FORCE_RULE( var ) \
- do { \
- if( withdrawn && var##rule == ( ForceRule ) ForceTemporarily ) \
- var##rule = UnusedForceRule; \
- } while( false )
-
-void Rules::discardUsed( bool withdrawn )
- {
- DISCARD_USED_FORCE_RULE( placement );
- DISCARD_USED_SET_RULE( position );
- DISCARD_USED_SET_RULE( size );
- DISCARD_USED_FORCE_RULE( minsize );
- DISCARD_USED_FORCE_RULE( maxsize );
- DISCARD_USED_FORCE_RULE( opacityactive );
- DISCARD_USED_FORCE_RULE( opacityinactive );
- DISCARD_USED_FORCE_RULE( ignoreposition );
- DISCARD_USED_SET_RULE( desktop );
- DISCARD_USED_FORCE_RULE( type );
- DISCARD_USED_SET_RULE( maximizevert );
- DISCARD_USED_SET_RULE( maximizehoriz );
- DISCARD_USED_SET_RULE( minimize );
- DISCARD_USED_SET_RULE( shade );
- DISCARD_USED_SET_RULE( skiptaskbar );
- DISCARD_USED_SET_RULE( skippager );
- DISCARD_USED_SET_RULE( above );
- DISCARD_USED_SET_RULE( below );
- DISCARD_USED_SET_RULE( fullscreen );
- DISCARD_USED_SET_RULE( noborder );
- DISCARD_USED_FORCE_RULE( fsplevel );
- DISCARD_USED_FORCE_RULE( acceptfocus );
- DISCARD_USED_FORCE_RULE( moveresizemode );
- DISCARD_USED_FORCE_RULE( closeable );
- DISCARD_USED_FORCE_RULE( strictgeometry );
- DISCARD_USED_SET_RULE( shortcut );
- DISCARD_USED_FORCE_RULE( disableglobalshortcuts );
- }
-#undef DISCARD_USED_SET_RULE
-#undef DISCARD_USED_FORCE_RULE
-
-#endif
-
-#ifndef NDEBUG
-kdbgstream& operator<<( kdbgstream& stream, const Rules* r )
- {
- return stream << "[" << r->description << ":" << r->wmclass << "]" ;
- }
-#endif
-
-#ifndef KCMRULES
-void WindowRules::discardTemporary()
- {
- TQValueVector< Rules* >::Iterator it2 = rules.begin();
- for( TQValueVector< Rules* >::Iterator it = rules.begin();
- it != rules.end();
- )
- {
- if( (*it)->discardTemporary( true ))
- ++it;
- else
- {
- *it2++ = *it++;
- }
- }
- rules.erase( it2, rules.end());
- }
-
-void WindowRules::update( Client* c )
- {
- bool updated = false;
- for( TQValueVector< Rules* >::ConstIterator it = rules.begin();
- it != rules.end();
- ++it )
- if( (*it)->update( c )) // no short-circuiting here
- updated = true;
- if( updated )
- Workspace::self()->rulesUpdated();
- }
-
-#define CHECK_RULE( rule, type ) \
-type WindowRules::check##rule( type arg, bool init ) const \
- { \
- if( rules.count() == 0 ) \
- return arg; \
- type ret = arg; \
- for( TQValueVector< Rules* >::ConstIterator it = rules.begin(); \
- it != rules.end(); \
- ++it ) \
- { \
- if( (*it)->apply##rule( ret, init )) \
- break; \
- } \
- return ret; \
- }
-
-#define CHECK_FORCE_RULE( rule, type ) \
-type WindowRules::check##rule( type arg ) const \
- { \
- if( rules.count() == 0 ) \
- return arg; \
- type ret = arg; \
- for( TQValueVector< Rules* >::ConstIterator it = rules.begin(); \
- it != rules.end(); \
- ++it ) \
- { \
- if( (*it)->apply##rule( ret )) \
- break; \
- } \
- return ret; \
- }
-
-CHECK_FORCE_RULE( Placement, Placement::Policy )
-
-TQRect WindowRules::checkGeometry( TQRect rect, bool init ) const
- {
- return TQRect( checkPosition( rect.topLeft(), init ), checkSize( rect.size(), init ));
- }
-
-CHECK_RULE( Position, TQPoint )
-CHECK_RULE( Size, TQSize )
-CHECK_FORCE_RULE( MinSize, TQSize )
-CHECK_FORCE_RULE( MaxSize, TQSize )
-CHECK_FORCE_RULE( OpacityActive, int )
-CHECK_FORCE_RULE( OpacityInactive, int )
-CHECK_FORCE_RULE( IgnorePosition, bool )
-
-bool WindowRules::checkIgnoreGeometry( bool ignore ) const
- {
- return checkIgnorePosition( ignore );
- }
-
-CHECK_RULE( Desktop, int )
-CHECK_FORCE_RULE( Type, NET::WindowType )
-CHECK_RULE( MaximizeVert, KDecorationDefines::MaximizeMode )
-CHECK_RULE( MaximizeHoriz, KDecorationDefines::MaximizeMode )
-
-KDecorationDefines::MaximizeMode WindowRules::checkMaximize( MaximizeMode mode, bool init ) const
- {
- bool vert = checkMaximizeVert( mode, init ) & MaximizeVertical;
- bool horiz = checkMaximizeHoriz( mode, init ) & MaximizeHorizontal;
- return static_cast< MaximizeMode >(( vert ? MaximizeVertical : 0 ) | ( horiz ? MaximizeHorizontal : 0 ));
- }
-
-CHECK_RULE( Minimize, bool )
-CHECK_RULE( Shade, ShadeMode )
-CHECK_RULE( SkipTaskbar, bool )
-CHECK_RULE( SkipPager, bool )
-CHECK_RULE( KeepAbove, bool )
-CHECK_RULE( KeepBelow, bool )
-CHECK_RULE( FullScreen, bool )
-CHECK_RULE( NoBorder, bool )
-CHECK_FORCE_RULE( FSP, int )
-CHECK_FORCE_RULE( AcceptFocus, bool )
-CHECK_FORCE_RULE( MoveResizeMode, Options::MoveResizeMode )
-CHECK_FORCE_RULE( Closeable, bool )
-CHECK_FORCE_RULE( StrictGeometry, bool )
-CHECK_RULE( Shortcut, TQString )
-CHECK_FORCE_RULE( DisableGlobalShortcuts, bool )
-
-#undef CHECK_RULE
-#undef CHECK_FORCE_RULE
-
-// Client
-
-void Client::setupWindowRules( bool ignore_temporary )
- {
- client_rules = workspace()->findWindowRules( this, ignore_temporary );
- // check only after getting the rules, because there may be a rule forcing window type
- if( isTopMenu()) // TODO cannot have restrictions
- client_rules = WindowRules();
- }
-
-// Applies Force, ForceTemporarily and ApplyNow rules
-// Used e.g. after the rules have been modified using the kcm.
-void Client::applyWindowRules()
- {
- checkAndSetInitialRuledOpacity();
- // apply force rules
- // Placement - does need explicit update, just like some others below
- // Geometry : setGeometry() doesn't check rules
- TQRect orig_geom = TQRect( pos(), sizeForClientSize( clientSize())); // handle shading
- TQRect geom = client_rules.checkGeometry( orig_geom );
- if( geom != orig_geom )
- setGeometry( geom );
- // MinSize, MaxSize handled by Geometry
- // IgnorePosition
- setDesktop( desktop());
- // Type
- maximize( maximizeMode());
- // Minimize : functions don't check, and there are two functions
- if( client_rules.checkMinimize( isMinimized()))
- minimize();
- else
- unminimize();
- setShade( shadeMode());
- setSkipTaskbar( skipTaskbar(), true );
- setSkipPager( skipPager());
- setKeepAbove( keepAbove());
- setKeepBelow( keepBelow());
- setFullScreen( isFullScreen(), true );
- setUserNoBorder( isUserNoBorder());
- // FSP
- // AcceptFocus :
- if( workspace()->mostRecentlyActivatedClient() == this
- && !client_rules.checkAcceptFocus( true ))
- workspace()->activateNextClient( this );
- // MoveResizeMode
- // Closeable
- TQSize s = adjustedSize();
- if( s != size())
- resizeWithChecks( s );
- // StrictGeometry
- setShortcut( rules()->checkShortcut( shortcut().toString()));
- // see also Client::setActive()
- if( isActive())
- workspace()->disableGlobalShortcutsForClient( rules()->checkDisableGlobalShortcuts( false ));
- }
-
-void Client::updateWindowRules()
- {
- if( !isManaged()) // not fully setup yet
- return;
- if( workspace()->rulesUpdatesDisabled())
- return;
- client_rules.update( this );
- }
-
-void Client::finishWindowRules()
- {
- updateWindowRules();
- client_rules = WindowRules();
- }
-
-void Client::checkAndSetInitialRuledOpacity()
-//apply twin-rules for window-translucency upon hitting apply or starting to manage client
- {
- int tmp;
-
- //active translucency
- tmp = -1;
- tmp = rules()->checkOpacityActive(tmp);
- if( tmp != -1 ) //rule did apply and returns valid value
- {
- rule_opacity_active = (uint)((tmp/100.0)*0xffffffff);
- }
- else
- rule_opacity_active = 0;
-
- //inactive translucency
- tmp = -1;
- tmp = rules()->checkOpacityInactive(tmp);
- if( tmp != -1 ) //rule did apply and returns valid value
- {
- rule_opacity_inactive = (uint)((tmp/100.0)*0xffffffff);
- }
- else
- rule_opacity_inactive = 0;
-
- return;
-
- if( isDock() )
- //workaround for docks, as they don't have active/inactive settings and don't aut, therefore we take only the active one...
- {
- uint tmp = rule_opacity_active ? rule_opacity_active : options->dockOpacity;
- setOpacity(tmp < 0xFFFFFFFF && (rule_opacity_active || options->translucentDocks), tmp);
- }
- else
- updateOpacity();
- }
-
-// Workspace
-
-WindowRules Workspace::findWindowRules( const Client* c, bool ignore_temporary )
- {
- TQValueVector< Rules* > ret;
- for( TQValueList< Rules* >::Iterator it = rules.begin();
- it != rules.end();
- )
- {
- if( ignore_temporary && (*it)->isTemporary())
- {
- ++it;
- continue;
- }
- if( (*it)->match( c ))
- {
- Rules* rule = *it;
- kdDebug( 1212 ) << "Rule found:" << rule << ":" << c << endl;
- if( rule->isTemporary())
- it = rules.remove( it );
- else
- ++it;
- ret.append( rule );
- continue;
- }
- ++it;
- }
- return WindowRules( ret );
- }
-
-void Workspace::editWindowRules( Client* c, bool whole_app )
- {
- writeWindowRules();
- TQStringList args;
- args << "--wid" << TQString::number( c->window());
- if( whole_app )
- args << "--whole-app";
- KApplication::tdeinitExec( "twin_rules_dialog", args );
- }
-
-void Workspace::loadWindowRules()
- {
- while( !rules.isEmpty())
- {
- delete rules.front();
- rules.pop_front();
- }
- KConfig cfg( "twinrulesrc", true );
- cfg.setGroup( "General" );
- int count = cfg.readNumEntry( "count" );
- for( int i = 1;
- i <= count;
- ++i )
- {
- cfg.setGroup( TQString::number( i ));
- Rules* rule = new Rules( cfg );
- rules.append( rule );
- }
- }
-
-void Workspace::writeWindowRules()
- {
- rulesUpdatedTimer.stop();
- KConfig cfg( "twinrulesrc" );
- TQStringList groups = cfg.groupList();
- for( TQStringList::ConstIterator it = groups.begin();
- it != groups.end();
- ++it )
- cfg.deleteGroup( *it );
- cfg.setGroup( "General" );
- cfg.writeEntry( "count", rules.count());
- int i = 1;
- for( TQValueList< Rules* >::ConstIterator it = rules.begin();
- it != rules.end();
- ++it )
- {
- if( (*it)->isTemporary())
- continue;
- cfg.setGroup( TQString::number( i ));
- (*it)->write( cfg );
- ++i;
- }
- }
-
-void Workspace::gotTemporaryRulesMessage( const TQString& message )
- {
- bool was_temporary = false;
- for( TQValueList< Rules* >::ConstIterator it = rules.begin();
- it != rules.end();
- ++it )
- if( (*it)->isTemporary())
- was_temporary = true;
- Rules* rule = new Rules( message, true );
- rules.prepend( rule ); // highest priority first
- if( !was_temporary )
- TQTimer::singleShot( 60000, this, TQT_SLOT( cleanupTemporaryRules()));
- }
-
-void Workspace::cleanupTemporaryRules()
- {
- bool has_temporary = false;
- for( TQValueList< Rules* >::Iterator it = rules.begin();
- it != rules.end();
- )
- {
- if( (*it)->discardTemporary( false ))
- it = rules.remove( it );
- else
- {
- if( (*it)->isTemporary())
- has_temporary = true;
- ++it;
- }
- }
- if( has_temporary )
- TQTimer::singleShot( 60000, this, TQT_SLOT( cleanupTemporaryRules()));
- }
-
-void Workspace::discardUsedWindowRules( Client* c, bool withdrawn )
- {
- bool updated = false;
- for( TQValueList< Rules* >::Iterator it = rules.begin();
- it != rules.end();
- )
- {
- if( c->rules()->contains( *it ))
- {
- updated = true;
- (*it)->discardUsed( withdrawn );
- if( (*it)->isEmpty())
- {
- c->removeRule( *it );
- Rules* r = *it;
- it = rules.remove( it );
- delete r;
- continue;
- }
- }
- ++it;
- }
- if( updated )
- rulesUpdated();
- }
-
-void Workspace::rulesUpdated()
- {
- rulesUpdatedTimer.start( 1000, true );
- }
-
-void Workspace::disableRulesUpdates( bool disable )
- {
- rules_updates_disabled = disable;
- if( !disable )
- for( ClientList::ConstIterator it = clients.begin();
- it != clients.end();
- ++it )
- (*it)->updateWindowRules();
- }
-
-#endif
-
-} // namespace