Show the topmenu_space window reserving the space for standalone menubars
only if there's no menubar active. Helps Fredrik to have the menu shadow exactly in the color he wants :). svn path=/trunk/kdebase/kwin/; revision=273185
This commit is contained in:
parent
2197c646eb
commit
997f45b25e
2 changed files with 20 additions and 18 deletions
8
client.h
8
client.h
|
@ -55,6 +55,7 @@ class Client : public QObject, public KDecorationDefines
|
||||||
Client* transientFor();
|
Client* transientFor();
|
||||||
bool isTransient() const;
|
bool isTransient() const;
|
||||||
bool groupTransient() const;
|
bool groupTransient() const;
|
||||||
|
bool wasOriginallyGroupTransient() const;
|
||||||
ClientList mainClients() const; // call once before loop , is not indirect
|
ClientList mainClients() const; // call once before loop , is not indirect
|
||||||
bool hasTransient( const Client* c, bool indirect ) const;
|
bool hasTransient( const Client* c, bool indirect ) const;
|
||||||
const ClientList& transients() const; // is not indirect
|
const ClientList& transients() const; // is not indirect
|
||||||
|
@ -532,6 +533,13 @@ inline bool Client::groupTransient() const
|
||||||
return transient_for_id == workspace()->rootWin();
|
return transient_for_id == workspace()->rootWin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// needed because verifyTransientFor() may set transient_for_id to root window,
|
||||||
|
// if the original value has a problem (window doesn't exist, etc.)
|
||||||
|
inline bool Client::wasOriginallyGroupTransient() const
|
||||||
|
{
|
||||||
|
return original_transient_for_id == workspace()->rootWin();
|
||||||
|
}
|
||||||
|
|
||||||
inline bool Client::isTransient() const
|
inline bool Client::isTransient() const
|
||||||
{
|
{
|
||||||
return transient_for_id != None;
|
return transient_for_id != None;
|
||||||
|
|
|
@ -507,6 +507,8 @@ void Workspace::removeClient( Client* c, allowed_t )
|
||||||
|
|
||||||
void Workspace::updateCurrentTopMenu()
|
void Workspace::updateCurrentTopMenu()
|
||||||
{
|
{
|
||||||
|
if( !managingTopMenus())
|
||||||
|
return;
|
||||||
// toplevel menubar handling
|
// toplevel menubar handling
|
||||||
Client* menubar = 0;
|
Client* menubar = 0;
|
||||||
bool block_desktop_menubar = false;
|
bool block_desktop_menubar = false;
|
||||||
|
@ -558,11 +560,11 @@ void Workspace::updateCurrentTopMenu()
|
||||||
for( ClientList::ConstIterator it = topmenus.begin();
|
for( ClientList::ConstIterator it = topmenus.begin();
|
||||||
it != topmenus.end();
|
it != topmenus.end();
|
||||||
++it )
|
++it )
|
||||||
if( (*it)->groupTransient())
|
if( (*it)->wasOriginallyGroupTransient()) // kdesktop's topmenu has WM_TRANSIENT_FOR
|
||||||
{
|
{ // set pointing to the root window
|
||||||
menubar = *it;
|
menubar = *it; // to recognize it here
|
||||||
break;
|
break; // Also, with the xroot hack in kdesktop,
|
||||||
}
|
} // there's no NET::Desktop window to be transient for
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,27 +574,19 @@ void Workspace::updateCurrentTopMenu()
|
||||||
if( active_client && !menubar->isOnDesktop( active_client->desktop()))
|
if( active_client && !menubar->isOnDesktop( active_client->desktop()))
|
||||||
menubar->setDesktop( active_client->desktop());
|
menubar->setDesktop( active_client->desktop());
|
||||||
menubar->hideClient( false );
|
menubar->hideClient( false );
|
||||||
|
topmenu_space->hide();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // no topmenu active - show the space window, so that there's not empty space
|
||||||
|
topmenu_space->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ... then hide the other ones. Avoids flickers.
|
// ... then hide the other ones. Avoids flickers.
|
||||||
#if 0
|
|
||||||
// Leave the desktop menubars always visible. Helps visually when the app doesn't show
|
|
||||||
// its menubar immediately.
|
|
||||||
for ( ClientList::ConstIterator it = clients.begin(); it != clients.end(); ++it)
|
|
||||||
{
|
|
||||||
if( (*it)->isTopMenu() && (*it) != menubar && !(*it)->mainClient()->isDesktop() )
|
|
||||||
(*it)->hideClient( true );
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// There's a blank area where topmenus are placed, no need to keep
|
|
||||||
// the desktop one always visible
|
|
||||||
for ( ClientList::ConstIterator it = clients.begin(); it != clients.end(); ++it)
|
for ( ClientList::ConstIterator it = clients.begin(); it != clients.end(); ++it)
|
||||||
{
|
{
|
||||||
if( (*it)->isTopMenu() && (*it) != menubar )
|
if( (*it)->isTopMenu() && (*it) != menubar )
|
||||||
(*it)->hideClient( true );
|
(*it)->hideClient( true );
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue