1 /*****************************************************************
2 kwin - the KDE window manager
4 Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org>
5 ******************************************************************/
6 #include "kde1client.h"
9 #include <qtoolbutton.h>
11 #include <qdrawutil.h>
13 #include <kdrawutil.h>
16 #include <qdatetime.h>
20 #include "kde1client_bitmaps.h"
22 // Default button layout
23 const char default_left
[] = "MS";
24 const char default_right
[] = "H_IAX";
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(); }
55 if ( pixmaps_created
)
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()
158 delete normalize_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
;
170 delete dis_question_mark_pix
;
172 pixmaps_created
= false;
183 // Don't draw a million vertical lines if we don't need to.
185 if (c1
== c2
|| QPixmap::defaultDepth() <= 8)
191 // rikkus: Adapted from KPixmapEffect::gradient().
194 int gca
= c1
.green();
197 int rDiff
= c2
.red() - rca
;
198 int gDiff
= c2
.green() - gca
;
199 int bDiff
= c2
.blue() - bca
;
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
++)
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()
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 );
257 g
->addWidget( new QLabel( i18n( "<center><b>KDE 1 preview</b></center>" ), widget()), 1, 1 );
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
++) {
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
293 // button[2]->hide();
300 void StdClient::addButtons(QBoxLayout
*hb
, const QString
& s
)
302 if (s
.length() > 0) {
303 for (unsigned n
=0; n
< s
.length(); 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
);
313 button
[ButtonMenu
]->setIconSet( icon().pixmap( QIconSet::Small
, QIconSet::Normal
));
314 connect( button
[0], SIGNAL( pressed() ), this, SLOT( menuButtonPressed() ) );
315 hb
->addWidget(button
[ButtonMenu
]);
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
]);
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
]);
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
]);
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
]);
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
]);
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();
418 // QRegion r = rr.subtract( QRect( t.x()+1, 0, t.width()-2, 1 ) );
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
) );
430 void StdClient::captionChange()
432 widget()->repaint( titlebar
->geometry(), FALSE
);
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") );
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();
467 p
.setClipRegion( r
);
468 qDrawWinPanel( &p
, widget()->rect(), widget()->colorGroup() );
470 // p.setClipRegion( t );
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);
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() );
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
);
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
528 button
[ButtonMenu
]->setDown(false);
532 void StdClient::maxButtonClicked( ButtonState button
)
537 bool StdClient::eventFilter( QObject
* o
, QEvent
* e
)
542 switch ( e
->type() ) {
544 resizeEvent( static_cast< QResizeEvent
* >( e
) );
548 paintEvent( static_cast< QPaintEvent
* >( e
) );
551 case QEvent::MouseButtonDblClick
:
552 mouseDoubleClickEvent( static_cast< QMouseEvent
* >( e
) );
555 case QEvent::MouseButtonPress
:
556 processMousePressEvent( static_cast< QMouseEvent
* >( e
) );
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()
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 );
595 g
->addWidget( new QLabel( i18n( "<center><b>KDE 1 decoration</b></center>" ), widget()), 1, 1 );
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);
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();
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() ) );
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 );
671 pm
.convertFromImage( img
);
672 closeBtn
->setPixmap( pm
);
673 widget()->setFont(options()->font(isActive(), true ));
676 bool StdToolClient::eventFilter( QObject
* o
, QEvent
* e
)
681 switch ( e
->type() ) {
683 resizeEvent( static_cast< QResizeEvent
* >( e
) );
687 paintEvent( static_cast< QPaintEvent
* >( e
) );
690 case QEvent::MouseButtonDblClick
:
691 mouseDoubleClickEvent( static_cast< QMouseEvent
* >( e
) );
694 case QEvent::MouseButtonPress
:
695 processMousePressEvent( static_cast< QMouseEvent
* >( e
) );
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()
724 StdFactory::~StdFactory()
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();
755 resetDecorations( mask
);
756 return needHardReset
;
759 bool StdFactory::supports( Ability 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
:
782 KDE_EXPORT KDecorationFactory
*create_factory()
784 return new KDE1::StdFactory();
788 #include "kde1client.moc"