1
/*****************************************************************
2
This file is part of the KDE project.
4
Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
6
Permission is hereby granted, free of charge, to any person obtaining a
7
copy of this software and associated documentation files (the "Software"),
8
to deal in the Software without restriction, including without limitation
9
the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
and/or sell copies of the Software, and to permit persons to whom the
11
Software is furnished to do so, subject to the following conditions:
13
The above copyright notice and this permission notice shall be included in
14
all copies or substantial portions of the Software.
16
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22
DEALINGS IN THE SOFTWARE.
23
******************************************************************/
25
#include "kdecoration.h"
26
#include "kdecoration_p.h"
29
#include <QApplication>
32
#if defined Q_WS_X11 && ! defined K_WS_QTONLY
38
#include "kdecorationfactory.h"
39
#include "kdecorationbridge.h"
43
Extending KDecoration:
44
======================
46
If KDecoration will ever need to be extended in a way that'd break binary compatibility
47
(i.e. adding new virtual methods most probably), new class KDecoration2 should be
48
inherited from KDecoration and those methods added there. Code that would depend
49
on the new functionality could then dynamic_cast<> to KDecoration2 to check whether
50
it is available and use it.
52
KCommonDecoration would have to be extended the same way, adding KCommonDecoration2
53
inheriting KCommonDecoration and adding the new API matching KDecoration2.
58
KDecorationOptions* KDecoration::options_;
60
KDecoration::KDecoration(KDecorationBridge* bridge, KDecorationFactory* factory)
65
factory->addDecoration(this);
68
KDecoration::~KDecoration()
70
factory()->removeDecoration(this);
74
const KDecorationOptions* KDecoration::options()
79
void KDecoration::createMainWidget(Qt::WFlags flags)
82
QWidget *w = new QWidget(initialParentWidget(), initialWFlags() | flags);
83
w->setObjectName(QLatin1String("decoration widget"));
84
w->setAttribute(Qt::WA_PaintOnScreen);
85
if (options()->showTooltips())
86
w->setAttribute(Qt::WA_AlwaysShowToolTips);
90
void KDecoration::setMainWidget(QWidget* w)
94
w->setMouseTracking(true);
95
widget()->resize(geometry().size());
98
QWidget* KDecoration::initialParentWidget() const
100
return bridge_->initialParentWidget();
103
Qt::WFlags KDecoration::initialWFlags() const
105
return bridge_->initialWFlags();
108
bool KDecoration::isActive() const
110
return bridge_->isActive();
113
bool KDecoration::isCloseable() const
115
return bridge_->isCloseable();
118
bool KDecoration::isMaximizable() const
120
return bridge_->isMaximizable();
123
KDecoration::MaximizeMode KDecoration::maximizeMode() const
125
return bridge_->maximizeMode();
128
bool KDecoration::isMinimizable() const
130
return bridge_->isMinimizable();
133
bool KDecoration::providesContextHelp() const
135
return bridge_->providesContextHelp();
138
int KDecoration::desktop() const
140
return bridge_->desktop();
143
bool KDecoration::isModal() const
145
return bridge_->isModal();
148
bool KDecoration::isShadeable() const
150
return bridge_->isShadeable();
153
bool KDecoration::isShade() const
155
return bridge_->isShade();
158
bool KDecoration::isSetShade() const
160
return bridge_->isSetShade();
163
bool KDecoration::keepAbove() const
165
return bridge_->keepAbove();
168
bool KDecoration::keepBelow() const
170
return bridge_->keepBelow();
173
bool KDecoration::isMovable() const
175
return bridge_->isMovable();
178
bool KDecoration::isResizable() const
180
return bridge_->isResizable();
183
NET::WindowType KDecoration::windowType(unsigned long supported_types) const
185
// this one is also duplicated in KDecorationFactory
186
return bridge_->windowType(supported_types);
189
QIcon KDecoration::icon() const
191
return bridge_->icon();
194
QString KDecoration::caption() const
196
return bridge_->caption();
199
void KDecoration::processMousePressEvent(QMouseEvent* e)
201
return bridge_->processMousePressEvent(e);
204
void KDecoration::showWindowMenu(const QRect &pos)
206
bridge_->showWindowMenu(pos);
209
void KDecoration::showWindowMenu(QPoint pos)
211
bridge_->showWindowMenu(pos);
214
void KDecoration::performWindowOperation(WindowOperation op)
216
bridge_->performWindowOperation(op);
219
void KDecoration::setMask(const QRegion& reg, int mode)
221
bridge_->setMask(reg, mode);
224
void KDecoration::clearMask()
226
bridge_->setMask(QRegion(), 0);
229
bool KDecoration::isPreview() const
231
return bridge_->isPreview();
234
QRect KDecoration::geometry() const
236
return bridge_->geometry();
239
QRect KDecoration::iconGeometry() const
241
return bridge_->iconGeometry();
244
QRegion KDecoration::unobscuredRegion(const QRegion& r) const
246
return bridge_->unobscuredRegion(r);
249
WId KDecoration::windowId() const
251
return bridge_->windowId();
254
void KDecoration::closeWindow()
256
bridge_->closeWindow();
259
void KDecoration::maximize(Qt::MouseButtons button)
261
performWindowOperation(options()->operationMaxButtonClick(button));
264
void KDecoration::maximize(MaximizeMode mode)
266
bridge_->maximize(mode);
269
void KDecoration::minimize()
274
void KDecoration::showContextHelp()
276
bridge_->showContextHelp();
279
void KDecoration::setDesktop(int desktop)
281
bridge_->setDesktop(desktop);
284
void KDecoration::toggleOnAllDesktops()
286
if (isOnAllDesktops())
287
setDesktop(bridge_->currentDesktop());
289
setDesktop(NET::OnAllDesktops);
292
void KDecoration::titlebarDblClickOperation()
294
bridge_->titlebarDblClickOperation();
297
void KDecoration::titlebarMouseWheelOperation(int delta)
299
bridge_->titlebarMouseWheelOperation(delta);
302
void KDecoration::setShade(bool set)
304
bridge_->setShade(set);
307
void KDecoration::setKeepAbove(bool set)
309
bridge_->setKeepAbove(set);
312
void KDecoration::setKeepBelow(bool set)
314
bridge_->setKeepBelow(set);
317
void KDecoration::emitKeepAboveChanged(bool above)
319
keepAboveChanged(above);
322
void KDecoration::emitKeepBelowChanged(bool below)
324
keepBelowChanged(below);
327
bool KDecoration::drawbound(const QRect&, bool)
332
bool KDecoration::windowDocked(Position)
337
void KDecoration::reset(unsigned long)
341
void KDecoration::grabXServer()
343
bridge_->grabXServer(true);
346
void KDecoration::ungrabXServer()
348
bridge_->grabXServer(false);
351
KDecoration::Position KDecoration::mousePosition(const QPoint& p) const
353
const int range = 16;
354
int bleft, bright, btop, bbottom;
355
borders(bleft, bright, btop, bbottom);
356
btop = qMin(btop, 4); // otherwise whole titlebar would have resize cursor
358
Position m = PositionCenter;
360
if ((p.x() > bleft && p.x() < widget()->width() - bright)
361
&& (p.y() > btop && p.y() < widget()->height() - bbottom))
362
return PositionCenter;
364
if (p.y() <= qMax(range, btop) && p.x() <= qMax(range, bleft))
366
else if (p.y() >= widget()->height() - qMax(range, bbottom)
367
&& p.x() >= widget()->width() - qMax(range, bright))
368
m = PositionBottomRight;
369
else if (p.y() >= widget()->height() - qMax(range, bbottom) && p.x() <= qMax(range, bleft))
370
m = PositionBottomLeft;
371
else if (p.y() <= qMax(range, btop) && p.x() >= widget()->width() - qMax(range, bright))
372
m = PositionTopRight;
373
else if (p.y() <= btop)
375
else if (p.y() >= widget()->height() - bbottom)
377
else if (p.x() <= bleft)
379
else if (p.x() >= widget()->width() - bright)
386
QRect KDecoration::transparentRect() const
388
if (KDecorationBridgeUnstable *bridge2 = dynamic_cast<KDecorationBridgeUnstable*>(bridge_))
389
return bridge2->transparentRect();
395
KDecorationUnstable::KDecorationUnstable(KDecorationBridge* bridge, KDecorationFactory* factory)
396
: KDecoration(bridge, factory)
398
Q_ASSERT(dynamic_cast< KDecorationBridgeUnstable* >(bridge));
401
KDecorationUnstable::~KDecorationUnstable()
405
bool KDecorationUnstable::compositingActive() const
407
return static_cast< KDecorationBridgeUnstable* >(bridge_)->compositingActive();
410
void KDecorationUnstable::padding(int &left, int &right, int &top, int &bottom) const
412
left = right = top = bottom = 0;
417
bool KDecorationUnstable::isClientGroupActive()
419
return static_cast< KDecorationBridgeUnstable* >(bridge_)->isClientGroupActive();
422
QList< ClientGroupItem > KDecorationUnstable::clientGroupItems() const
424
return static_cast< KDecorationBridgeUnstable* >(bridge_)->clientGroupItems();
427
long KDecorationUnstable::itemId(int index)
429
return static_cast< KDecorationBridgeUnstable* >(bridge_)->itemId(index);
432
int KDecorationUnstable::visibleClientGroupItem()
434
return static_cast< KDecorationBridgeUnstable* >(bridge_)->visibleClientGroupItem();
437
void KDecorationUnstable::setVisibleClientGroupItem(int index)
439
static_cast< KDecorationBridgeUnstable* >(bridge_)->setVisibleClientGroupItem(index);
442
void KDecorationUnstable::moveItemInClientGroup(int index, int before)
444
static_cast< KDecorationBridgeUnstable* >(bridge_)->moveItemInClientGroup(index, before);
447
void KDecorationUnstable::moveItemToClientGroup(long itemId, int before)
449
static_cast< KDecorationBridgeUnstable* >(bridge_)->moveItemToClientGroup(itemId, before);
452
void KDecorationUnstable::removeFromClientGroup(int index, const QRect& newGeom)
454
static_cast< KDecorationBridgeUnstable* >(bridge_)->removeFromClientGroup(index, newGeom);
457
void KDecorationUnstable::closeClientGroupItem(int index)
459
static_cast< KDecorationBridgeUnstable* >(bridge_)->closeClientGroupItem(index);
462
void KDecorationUnstable::closeAllInClientGroup()
464
static_cast< KDecorationBridgeUnstable* >(bridge_)->closeAllInClientGroup();
467
void KDecorationUnstable::displayClientMenu(int index, const QPoint& pos)
469
static_cast< KDecorationBridgeUnstable* >(bridge_)->displayClientMenu(index, pos);
472
KDecoration::WindowOperation KDecorationUnstable::buttonToWindowOperation(Qt::MouseButtons button)
474
return static_cast< KDecorationBridgeUnstable* >(bridge_)->buttonToWindowOperation(button);
477
QString KDecorationDefines::clientGroupItemDragMimeType()
479
return "text/ClientGroupItem";
482
KDecorationOptions::KDecorationOptions()
483
: d(new KDecorationOptionsPrivate)
485
assert(KDecoration::options_ == NULL);
486
KDecoration::options_ = this;
489
KDecorationOptions::~KDecorationOptions()
491
assert(KDecoration::options_ == this);
492
KDecoration::options_ = NULL;
496
QColor KDecorationOptions::color(ColorType type, bool active) const
498
return(d->colors[type + (active ? 0 : NUM_COLORS)]);
501
QFont KDecorationOptions::font(bool active, bool small) const
504
return(active ? d->activeFontSmall : d->inactiveFontSmall);
506
return(active ? d->activeFont : d->inactiveFont);
509
QPalette KDecorationOptions::palette(ColorType type, bool active) const
511
int idx = type + (active ? 0 : NUM_COLORS);
513
return(*d->pal[idx]);
514
// TODO: Why construct the palette this way? Is it worth porting to Qt4?
515
//d->pal[idx] = new QPalette(Qt::black, d->colors[idx], d->colors[idx].light(150),
516
// d->colors[idx].dark(), d->colors[idx].dark(120),
517
// Qt::black, QApplication::palette().active().
519
d->pal[idx] = new QPalette(d->colors[idx]);
520
return(*d->pal[idx]);
523
unsigned long KDecorationOptions::updateSettings(KConfig* config)
525
return d->updateSettings(config);
528
bool KDecorationOptions::customButtonPositions() const
530
return d->custom_button_positions;
533
QString KDecorationOptions::titleButtonsLeft() const
535
return d->title_buttons_left;
538
QString KDecorationOptions::defaultTitleButtonsLeft()
543
QString KDecorationOptions::titleButtonsRight() const
545
return d->title_buttons_right;
548
QString KDecorationOptions::defaultTitleButtonsRight()
553
bool KDecorationOptions::showTooltips() const
555
return d->show_tooltips;
558
KDecorationOptions::BorderSize KDecorationOptions::preferredBorderSize(KDecorationFactory* factory) const
560
assert(factory != NULL);
561
if (d->cached_border_size == BordersCount) // invalid
562
d->cached_border_size = d->findPreferredBorderSize(d->border_size,
563
factory->borderSizes());
564
return d->cached_border_size;
567
bool KDecorationOptions::moveResizeMaximizedWindows() const
569
return d->move_resize_maximized_windows;
572
KDecorationDefines::WindowOperation KDecorationOptions::operationMaxButtonClick(Qt::MouseButtons button) const
574
return button == Qt::RightButton ? d->opMaxButtonRightClick :
575
button == Qt::MidButton ? d->opMaxButtonMiddleClick :
576
d->opMaxButtonLeftClick;
579
void KDecorationOptions::setOpMaxButtonLeftClick(WindowOperation op)
581
d->opMaxButtonLeftClick = op;
584
void KDecorationOptions::setOpMaxButtonRightClick(WindowOperation op)
586
d->opMaxButtonRightClick = op;
589
void KDecorationOptions::setOpMaxButtonMiddleClick(WindowOperation op)
591
d->opMaxButtonMiddleClick = op;
594
void KDecorationOptions::setBorderSize(BorderSize bs)
597
d->cached_border_size = BordersCount; // invalid
600
void KDecorationOptions::setCustomButtonPositions(bool b)
602
d->custom_button_positions = b;
605
void KDecorationOptions::setTitleButtonsLeft(const QString& b)
607
d->title_buttons_left = b;
610
void KDecorationOptions::setTitleButtonsRight(const QString& b)
612
d->title_buttons_right = b;
615
#include "kdecoration.moc"