Fix some error
[kdeartwork.git] / kwin-styles / kde1 / kde1client.cpp
blob85a70f06a806b6300e02ba59fc4e3e4095d91d35
1 /*****************************************************************
2 kwin - the KDE window manager
4 Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org>
5 ******************************************************************/
6 #include "kde1client.h"
7 #include <qcursor.h>
8 #include <qlayout.h>
9 #include <qtoolbutton.h>
10 #include <qlabel.h>
11 #include <qdrawutil.h>
12 #include <qbitmap.h>
13 #include <kdrawutil.h>
14 #include <klocale.h>
15 #include <kpixmap.h>
16 #include <qdatetime.h>
17 #include <qimage.h>
18 #include <qtooltip.h>
20 #include "kde1client_bitmaps.h"
22 // Default button layout
23 const char default_left[] = "MS";
24 const char default_right[] = "H_IAX";
26 namespace KDE1
29 QPixmap* close_pix = 0;
30 QPixmap* maximize_pix = 0;
31 QPixmap* minimize_pix = 0;
32 QPixmap* normalize_pix = 0;
33 QPixmap* pinup_pix = 0;
34 QPixmap* pindown_pix = 0;
35 QPixmap* menu_pix = 0;
36 QPixmap* question_mark_pix = 0;
38 QPixmap* dis_close_pix = 0;
39 QPixmap* dis_maximize_pix = 0;
40 QPixmap* dis_minimize_pix = 0;
41 QPixmap* dis_normalize_pix = 0;
42 QPixmap* dis_pinup_pix = 0;
43 QPixmap* dis_pindown_pix = 0;
44 QPixmap* dis_menu_pix = 0;
45 QPixmap* dis_question_mark_pix = 0;
47 QPixmap* titleBuffer = 0;
49 bool pixmaps_created = FALSE;
51 inline const KDecorationOptions* options() { return KDecoration::options(); }
53 void create_pixmaps()
55 if ( pixmaps_created )
56 return;
57 pixmaps_created = true;
58 QColorGroup aGrp = options()->colorGroup(KDecorationOptions::ColorButtonBg, true);
59 QColorGroup iGrp = options()->colorGroup(KDecorationOptions::ColorButtonBg, false);
61 QPainter aPainter, iPainter;
62 close_pix = new QPixmap(16, 16);
63 dis_close_pix = new QPixmap(16, 16);
64 aPainter.begin(close_pix); iPainter.begin(dis_close_pix);
65 kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, close_white_bits,
66 NULL, NULL, close_dgray_bits, NULL, NULL);
67 kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, close_white_bits,
68 NULL, NULL, close_dgray_bits, NULL, NULL);
69 aPainter.end(); iPainter.end();
70 close_pix->setMask(QBitmap(16, 16, close_mask_bits, true));
71 dis_close_pix->setMask(*close_pix->mask());
73 minimize_pix = new QPixmap(16, 16);
74 dis_minimize_pix = new QPixmap(16, 16);
75 aPainter.begin(minimize_pix); iPainter.begin(dis_minimize_pix);
76 kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, iconify_white_bits,
77 NULL, NULL, iconify_dgray_bits, NULL, NULL);
78 kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, iconify_white_bits,
79 NULL, NULL, iconify_dgray_bits, NULL, NULL);
80 aPainter.end(); iPainter.end();
81 minimize_pix->setMask(QBitmap(16, 16, iconify_mask_bits, true));
82 dis_minimize_pix->setMask(*minimize_pix->mask());
84 maximize_pix = new QPixmap(16, 16);
85 dis_maximize_pix = new QPixmap(16, 16);
86 aPainter.begin(maximize_pix); iPainter.begin(dis_maximize_pix);
87 kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, maximize_white_bits,
88 NULL, NULL, maximize_dgray_bits, NULL, NULL);
89 kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, maximize_white_bits,
90 NULL, NULL, maximize_dgray_bits, NULL, NULL);
91 aPainter.end(); iPainter.end();
92 maximize_pix->setMask(QBitmap(16, 16, maximize_mask_bits, true));
93 dis_maximize_pix->setMask(*maximize_pix->mask());
95 normalize_pix = new QPixmap(16, 16);
96 dis_normalize_pix = new QPixmap(16, 16);
97 aPainter.begin(normalize_pix); iPainter.begin(dis_normalize_pix);
98 kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, maximizedown_white_bits,
99 NULL, NULL, maximizedown_dgray_bits, NULL, NULL);
100 kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, maximizedown_white_bits,
101 NULL, NULL, maximizedown_dgray_bits, NULL, NULL);
102 aPainter.end(); iPainter.end();
103 normalize_pix->setMask(QBitmap(16, 16, maximizedown_mask_bits, true));
104 dis_normalize_pix->setMask(*normalize_pix->mask());
106 menu_pix = new QPixmap(16, 16);
107 dis_menu_pix = new QPixmap(16, 16);
108 aPainter.begin(menu_pix); iPainter.begin(dis_menu_pix);
109 kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, menu_white_bits,
110 NULL, NULL, menu_dgray_bits, NULL, NULL);
111 kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, menu_white_bits,
112 NULL, NULL, menu_dgray_bits, NULL, NULL);
113 aPainter.end(); iPainter.end();
114 menu_pix->setMask(QBitmap(16, 16, menu_mask_bits, true));
115 dis_menu_pix->setMask(*menu_pix->mask());
117 pinup_pix = new QPixmap(16, 16);
118 dis_pinup_pix = new QPixmap(16, 16);
119 aPainter.begin(pinup_pix); iPainter.begin(dis_pinup_pix);
120 kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, pinup_white_bits,
121 pinup_gray_bits, NULL, pinup_dgray_bits, NULL, NULL);
122 kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, pinup_white_bits,
123 pinup_gray_bits, NULL, pinup_dgray_bits, NULL, NULL);
124 aPainter.end(); iPainter.end();
125 pinup_pix->setMask(QBitmap(16, 16, pinup_mask_bits, true));
126 dis_pinup_pix->setMask(*pinup_pix->mask());
128 pindown_pix = new QPixmap(16, 16);
129 dis_pindown_pix = new QPixmap(16, 16);
130 aPainter.begin(pindown_pix); iPainter.begin(dis_pindown_pix);
131 kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, pindown_white_bits,
132 pindown_gray_bits, NULL, pindown_dgray_bits, NULL, NULL);
133 kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, pindown_white_bits,
134 pindown_gray_bits, NULL, pindown_dgray_bits, NULL, NULL);
135 aPainter.end(); iPainter.end();
136 pindown_pix->setMask(QBitmap(16, 16, pindown_mask_bits, true));
137 dis_pindown_pix->setMask(*pindown_pix->mask());
139 question_mark_pix = new QPixmap(16, 16);
140 dis_question_mark_pix = new QPixmap(16, 16);
141 aPainter.begin(question_mark_pix); iPainter.begin(dis_question_mark_pix);
142 kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, help_light_bits,
143 NULL, NULL, help_dark_bits, NULL, NULL);
144 kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, help_light_bits,
145 NULL, NULL, help_dark_bits, NULL, NULL);
146 aPainter.end(); iPainter.end();
147 question_mark_pix->setMask(QBitmap(16, 16, help_mask_bits, true));
148 dis_question_mark_pix->setMask(*question_mark_pix->mask());
150 titleBuffer = new KPixmap;
153 void delete_pixmaps()
155 delete close_pix;
156 delete maximize_pix;
157 delete minimize_pix;
158 delete normalize_pix;
159 delete pinup_pix;
160 delete pindown_pix;
161 delete menu_pix;
162 delete question_mark_pix;
163 delete dis_close_pix;
164 delete dis_maximize_pix;
165 delete dis_minimize_pix;
166 delete dis_normalize_pix;
167 delete dis_pinup_pix;
168 delete dis_pindown_pix;
169 delete dis_menu_pix;
170 delete dis_question_mark_pix;
171 delete titleBuffer;
172 pixmaps_created = false;
175 void drawGradient
177 QPainter & p,
178 const QRect & t,
179 const QColor & c1,
180 const QColor & c2
183 // Don't draw a million vertical lines if we don't need to.
185 if (c1 == c2 || QPixmap::defaultDepth() <= 8)
187 p.fillRect(t, c1);
188 return;
191 // rikkus: Adapted from KPixmapEffect::gradient().
193 int rca = c1.red();
194 int gca = c1.green();
195 int bca = c1.blue();
197 int rDiff = c2.red() - rca;
198 int gDiff = c2.green() - gca;
199 int bDiff = c2.blue() - bca;
201 int rl = rca << 16;
202 int gl = gca << 16;
203 int bl = bca << 16;
205 int rcdelta = ((1 << 16) / t.width()) * rDiff;
206 int gcdelta = ((1 << 16) / t.width()) * gDiff;
207 int bcdelta = ((1 << 16) / t.width()) * bDiff;
209 for (int x = 0; x < t.width(); x++)
211 rl += rcdelta;
212 gl += gcdelta;
213 bl += bcdelta;
215 p.setPen(QColor(rl >> 16, gl >> 16, bl >> 16));
217 p.drawLine(t.x() + x, 0, t.x() + x, t.y() + t.height() - 1);
222 void StdClient::reset( unsigned long )
224 if (button[ButtonMenu] && (icon().pixmap( QIconSet::Small, QIconSet::Normal ).isNull()))
225 button[ButtonMenu]->setIconSet(isActive() ? *menu_pix : *dis_menu_pix);
226 if (button[ButtonSticky])
227 button[ButtonSticky]->setIconSet(isOnAllDesktops() ? isActive() ? *pindown_pix : *dis_pindown_pix :
228 isActive() ? *pinup_pix : *dis_pinup_pix );
229 if (button[ButtonMinimize])
230 button[ButtonMinimize]->setIconSet(isActive() ? *minimize_pix : *dis_minimize_pix);
231 if (button[ButtonMaximize])
232 button[ButtonMaximize]->setIconSet(isActive() ? *maximize_pix : *dis_maximize_pix);
233 if (button[ButtonClose])
234 button[ButtonClose]->setIconSet(isActive() ? *close_pix : *dis_close_pix);
235 if (button[ButtonHelp])
236 button[ButtonHelp]->setIconSet(isActive() ? *question_mark_pix : *dis_question_mark_pix);
238 widget()->setFont(options()->font(true));
242 StdClient::StdClient( KDecorationBridge* b, KDecorationFactory* f )
243 : KDecoration( b, f )
247 void StdClient::init()
249 createMainWidget();
250 widget()->installEventFilter( this );
252 widget()->setFont(options()->font(isActive() ));
254 QGridLayout* g = new QGridLayout( widget(), 0, 0, 3, 2 );
255 g->setRowStretch( 1, 10 );
256 if( isPreview())
257 g->addWidget( new QLabel( i18n( "<center><b>KDE 1 preview</b></center>" ), widget()), 1, 1 );
258 else
259 g->addItem( new QSpacerItem( 0, 0 ), 1, 1 ); //no widget in the middle
260 g->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ) );
262 g->addColSpacing(0, 1);
263 g->addColSpacing(2, 1);
264 g->addRowSpacing(2, 1);
266 int fh = widget()->fontMetrics().lineSpacing();
267 titlebar = new QSpacerItem(10, fh, QSizePolicy::Expanding,
268 QSizePolicy::Minimum );
270 QBoxLayout* hb = new QBoxLayout(0, QBoxLayout::LeftToRight, 0, 0, 0);
271 g->addLayout( hb, 0, 1 );
273 // setup titlebar buttons
274 for (int n=0; n<ButtonTypeCount; n++) button[n] = 0;
275 addButtons(hb, options()->customButtonPositions() ? options()->titleButtonsLeft() : QString(default_left));
276 hb->addItem(titlebar);
277 addButtons(hb, options()->customButtonPositions() ? options()->titleButtonsRight() : QString(default_right));
279 for (int n=0; n<ButtonTypeCount; n++) {
280 if ( !button[n] )
281 continue;
282 button[n]->setBackgroundMode( PaletteBackground );
283 button[n]->setMouseTracking( FALSE );
284 button[n]->setAutoRaise( TRUE );
285 button[n]->setFocusPolicy( QWidget::NoFocus );
286 button[n]->setFixedSize( 20, 20 );
289 #if 0 // not sure what this is supposed to mean (and why)
290 if ( isTransient() ) {
291 // lighter decoration for transient windows
292 button[1]->hide();
293 // button[2]->hide();
294 button[3]->hide();
295 button[4]->hide();
297 #endif
300 void StdClient::addButtons(QBoxLayout *hb, const QString& s)
302 if (s.length() > 0) {
303 for (unsigned n=0; n < s.length(); n++) {
304 switch (s[n]) {
305 case 'M': // Menu button
306 if (!button[ButtonMenu]) {
307 button[ButtonMenu] = new QToolButton( widget(), 0 );
308 button[ButtonMenu]->setToolTip( i18n("Menu") );
309 button[ButtonMenu]->setCursor(ArrowCursor);
310 if( icon().pixmap( QIconSet::Small, QIconSet::Normal ).isNull())
311 button[ButtonMenu]->setIconSet(isActive() ? *menu_pix : *dis_menu_pix);
312 else
313 button[ButtonMenu]->setIconSet( icon().pixmap( QIconSet::Small, QIconSet::Normal ));
314 connect( button[0], SIGNAL( pressed() ), this, SLOT( menuButtonPressed() ) );
315 hb->addWidget(button[ButtonMenu]);
317 break;
319 case 'S': // Sticky button
320 if (!button[ButtonSticky]) {
321 button[ButtonSticky] = new QToolButton( widget(), 0 );
322 button[ButtonSticky]->setIconSet( isOnAllDesktops()?*pindown_pix:*pinup_pix );
323 button[ButtonSticky]->setToolTip( isOnAllDesktops()?i18n("Not On All Desktops"):i18n("On All Desktops") );
324 button[ButtonSticky]->setCursor(ArrowCursor);
325 button[ButtonSticky]->setIconSet(isOnAllDesktops() ? isActive() ? *pindown_pix : *dis_pindown_pix :
326 isActive() ? *pinup_pix : *dis_pinup_pix );
327 connect( button[ButtonSticky], SIGNAL( clicked() ), this, ( SLOT( toggleOnAllDesktops() ) ) );
328 hb->addWidget(button[ButtonSticky]);
330 break;
332 case 'H': // Help button
333 if ((!button[ButtonHelp]) && providesContextHelp()) {
334 button[ButtonHelp] = new QToolButton( widget(), 0 );
335 button[ButtonHelp]->setToolTip( i18n("Help") );
336 button[ButtonHelp]->setIconSet( isActive() ? *question_mark_pix : *dis_question_mark_pix);
337 connect( button[ButtonHelp], SIGNAL( clicked() ), this, ( SLOT( showContextHelp() ) ) );
338 button[ButtonHelp]->setCursor(ArrowCursor);
339 hb->addWidget(button[ButtonHelp]);
341 break;
343 case 'I': // Minimize button
344 if ((!button[ButtonMinimize]) && isMinimizable()) {
345 button[ButtonMinimize] = new QToolButton( widget(), 0 );
346 button[ButtonMinimize]->setToolTip( i18n("Minimize") );
347 button[ButtonMinimize]->setCursor(ArrowCursor);
348 button[ButtonMinimize]->setIconSet(isActive() ? *minimize_pix : *dis_minimize_pix);
349 connect( button[ButtonMinimize], SIGNAL( clicked() ), this, ( SLOT( minimize() ) ) );
350 hb->addWidget(button[ButtonMinimize]);
352 break;
354 case 'A': // Maximize button
355 if ((!button[ButtonMaximize]) && isMaximizable()) {
356 const bool max = maximizeMode()!=MaximizeRestore;
357 button[ButtonMaximize] = new ThreeButtonButton( widget(), 0 );
358 button[ButtonMaximize]->setToolTip( max?i18n("Restore"):i18n("Maximize") );
359 button[ButtonMaximize]->setCursor(ArrowCursor);
360 button[ButtonMaximize]->setIconSet( max?(isActive() ? *normalize_pix : *dis_normalize_pix):(isActive() ? *maximize_pix : *dis_maximize_pix) );
361 connect( button[ButtonMaximize], SIGNAL( clicked(ButtonState) ),
362 this, ( SLOT( maxButtonClicked(ButtonState) ) ) );
363 hb->addWidget(button[ButtonMaximize]);
365 break;
367 case 'X': // Close button
368 if ((!button[ButtonClose]) && isCloseable()) {
369 button[ButtonClose] = new QToolButton( widget(), 0 );
370 button[ButtonClose]->setToolTip( i18n("Close") );
371 button[ButtonClose]->setCursor(ArrowCursor);
372 button[ButtonClose]->setIconSet(isActive() ? *close_pix : *dis_close_pix);
373 connect( button[ButtonClose], SIGNAL( clicked() ), this, ( SLOT( closeWindow() ) ) );
374 hb->addWidget(button[ButtonClose]);
376 break;
378 case '_': // Spacer item
379 hb->addItem( new QSpacerItem( 5, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ) );
385 void StdClient::activeChange()
387 bool on = isActive();
388 if (button[ButtonMenu] && (icon().pixmap( QIconSet::Small, QIconSet::Normal ).isNull()))
389 button[ButtonMenu]->setIconSet(on ? *menu_pix : *dis_menu_pix);
390 if (button[ButtonSticky])
391 button[ButtonSticky]->setIconSet(isOnAllDesktops() ? on ? *pindown_pix : *dis_pindown_pix :
392 on ? *pinup_pix : *dis_pinup_pix );
393 if (button[ButtonMinimize])
394 button[ButtonMinimize]->setIconSet(on ? *minimize_pix : *dis_minimize_pix);
395 if (button[ButtonMaximize])
396 button[ButtonMaximize]->setIconSet(on ? *maximize_pix : *dis_maximize_pix);
397 if (button[ButtonClose])
398 button[ButtonClose]->setIconSet(on ? *close_pix : *dis_close_pix);
399 if (button[ButtonHelp])
400 button[ButtonHelp]->setIconSet(on ? *question_mark_pix : *dis_question_mark_pix);
401 widget()->repaint( titlebar->geometry(), false );
405 StdClient::~StdClient()
407 for (int n=0; n<ButtonTypeCount; n++) {
408 if (button[n]) delete button[n];
413 void StdClient::resizeEvent( QResizeEvent* )
415 QRegion rr = widget()->rect();
416 QRect t = titlebar->geometry();
417 // t.setTop( 0 );
418 // QRegion r = rr.subtract( QRect( t.x()+1, 0, t.width()-2, 1 ) );
419 // setMask( r );
421 if ( widget()->isVisibleToTLW() && !widget()->testWFlags( WStaticContents )) {
422 // manual clearing without the titlebar (we selected WResizeNoErase )
423 QRect cr( 2, 2, width()-4, height()- 4 );
424 widget()->erase( QRegion( cr ).subtract( t ) );
428 /*!\reimp
430 void StdClient::captionChange()
432 widget()->repaint( titlebar->geometry(), FALSE );
436 /*!\reimp
438 void StdClient::maximizeChange()
440 bool m = maximizeMode() == MaximizeFull;
441 if (button[ButtonMaximize]) {
442 button[ButtonMaximize]->setIconSet( m?*normalize_pix:*maximize_pix );
443 QToolTip::remove( button[ButtonMaximize] );
444 button[ButtonMaximize]->setToolTip( m ? i18n("Restore") : i18n("Maximize") );
449 /*!\reimp
451 void StdClient::desktopChange()
453 bool s = isOnAllDesktops();
454 if (button[ButtonSticky]) {
455 button[ButtonSticky]->setIconSet( s?*pindown_pix:*pinup_pix );
456 QToolTip::remove( button[ButtonSticky] );
457 button[ButtonSticky]->setToolTip( s ? i18n("Not On All Desktops") : i18n("On All Desktops") );
461 void StdClient::paintEvent( QPaintEvent* )
463 QPainter p( widget() );
464 QRect t = titlebar->geometry();
465 QRegion r = widget()->rect();
466 r = r.subtract( t );
467 p.setClipRegion( r );
468 qDrawWinPanel( &p, widget()->rect(), widget()->colorGroup() );
469 // t.setTop( 1 );
470 // p.setClipRegion( t );
471 // t.setTop( 0 );
473 QRect titleRect( 0, 0, t.width(), t.height() );
474 titleBuffer->resize( titleRect.width(), titleRect.height() );
475 QPainter p2( titleBuffer );
477 drawGradient(p2, titleRect, options()->color(KDecorationOptions::ColorTitleBar, isActive()),
478 options()->color(KDecorationOptions::ColorTitleBlend, isActive()));
479 // p.setPen( options()->color(KDecorationOptions::ColorTitleBar, isActive()).light() );
480 // p.drawLine(t.left(), t.top()+1, t.right(), t.top()+1);
481 if ( isActive() )
482 qDrawShadePanel( &p2, 0, 0, titleRect.width(), titleRect.height(),
483 widget()->colorGroup(), true, 1 );
484 titleRect.setLeft( 4 );
485 titleRect.setWidth( titleRect.width() - 2 );
486 p2.setPen(options()->color(KDecorationOptions::ColorFont, isActive()));
487 p2.setFont(options()->font(isActive()));
488 p2.drawText( titleRect, AlignLeft|AlignVCenter|SingleLine, caption() );
489 p2.end();
490 p.end();
491 bitBlt( widget(), t.topLeft(), titleBuffer );
495 void StdClient::mouseDoubleClickEvent( QMouseEvent * e )
497 if ( e->button() == LeftButton && titlebar->geometry().contains( e->pos() ) )
498 titlebarDblClickOperation();
502 void StdClient::iconChange()
504 if (button[ButtonMenu]) {
505 if ( icon().pixmap( QIconSet::Small, QIconSet::Normal ).isNull())
506 button[ButtonMenu]->setIconSet(isActive() ? *menu_pix : *dis_menu_pix);
507 else
508 button[ButtonMenu]->setIconSet( icon().pixmap( QIconSet::Small, QIconSet::Normal ) );
509 button[ButtonMenu]->repaint( FALSE );
515 Indicates that the menu button has been clicked. One press shows
516 the window operation menu, a double click closes the window.
518 void StdClient::menuButtonPressed()
520 QRect menuRect = button[ButtonMenu]->rect();
521 menuRect.addCoords(-1, 0, +1, +2);
522 QPoint menuTop = button[ButtonMenu]->mapToGlobal(menuRect.topLeft());
523 QPoint menuBottom = button[ButtonMenu]->mapToGlobal(menuRect.bottomRight());
524 KDecorationFactory* f = factory(); // needs to be saved before
525 showWindowMenu( QRect(menuTop, menuBottom) );
526 if( !f->exists( this )) // destroyed, return immediately
527 return;
528 button[ButtonMenu]->setDown(false);
532 void StdClient::maxButtonClicked( ButtonState button )
534 maximize( button );
537 bool StdClient::eventFilter( QObject* o, QEvent* e )
539 if ( o != widget() )
540 return false;
542 switch ( e->type() ) {
543 case QEvent::Resize:
544 resizeEvent( static_cast< QResizeEvent* >( e ) );
545 return true;
547 case QEvent::Paint:
548 paintEvent( static_cast< QPaintEvent* >( e ) );
549 return true;
551 case QEvent::MouseButtonDblClick:
552 mouseDoubleClickEvent( static_cast< QMouseEvent* >( e ) );
553 return true;
555 case QEvent::MouseButtonPress:
556 processMousePressEvent( static_cast< QMouseEvent* >( e ) );
557 return true;
559 default:
560 return false;
564 QSize StdClient::minimumSize() const
566 return widget()->minimumSize().expandedTo( QSize( 100, 50 ));
569 void StdClient::borders( int& left, int& right, int& top, int& bottom ) const
571 left = right = bottom = 6;
572 top = 6 + widget()->fontMetrics().lineSpacing()+2;
575 void StdClient::resize( const QSize& s )
577 widget()->resize( s );
580 StdToolClient::StdToolClient( KDecorationBridge* b, KDecorationFactory* f )
581 : KDecoration( b, f )
585 void StdToolClient::init()
587 createMainWidget();
588 widget()->installEventFilter( this );
590 widget()->setFont(options()->font(isActive(), true ));
592 QGridLayout* g = new QGridLayout( widget(), 0, 0, 2 );
593 g->setRowStretch( 1, 10 );
594 if( isPreview())
595 g->addWidget( new QLabel( i18n( "<center><b>KDE 1 decoration</b></center>" ), widget()), 1, 1 );
596 else
597 g->addItem( new QSpacerItem( 0, 0 ), 1, 1 ); //no widget in the middle
598 g->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ) );
600 g->addColSpacing(0, 1);
601 g->addColSpacing(2, 1);
602 g->addRowSpacing(2, 1);
604 closeBtn = new QToolButton( widget(), 0 );
605 closeBtn->setToolTip( i18n("Close") );
606 connect( closeBtn, SIGNAL( clicked() ), this, ( SLOT( closeWindow() ) ) );
607 closeBtn->setFixedSize( 13, 13);
608 reset( -1U );
610 QHBoxLayout* hb = new QHBoxLayout;
611 g->addLayout( hb, 0, 1 );
613 int fh = widget()->fontMetrics().lineSpacing()+2;
615 titlebar = new QSpacerItem(10, fh, QSizePolicy::Expanding,
616 QSizePolicy::Minimum );
617 hb->addItem( titlebar );
618 hb->addWidget( closeBtn );
621 StdToolClient::~StdToolClient()
625 void StdToolClient::resizeEvent( QResizeEvent* )
627 // QRegion r = rect();
628 // QRect t = titlebar->geometry();
629 // t.setTop( 0 );
630 // r = r.subtract( QRect(0, 0, width(), 1) );
631 // r = r.subtract (QRect( 0, 0, 1, t.height() ) );
632 // r = r.subtract (QRect( width()-1, 0, 1, t.height() ) );
633 // setMask( r );
636 void StdToolClient::paintEvent( QPaintEvent* )
638 QPainter p( widget() );
639 QRect t = titlebar->geometry();
640 QRect r = widget()->rect();
641 qDrawWinPanel( &p, r, widget()->colorGroup() );
642 r.setTop( t.bottom()+1 );
643 qDrawWinPanel( &p, r, widget()->colorGroup() );
644 p.fillRect( QRect( QPoint(t.topLeft() ), QPoint( width() - t.left(), t.bottom() ) ),
645 options()->color(KDecorationOptions::ColorTitleBar, isActive()));
646 p.setPen( options()->color(KDecorationOptions::ColorTitleBar, isActive()).light() );
647 t.setLeft( t.left() + 4 );
648 t.setRight( t.right() - 2 );
649 p.setPen(options()->color(KDecorationOptions::ColorFont, isActive()));
650 p.setFont(options()->font(isActive(), true));
651 p.drawText( t, AlignLeft|AlignVCenter|SingleLine, caption() );
655 void StdToolClient::mouseDoubleClickEvent( QMouseEvent * e )
657 if ( e->button() == LeftButton && titlebar->geometry().contains( e->pos() ) )
658 titlebarDblClickOperation();
661 void StdToolClient::captionChange()
663 widget()->repaint( titlebar->geometry(), FALSE );
666 void StdToolClient::reset( unsigned long )
668 QImage img = close_pix->convertToImage();
669 img = img.smoothScale( 12, 12 );
670 QPixmap pm;
671 pm.convertFromImage( img );
672 closeBtn->setPixmap( pm );
673 widget()->setFont(options()->font(isActive(), true ));
676 bool StdToolClient::eventFilter( QObject* o, QEvent* e )
678 if ( o != widget() )
679 return false;
681 switch ( e->type() ) {
682 case QEvent::Resize:
683 resizeEvent( static_cast< QResizeEvent* >( e ) );
684 return true;
686 case QEvent::Paint:
687 paintEvent( static_cast< QPaintEvent* >( e ) );
688 return true;
690 case QEvent::MouseButtonDblClick:
691 mouseDoubleClickEvent( static_cast< QMouseEvent* >( e ) );
692 return true;
694 case QEvent::MouseButtonPress:
695 processMousePressEvent( static_cast< QMouseEvent* >( e ) );
696 return true;
698 default:
699 return false;
703 QSize StdToolClient::minimumSize() const
705 return widget()->minimumSize().expandedTo( QSize( 100, 50 ));
708 void StdToolClient::borders( int& left, int& right, int& top, int& bottom ) const
710 left = right = bottom = 6;
711 top = 6 + widget()->fontMetrics().lineSpacing();
714 void StdToolClient::resize( const QSize& s )
716 widget()->resize( s );
719 StdFactory::StdFactory()
721 create_pixmaps();
724 StdFactory::~StdFactory()
726 delete_pixmaps();
729 const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask | NET::DesktopMask | NET::DockMask
730 | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask
731 | NET::UtilityMask | NET::SplashMask;
733 KDecoration* StdFactory::createDecoration( KDecorationBridge* b )
735 NET::WindowType type = windowType( SUPPORTED_WINDOW_TYPES_MASK, b );
736 if( type == NET::Utility || type == NET::Menu || type == NET::Toolbar )
737 return new StdToolClient( b, this );
738 return new StdClient( b, this );
741 bool StdFactory::reset( unsigned long mask )
743 bool needHardReset = false;
745 // doesn't obey the Border size setting
746 if( mask & ( SettingFont | SettingButtons ))
747 needHardReset = true;
749 if( mask & ( SettingFont | SettingColors )) {
750 KDE1::delete_pixmaps();
751 KDE1::create_pixmaps();
754 if( !needHardReset )
755 resetDecorations( mask );
756 return needHardReset;
759 bool StdFactory::supports( Ability ability )
761 switch( ability )
763 case AbilityAnnounceButtons:
764 case AbilityButtonMenu:
765 case AbilityButtonOnAllDesktops:
766 case AbilityButtonHelp:
767 case AbilityButtonMinimize:
768 case AbilityButtonMaximize:
769 case AbilityButtonClose:
770 case AbilityButtonSpacer:
771 return true;
772 default:
773 return false;
780 extern "C"
782 KDE_EXPORT KDecorationFactory *create_factory()
784 return new KDE1::StdFactory();
788 #include "kde1client.moc"