Client::is_sticky_ is dead and would be gone, if it weren't for BIC.

No need to this duplication of Client::desk == NET::OnAllDesktops.
It's simple, desk == NET::OnAllDesktops - sticky
             desk == 0 - not mapped yet
             desk something else - the desktop the window is on

svn path=/trunk/kdebase/kwin/; revision=196529
This commit is contained in:
Luboš Luňák 2002-12-30 20:34:38 +00:00
parent fc34663134
commit 5100e63107
3 changed files with 53 additions and 69 deletions

View file

@ -509,7 +509,8 @@ Client::Client( Workspace *ws, WId w, QWidget *parent, const char *name, WFlags
// set the initial mapping state // set the initial mapping state
setMappingState( WithdrawnState ); setMappingState( WithdrawnState );
desk = -1; // and no desktop yet desk = 0; // and no desktop yet
is_sticky_ = FALSE;
mode = Nowhere; mode = Nowhere;
buttonDown = FALSE; buttonDown = FALSE;
@ -520,7 +521,6 @@ Client::Client( Workspace *ws, WId w, QWidget *parent, const char *name, WFlags
shaded = FALSE; shaded = FALSE;
hover_unshade = FALSE; hover_unshade = FALSE;
active = FALSE; active = FALSE;
is_sticky = FALSE;
stays_on_top = FALSE; stays_on_top = FALSE;
is_shape = FALSE; is_shape = FALSE;
may_move = TRUE; may_move = TRUE;
@ -545,6 +545,8 @@ Client::Client( Workspace *ws, WId w, QWidget *parent, const char *name, WFlags
cmap = None; cmap = None;
// TODO shouldn't all this go to manage() ?
bool mresize, mmove, mminimize, mmaximize, mclose; bool mresize, mmove, mminimize, mmaximize, mclose;
if( Motif::funcFlags( win, mresize, mmove, mminimize, mmaximize, mclose )) { if( Motif::funcFlags( win, mresize, mmove, mminimize, mmaximize, mclose )) {
may_resize = mresize; may_resize = mresize;
@ -578,9 +580,6 @@ Client::Client( Workspace *ws, WId w, QWidget *parent, const char *name, WFlags
fetchName(); fetchName();
d->windowRole = getStringProperty( w, qt_window_role ); d->windowRole = getStringProperty( w, qt_window_role );
if ( mainClient()->isSticky() )
setSticky( TRUE );
// window wants to stay on top? // window wants to stay on top?
stays_on_top = ( info->state() & NET::StaysOnTop) != 0 || ( transient_for == None && transient_for_defined ); stays_on_top = ( info->state() & NET::StaysOnTop) != 0 || ( transient_for == None && transient_for_defined );
@ -588,12 +587,6 @@ Client::Client( Workspace *ws, WId w, QWidget *parent, const char *name, WFlags
skip_taskbar = ( info->state() & NET::SkipTaskbar) != 0; skip_taskbar = ( info->state() & NET::SkipTaskbar) != 0;
skip_pager = ( info->state() & NET::SkipPager) != 0; skip_pager = ( info->state() & NET::SkipPager) != 0;
// should we open this window on a certain desktop?
if ( info->desktop() == NETWinInfo::OnAllDesktops )
setSticky( TRUE );
else if ( info->desktop() )
desk = info->desktop(); // window had the initial desktop property!
} }
/*! /*!
@ -794,19 +787,17 @@ bool Client::manage( bool isMapped, bool doNotShow, bool isInitial )
} }
} }
// initial desktop placement - note we don't clobber desk if it is // initial desktop placement
// set to some value, in case the initial desktop code in the if ( info->desktop() )
// constructor has already set a value for us desk = info->desktop(); // window had the initial desktop property!
if ( mainClient()->isSticky() )
desk = NET::OnAllDesktops;
if ( session ) { if ( session ) {
desk = session->desktop; desk = session->desktop;
if ( desk <= 0 )
desk = workspace()->currentDesktop();
if( session->sticky ) if( session->sticky )
setSticky( true ); desk = NET::OnAllDesktops;
else } else if ( desk == 0 ) {
info->setDesktop( desk );
} else if ( desk <= 0 && !isSticky()) {
// if this window is transient, ensure that it is opened on the // if this window is transient, ensure that it is opened on the
// same window as its parent. this is necessary when an application // same window as its parent. this is necessary when an application
// starts up on a different desktop than is currently displayed // starts up on a different desktop than is currently displayed
@ -814,10 +805,7 @@ bool Client::manage( bool isMapped, bool doNotShow, bool isInitial )
if ( isTransient() && !mainClient()->isSticky() ) if ( isTransient() && !mainClient()->isSticky() )
desk = mainClient()->desktop(); desk = mainClient()->desktop();
if ( desk <= 0 ) { if ( desk != 0 && !isMapped && !doNotShow && desk != workspace()->currentDesktop()
// assume window wants to be visible on the current desktop
desk = workspace()->currentDesktop();
} else if ( !isMapped && !doNotShow && desk != workspace()->currentDesktop()
&& !isTopMenu() ) { && !isTopMenu() ) {
//window didn't specify any specific desktop but will appear //window didn't specify any specific desktop but will appear
//somewhere else. This happens for example with "save data?" //somewhere else. This happens for example with "save data?"
@ -827,12 +815,13 @@ bool Client::manage( bool isMapped, bool doNotShow, bool isInitial )
// focus stealing to me // focus stealing to me
workspace()->setCurrentDesktop( desk ); workspace()->setCurrentDesktop( desk );
} }
}
if ( desk == 0 ) // assume window wants to be visible on the current desktop
desk = workspace()->currentDesktop();
info->setDesktop( desk ); info->setDesktop( desk );
} else if( isSticky()) { is_sticky_ = ( desk == NET::OnAllDesktops );
info->setDesktop( NETWinInfo::OnAllDesktops ); workspace()->setStickyTransientsOf( this, isSticky());
} else stickyChange( isSticky());
info->setDesktop( desk );
if (isInitial) { if (isInitial) {
setMappingState( init_state ); setMappingState( init_state );
@ -1197,6 +1186,7 @@ void Client::withdraw()
workspace()->removeClient( this ); workspace()->removeClient( this );
info->setDesktop( 0 ); info->setDesktop( 0 );
desk = 0; desk = 0;
is_sticky_ = false;
releaseWindow(TRUE); releaseWindow(TRUE);
workspace()->destroyClient( this ); workspace()->destroyClient( this );
} }
@ -2490,29 +2480,6 @@ void Client::setActive( bool act)
} }
/*!
Sets the window's sticky property to b
*/
void Client::setSticky( bool b )
{
if ( is_sticky == b )
return;
is_sticky = b;
if ( isVisible() ) {
if ( is_sticky )
Events::raise( Events::Sticky );
else
Events::raise( Events::UnSticky );
}
if ( !is_sticky )
setDesktop( workspace()->currentDesktop() );
else
info->setDesktop( NETWinInfo::OnAllDesktops );
workspace()->setStickyTransientsOf( this, b );
stickyChange( is_sticky );
}
/*! /*!
Let the window stay on top or not, depending on \a b Let the window stay on top or not, depending on \a b
@ -2544,10 +2511,32 @@ void Client::setSkipPager( bool b )
} }
void Client::setDesktop( int desktop) void Client::setDesktop( int desktop )
{ {
if( desk == desktop )
return;
int was_desk = desk;
desk = desktop; desk = desktop;
is_sticky_ = ( desk == NET::OnAllDesktops );
info->setDesktop( desktop ); info->setDesktop( desktop );
if(( was_desk == NET::OnAllDesktops ) != ( desktop == NET::OnAllDesktops )) {
// sticky changed
if ( isVisible())
Events::raise( isSticky() ? Events::Sticky : Events::UnSticky );
workspace()->setStickyTransientsOf( this, isSticky());
stickyChange( isSticky());
}
}
void Client::setSticky( bool b )
{
if(( b && isSticky())
|| ( !b && !isSticky()))
return;
if( b )
setDesktop( NET::OnAllDesktops );
else
setDesktop( workspace()->currentDesktop());
} }
void Client::getWMHints() void Client::getWMHints()

View file

@ -321,7 +321,7 @@ private:
uint shaded :1; uint shaded :1;
uint hover_unshade :1; uint hover_unshade :1;
uint active :1; uint active :1;
uint is_sticky :1; uint is_sticky_ :1; // KDE4 remove, equal to desk == NET::OnAllDesktops
uint stays_on_top : 1; uint stays_on_top : 1;
uint is_shape :1; uint is_shape :1;
uint may_move :1; uint may_move :1;
@ -408,9 +408,9 @@ inline bool Client::isActive() const
/*! /*!
Returns the virtual desktop within the workspace() the client window Returns the virtual desktop within the workspace() the client window
is located in, -1 if it isn't located on any special desktop. This may be is located in, 0 if it isn't located on any special desktop (not mapped yet),
if the window wasn't mapped yet or if the window is sticky. Do not use or NET::OnAllDesktops (sticky). Do not use desktop() directly, use
desktop() directly, use isOnDesktop() instead. isOnDesktop() instead.
*/ */
inline int Client::desktop() const inline int Client::desktop() const
{ {
@ -419,7 +419,7 @@ inline int Client::desktop() const
inline bool Client::isSticky() const inline bool Client::isSticky() const
{ {
return is_sticky; return desk == NET::OnAllDesktops; // equal to is_sticky_
} }
/*! /*!
Returns whether the client is on visible or iconified on the virtual Returns whether the client is on visible or iconified on the virtual
@ -427,7 +427,7 @@ inline bool Client::isSticky() const
*/ */
inline bool Client::isOnDesktop( int d ) const inline bool Client::isOnDesktop( int d ) const
{ {
return desk == d || desk == -1 || isSticky(); return desk == d || /*desk == 0 ||*/ isSticky();
} }

View file

@ -259,7 +259,7 @@ Client* Workspace::clientFactory( WId w )
{ {
XLowerWindow( qt_xdisplay(), w ); XLowerWindow( qt_xdisplay(), w );
Client * c = new NoBorderClient( this, w); Client * c = new NoBorderClient( this, w);
c->setSticky( TRUE ); c->setSticky( TRUE ); // TODO remove this?
return c; return c;
} }
@ -3052,15 +3052,10 @@ void Workspace::clientPopupAboutToShow()
*/ */
void Workspace::sendClientToDesktop( Client* c, int desk ) void Workspace::sendClientToDesktop( Client* c, int desk )
{ {
if ( c->isSticky() && desk != NETWinInfo::OnAllDesktops ) if ( c->desktop() == desk )
c->setSticky( FALSE );
if ( c->isOnDesktop( desk ) )
return; return;
c->setDesktop( desk ); c->setDesktop( desk );
if( desk == NETWinInfo::OnAllDesktops )
c->setSticky( true );
if ( c->isOnDesktop( currentDesktop() ) ) { if ( c->isOnDesktop( currentDesktop() ) ) {
c->show(); c->show();
@ -3094,7 +3089,7 @@ void Workspace::sendToDesktop( int desk )
{ {
if ( !popup_client ) if ( !popup_client )
return; return;
if ( desk == 0 ) { if ( desk == 0 ) { // the 'sticky' menu entry
popup_client->setSticky( !popup_client->isSticky() ); popup_client->setSticky( !popup_client->isSticky() );
return; return;
} }