Hopefully final fixes for topmenus managed by KWin to work (#66152).

Written by Schizo, reviewed by Frenia. As it was broken anyway, I don't
think this can break it more.

svn path=/trunk/kdebase/kwin/; revision=266813
icc-effect-5.14.5
Luboš Luňák 2003-11-13 14:34:05 +00:00
parent 0ec4c11585
commit d46c7413c4
3 changed files with 38 additions and 24 deletions

View File

@ -22,6 +22,7 @@ License. See the file "COPYING" for the exact licensing terms.
#include <kapplication.h> #include <kapplication.h>
#include <kglobal.h> #include <kglobal.h>
#include <qpainter.h> #include <qpainter.h>
#include <kwin.h>
#include "placement.h" #include "placement.h"
#include "notifications.h" #include "notifications.h"
@ -113,7 +114,7 @@ void Workspace::updateClientArea( bool force )
rootInfo->setWorkArea( i, r ); rootInfo->setWorkArea( i, r );
} }
updateTopMenuSpaceGeometry(); updateTopMenuGeometry();
for( ClientList::ConstIterator it = clients.begin(); for( ClientList::ConstIterator it = clients.begin();
it != clients.end(); it != clients.end();
++it) ++it)
@ -347,14 +348,38 @@ void Workspace::unclutterDesktop()
} }
void Workspace::updateTopMenuSpaceGeometry() void Workspace::updateTopMenuGeometry( Client* c )
{ {
if( !managingTopMenus()) if( !managingTopMenus())
return; return;
if( c != NULL )
{
XEvent ev;
ev.xclient.display = qt_xdisplay();
ev.xclient.type = ClientMessage;
ev.xclient.window = c->window();
static Atom msg_type_atom = XInternAtom( qt_xdisplay(), "_KDE_TOPMENU_MINSIZE", False );
ev.xclient.message_type = msg_type_atom;
ev.xclient.format = 32;
ev.xclient.data.l[0] = qt_x_time;
ev.xclient.data.l[1] = topmenu_space->width();
ev.xclient.data.l[2] = topmenu_space->height();
ev.xclient.data.l[3] = 0;
ev.xclient.data.l[4] = 0;
XSendEvent( qt_xdisplay(), c->window(), False, NoEventMask, &ev );
KWin::setStrut( c->window(), 0, 0, topmenu_height, 0 ); // so that kicker etc. know
c->checkWorkspacePosition();
return;
}
// c == NULL - update all, including topmenu_space
QRect area; QRect area;
area = clientArea( MaximizeFullArea, QPoint( 0, 0 ), 1 ); // HACK desktop ? area = clientArea( MaximizeFullArea, QPoint( 0, 0 ), 1 ); // HACK desktop ?
area.setHeight( topMenuHeight()); area.setHeight( topMenuHeight());
topmenu_space->setGeometry( area ); topmenu_space->setGeometry( area );
for( ClientList::ConstIterator it = topmenus.begin();
it != topmenus.end();
++it )
updateTopMenuGeometry( *it );
} }
//******************************************** //********************************************

View File

@ -27,7 +27,6 @@ License. See the file "COPYING" for the exact licensing terms.
#include <kmenubar.h> #include <kmenubar.h>
#include <kprocess.h> #include <kprocess.h>
#include <kglobalaccel.h> #include <kglobalaccel.h>
#include <kwin.h>
#include "plugins.h" #include "plugins.h"
#include "client.h" #include "client.h"
@ -743,11 +742,7 @@ void Workspace::slotReconfigure()
topmenu_height = 0; // invalidate used menu height topmenu_height = 0; // invalidate used menu height
if( managingTopMenus()) if( managingTopMenus())
{ {
updateTopMenuSpaceGeometry(); updateTopMenuGeometry();
for( ClientList::ConstIterator it = topmenus.begin();
it != topmenus.end();
++it )
(*it)->checkWorkspacePosition();
updateCurrentTopMenu(); updateCurrentTopMenu();
} }
} }
@ -1824,20 +1819,16 @@ void Workspace::addTopMenu( Client* c )
assert( c->isTopMenu()); assert( c->isTopMenu());
assert( !topmenus.contains( c )); assert( !topmenus.contains( c ));
topmenus.append( c ); topmenus.append( c );
int minsize = c->minSize().height(); if( managingTopMenus())
if( minsize > topMenuHeight())
{ {
topmenu_height = minsize; int minsize = c->minSize().height();
updateTopMenuSpaceGeometry(); if( minsize > topMenuHeight())
for( ClientList::ConstIterator it = topmenus.begin();
it != topmenus.end();
++it )
{ {
KWin::setStrut( (*it)->window(), 0, 0, topmenu_height, 0 ); // so that kicker etc. know topmenu_height = minsize;
(*it)->checkWorkspacePosition(); updateTopMenuGeometry();
} }
updateTopMenuGeometry( c );
} }
c->checkWorkspacePosition();
// kdDebug() << "NEW TOPMENU:" << c << endl; // kdDebug() << "NEW TOPMENU:" << c << endl;
} }
@ -1870,6 +1861,8 @@ void Workspace::lostTopMenuSelection()
void Workspace::lostTopMenuOwner() void Workspace::lostTopMenuOwner()
{ {
if( !options->topMenuEnabled())
return;
// kdDebug() << "TopMenu selection lost owner" << endl; // kdDebug() << "TopMenu selection lost owner" << endl;
if( !topmenu_selection->claim( false )) if( !topmenu_selection->claim( false ))
{ {
@ -1888,13 +1881,9 @@ void Workspace::setupTopMenuHandling()
disconnect( topmenu_watcher, SIGNAL( lostOwner()), this, SLOT( lostTopMenuOwner())); disconnect( topmenu_watcher, SIGNAL( lostOwner()), this, SLOT( lostTopMenuOwner()));
managing_topmenus = true; managing_topmenus = true;
topmenu_space = new QWidget; topmenu_space = new QWidget;
updateTopMenuSpaceGeometry(); updateTopMenuGeometry();
topmenu_space->show(); topmenu_space->show();
updateClientArea(); updateClientArea();
for( ClientList::ConstIterator it = topmenus.begin();
it != topmenus.end();
++it )
(*it)->checkWorkspacePosition();
} }
int Workspace::topMenuHeight() const int Workspace::topMenuHeight() const

View File

@ -342,7 +342,7 @@ class Workspace : public QObject, public KWinInterface, public KDecorationDefine
void addTopMenu( Client* c ); void addTopMenu( Client* c );
void removeTopMenu( Client* c ); void removeTopMenu( Client* c );
void setupTopMenuHandling(); void setupTopMenuHandling();
void updateTopMenuSpaceGeometry(); void updateTopMenuGeometry( Client* c = NULL );
void updateToolWindows( bool also_hide ); void updateToolWindows( bool also_hide );
// this is the right way to create a new client // this is the right way to create a new client