From 49f894fa515da6e0ee5799adc93cc6c39b9d582f Mon Sep 17 00:00:00 2001 From: Matthias Ettrich Date: Fri, 26 Nov 1999 22:10:25 +0000 Subject: [PATCH] nicer tabbox svn path=/trunk/kdebase/kwin/; revision=35151 --- client.cpp | 5 ++- stdclient.cpp | 6 +++ tabbox.cpp | 107 +++++++++++++++++++++++++++++++++++++++++--------- tabbox.h | 6 ++- 4 files changed, 102 insertions(+), 22 deletions(-) diff --git a/client.cpp b/client.cpp index 32046797d2..e5b196ac37 100644 --- a/client.cpp +++ b/client.cpp @@ -357,7 +357,7 @@ void Client::manage( bool isMapped ) placementDone = TRUE; } - + if ( !placementDone ) { workspace()->doPlacement( this ); placementDone = TRUE; @@ -378,6 +378,7 @@ void Client::manage( bool isMapped ) // ### TODO check XGetWMHints() for initial mapping state, icon, etc. pp. // assume window wants to be visible on the current desktop desk = KWM::desktop( win ); //workspace()->currentDesktop(); + KWM::moveToDesktop( win, desk ); // compatibility setMappingState( state ); if ( state == NormalState && isOnDesktop( workspace()->currentDesktop() ) ) { show(); @@ -560,7 +561,7 @@ void Client::withdraw() bool Client::configureRequest( XConfigureRequestEvent& e ) { if ( isResize() ) - return TRUE; // we have better things to do right now + return TRUE; // we have better things to do right now if ( isShade() ) setShade( FALSE ); diff --git a/stdclient.cpp b/stdclient.cpp index 1e8d74db85..13dac9b325 100644 --- a/stdclient.cpp +++ b/stdclient.cpp @@ -31,6 +31,12 @@ static QPixmap* dis_menu_pix = 0; static bool pixmaps_created = FALSE; +static void create_pixmaps(); +QPixmap* kwin_get_menu_pix_hack() +{ + create_pixmaps(); + return menu_pix; +} /** * Pixmap creation routine that creates full pixmaps out of bitmaps diff --git a/tabbox.cpp b/tabbox.cpp index c602911251..415dab14ee 100644 --- a/tabbox.cpp +++ b/tabbox.cpp @@ -2,6 +2,8 @@ #include "workspace.h" #include "client.h" #include +#include +#include const bool options_traverse_all = FALSE; // TODO @@ -39,20 +41,41 @@ void TabBox::reset() f.setPointSize( 14 ); setFont( f ); - - // TODO icons etc. - setGeometry( qApp->desktop()->width()/4, - qApp->desktop()->height()/2-fontMetrics().height()*2, - qApp->desktop()->width()/2, fontMetrics().height()*4 ); + wmax = 0; if ( mode() == WindowsMode ) { client = workspace()->activeClient(); - // todo build window list, consider options_traverse_all + clients.clear(); + Client* c = workspace()->nextClient( client ); + Client* stop = c; + QFontMetrics fm( fontMetrics() ); + int cw = 0; + while ( c ) { + // TODO consider options_traverse_all + if ( options_traverse_all ||c->isOnDesktop(workspace()->currentDesktop()) ) { + if ( client == c ) + clients.prepend( c ); + else + clients += c; + cw = fm.width( c->caption() ) + 40; + if ( cw > wmax ) + wmax = cw; + } + c = workspace()->nextClient( c ); + if ( c == stop ) + break; + } + wmax = QMAX( wmax, int(clients.count())*20 ); } else { // DesktopMode - desk = wspace->currentDesktop(); + desk = workspace()->currentDesktop(); } + int w = QMAX( wmax + 20, qApp->desktop()->width()/3 ); + setGeometry( (qApp->desktop()->width()-w)/2, + qApp->desktop()->height()/2-fontMetrics().height()*2-10, + w, fontMetrics().height()*4 + 20 ); + wmax = QMIN( wmax, width() - 12 ); } @@ -77,16 +100,17 @@ void TabBox::nextPrev( bool next) if (!options_traverse_all && client && !client->isOnDesktop(workspace()->currentDesktop())) client = 0; + } else { // DesktopMode if ( next ) { desk++; - if ( desk > wspace->numberOfDesktops() ) + if ( desk > workspace()->numberOfDesktops() ) desk = 1; } else { desk--; if ( desk < 1 ) - desk = wspace->numberOfDesktops(); + desk = workspace()->numberOfDesktops(); } } @@ -128,6 +152,14 @@ void TabBox::showEvent( QShowEvent* ) } +/*! + hide the icon box if necessary + */ +void TabBox::hideEvent( QHideEvent* ) +{ +} + + /*! Paints the tab box */ @@ -141,14 +173,17 @@ void TabBox::paintEvent( QPaintEvent* ) paintContents(); } + /*! Paints the contents of the tab box. Used in paintEvent() and whenever the contents changes. */ void TabBox::paintContents() { + extern QPixmap* kwin_get_menu_pix_hack(); + QPixmap* menu_pix = kwin_get_menu_pix_hack(); QPainter p( this ); - QRect r(6, 6, width()-12, height()-12 ); + QRect r( 6, 6, width()-12, height()-32 ); p.fillRect( r, colorGroup().brush( QColorGroup::Background ) ); if ( mode () == WindowsMode ) { if ( currentClient() ) { @@ -162,18 +197,54 @@ void TabBox::paintContents() s += QString("(")+client->caption()+")"; else s += client->caption(); - if ( p.fontMetrics().width( s ) > r.width() ) - p.drawText( r, AlignLeft, s ); - else - p.drawText( r, AlignCenter, s ); + int textw = fontMetrics().width( s ); + r.setLeft( r.left() + (r.width() - textw)/2); + + if ( !client->icon().isNull() ) { + int py = r.center().y() - 16; + r.setLeft( r.left() + 20 ); + p.drawPixmap( r.left()-42, py, client->icon() ); + } + + p.drawText( r, AlignVCenter, s ); } else { - p.drawText( r, AlignCenter, "*** No Tasks ***" ); + r.setBottom( r.bottom() + 20 ); + p.drawText( r, AlignCenter, "*** No Tasks ***" ); + } + + int x = (width() - clients.count() * 20 )/2; + int y = height() - 26; + for ( ClientList::ConstIterator it = clients.begin(); it != clients.end(); ++it) { + if ( workspace()->hasClient( *it ) ) { // safety + if ( !(*it)->miniIcon().isNull() ) + p.drawPixmap( x, y, (*it)->miniIcon() ); + else if ( menu_pix ) + p.drawPixmap( x, y, *menu_pix ); + p.setPen( (*it)==currentClient()? + colorGroup().highlight():colorGroup().background() ); + p.drawRect( x-2, y-2, 20, 20 ); + x += 20; + } } } else { // DesktopMode - QString s; - s.setNum( desk ); - p.drawText( r, AlignCenter, s ); + p.drawText( r, AlignCenter, QString::number( desk ) ); + int x = (width() - workspace()->numberOfDesktops() * 20 )/2; + int y = height() - 26; + QFont f( font() ); + f.setPointSize( 12 ); + f.setBold( FALSE ); + p.setFont(f ); + for ( int i = 1; i <= workspace()->numberOfDesktops(); i++ ) { + p.setPen( i == desk? + colorGroup().highlight():colorGroup().background() ); + p.drawRect( x-2, y-2, 20, 20 ); + qDrawWinPanel( &p, QRect( x, y, 16, 16), colorGroup(), FALSE, + &colorGroup().brush(QColorGroup::Base ) ); + p.setPen( colorGroup().text() ); + p.drawText( x, y, 16, 16, AlignCenter, QString::number(i) ); + x += 20; + } } } diff --git a/tabbox.h b/tabbox.h index d6ca7ae863..9e0678bc80 100644 --- a/tabbox.h +++ b/tabbox.h @@ -4,7 +4,7 @@ class Workspace; class Client; - +class QLabel; typedef QValueList ClientList; class TabBox : public QWidget @@ -29,6 +29,7 @@ public: protected: void paintEvent( QPaintEvent* ); void showEvent( QShowEvent* ); + void hideEvent( QHideEvent* ); void paintContents(); private: @@ -37,7 +38,8 @@ private: Workspace* wspace; ClientList clients; int desk; -// QValueList labels; + QLabel* icon; + int wmax; };