00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include "kdecoration.h"
00026
00027
#include <kdebug.h>
00028
#include <qapplication.h>
00029
#include <kglobal.h>
00030
#include <assert.h>
00031
#if defined Q_WS_X11 && ! defined K_WS_QTONLY
00032
#include <X11/Xlib.h>
00033
#include <fixx11h.h>
00034
#endif
00035
00036
#include "kdecoration_p.h"
00037
#include "kdecorationfactory.h"
00038
00039
KDecorationOptions* KDecoration::options_;
00040
00041 KDecoration::KDecoration( KDecorationBridge* bridge, KDecorationFactory* factory )
00042 : bridge_( bridge ),
00043 w_( NULL ),
00044 factory_( factory )
00045 {
00046 factory->addDecoration(
this );
00047 }
00048
00049 KDecoration::~KDecoration()
00050 {
00051
factory()->removeDecoration(
this );
00052
delete w_;
00053 }
00054
00055 const KDecorationOptions*
KDecoration::options()
00056 {
00057
return options_;
00058 }
00059
00060 void KDecoration::createMainWidget( WFlags flags )
00061 {
00062
00063
setMainWidget(
new QWidget(
initialParentWidget(),
"decoration widget",
initialWFlags() | flags ));
00064 }
00065
00066 void KDecoration::setMainWidget( QWidget* w )
00067 {
00068 assert( w_ == NULL );
00069 w_ = w;
00070 w->setMouseTracking(
true );
00071
widget()->resize(
geometry().size());
00072 }
00073
00074 QWidget*
KDecoration::initialParentWidget()
const
00075
{
00076
return bridge_->initialParentWidget();
00077 }
00078
00079 Qt::WFlags
KDecoration::initialWFlags()
const
00080
{
00081
return bridge_->initialWFlags();
00082 }
00083
00084 bool KDecoration::isActive()
const
00085
{
00086
return bridge_->isActive();
00087 }
00088
00089 bool KDecoration::isCloseable()
const
00090
{
00091
return bridge_->isCloseable();
00092 }
00093
00094 bool KDecoration::isMaximizable()
const
00095
{
00096
return bridge_->isMaximizable();
00097 }
00098
00099 KDecoration::MaximizeMode
KDecoration::maximizeMode()
const
00100
{
00101
return bridge_->maximizeMode();
00102 }
00103
00104 bool KDecoration::isMinimizable()
const
00105
{
00106
return bridge_->isMinimizable();
00107 }
00108
00109 bool KDecoration::providesContextHelp()
const
00110
{
00111
return bridge_->providesContextHelp();
00112 }
00113
00114 int KDecoration::desktop()
const
00115
{
00116
return bridge_->desktop();
00117 }
00118
00119 bool KDecoration::isModal()
const
00120
{
00121
return bridge_->isModal();
00122 }
00123
00124 bool KDecoration::isShadeable()
const
00125
{
00126
return bridge_->isShadeable();
00127 }
00128
00129 bool KDecoration::isShade()
const
00130
{
00131
return bridge_->isShade();
00132 }
00133
00134 bool KDecoration::isSetShade()
const
00135
{
00136
return bridge_->isSetShade();
00137 }
00138
00139 bool KDecoration::keepAbove()
const
00140
{
00141
return bridge_->keepAbove();
00142 }
00143
00144 bool KDecoration::keepBelow()
const
00145
{
00146
return bridge_->keepBelow();
00147 }
00148
00149 bool KDecoration::isMovable()
const
00150
{
00151
return bridge_->isMovable();
00152 }
00153
00154 bool KDecoration::isResizable()
const
00155
{
00156
return bridge_->isResizable();
00157 }
00158
00159 NET::WindowType
KDecoration::windowType(
unsigned long supported_types )
const
00160
{
00161
return bridge_->windowType( supported_types );
00162 }
00163
00164 QIconSet
KDecoration::icon()
const
00165
{
00166
return bridge_->icon();
00167 }
00168
00169 QString
KDecoration::caption()
const
00170
{
00171
return bridge_->caption();
00172 }
00173
00174 void KDecoration::processMousePressEvent( QMouseEvent* e )
00175 {
00176
return bridge_->processMousePressEvent( e );
00177 }
00178
00179 void KDecoration::showWindowMenu( QPoint pos )
00180 {
00181 bridge_->showWindowMenu( pos );
00182 }
00183
00184 void KDecoration::performWindowOperation( WindowOperation op )
00185 {
00186 bridge_->performWindowOperation( op );
00187 }
00188
00189 void KDecoration::setMask(
const QRegion& reg,
int mode )
00190 {
00191 bridge_->setMask( reg, mode );
00192 }
00193
00194 void KDecoration::clearMask()
00195 {
00196 bridge_->setMask( QRegion(), 0 );
00197 }
00198
00199 bool KDecoration::isPreview()
const
00200
{
00201
return bridge_->isPreview();
00202 }
00203
00204 QRect
KDecoration::geometry()
const
00205
{
00206
return bridge_->geometry();
00207 }
00208
00209 QRect
KDecoration::iconGeometry()
const
00210
{
00211
return bridge_->iconGeometry();
00212 }
00213
00214 QRegion
KDecoration::unobscuredRegion(
const QRegion& r )
const
00215
{
00216
return bridge_->unobscuredRegion( r );
00217 }
00218
00219 QWidget*
KDecoration::workspaceWidget()
const
00220
{
00221
return bridge_->workspaceWidget();
00222 }
00223
00224 void KDecoration::closeWindow()
00225 {
00226 bridge_->closeWindow();
00227 }
00228
00229 void KDecoration::maximize( MaximizeMode mode )
00230 {
00231 bridge_->maximize( mode );
00232 }
00233
00234 void KDecoration::minimize()
00235 {
00236 bridge_->minimize();
00237 }
00238
00239 void KDecoration::showContextHelp()
00240 {
00241 bridge_->showContextHelp();
00242 }
00243
00244
void KDecoration::setDesktop(
int desktop )
00245 {
00246 bridge_->setDesktop( desktop );
00247 }
00248
00249 void KDecoration::toggleOnAllDesktops()
00250 {
00251
if(
isOnAllDesktops())
00252 setDesktop( bridge_->currentDesktop());
00253
else
00254 setDesktop( NET::OnAllDesktops );
00255 }
00256
00257 void KDecoration::titlebarDblClickOperation()
00258 {
00259 bridge_->titlebarDblClickOperation();
00260 }
00261
00262 void KDecoration::setShade(
bool set )
00263 {
00264 bridge_->setShade( set );
00265 }
00266
00267 void KDecoration::setKeepAbove(
bool set )
00268 {
00269 bridge_->setKeepAbove( set );
00270 }
00271
00272 void KDecoration::setKeepBelow(
bool set )
00273 {
00274 bridge_->setKeepBelow( set );
00275 }
00276
00277 bool KDecoration::drawbound(
const QRect&,
bool )
00278 {
00279
return false;
00280 }
00281
00282 bool KDecoration::animateMinimize(
bool )
00283 {
00284
return false;
00285 }
00286
00287
bool KDecoration::windowDocked( Position )
00288 {
00289
return false;
00290 }
00291
00292 void KDecoration::helperShowHide(
bool show )
00293 {
00294 bridge_->helperShowHide( show );
00295 }
00296
00297 void KDecoration::reset(
unsigned long )
00298 {
00299 }
00300
00301 void KDecoration::grabXServer()
00302 {
00303 bridge_->grabXServer(
true );
00304 }
00305
00306 void KDecoration::ungrabXServer()
00307 {
00308 bridge_->grabXServer(
false );
00309 }
00310
00311 KDecoration::Position
KDecoration::mousePosition(
const QPoint& p )
const
00312
{
00313
const int range = 16;
00314
int bleft, bright, btop, bbottom;
00315
borders( bleft, bright, btop, bbottom );
00316 btop = KMIN( btop, 4 );
00317
00318 Position m = PositionCenter;
00319
00320
if ( ( p.x() > bleft && p.x() <
widget()->width() - bright )
00321 && ( p.y() > btop && p.y() <
widget()->height() - bbottom ) )
00322
return PositionCenter;
00323
00324
if ( p.y() <= KMAX( range, btop ) && p.x() <= KMAX( range, bleft ))
00325 m = PositionTopLeft;
00326
else if ( p.y() >=
widget()->height()- KMAX( range, bbottom )
00327 && p.x() >=
widget()->width()- KMAX( range, bright ))
00328 m = PositionBottomRight;
00329
else if ( p.y() >=
widget()->height()- KMAX( range, bbottom ) && p.x() <= KMAX( range, bleft ))
00330 m = PositionBottomLeft;
00331
else if ( p.y() <= KMAX( range, btop ) && p.x() >=
widget()->width()- KMAX( range, bright ))
00332 m = PositionTopRight;
00333
else if ( p.y() <= btop )
00334 m = PositionTop;
00335
else if ( p.y() >=
widget()->height()-bbottom )
00336 m = PositionBottom;
00337
else if ( p.x() <= bleft )
00338 m = PositionLeft;
00339
else if ( p.x() >=
widget()->width()-bright )
00340 m = PositionRight;
00341
else
00342 m = PositionCenter;
00343
return m;
00344 }
00345
00346 KDecorationOptions::KDecorationOptions()
00347 {
00348 assert( KDecoration::options_ == NULL );
00349 KDecoration::options_ =
this;
00350 }
00351
00352 KDecorationOptions::~KDecorationOptions()
00353 {
00354 assert( KDecoration::options_ ==
this );
00355 KDecoration::options_ = NULL;
00356 }
00357
00358 const QColor&
KDecorationOptions::color(ColorType type,
bool active)
const
00359
{
00360
return(d->colors[type + (active ? 0 : NUM_COLORS)]);
00361 }
00362
00363 const QFont&
KDecorationOptions::font(
bool active,
bool small)
const
00364
{
00365
if ( small )
00366
return(active ? d->activeFontSmall : d->inactiveFontSmall);
00367
else
00368
return(active ? d->activeFont : d->inactiveFont);
00369 }
00370
00371 const QColorGroup&
KDecorationOptions::colorGroup(ColorType type,
bool active)
const
00372
{
00373
int idx = type + (active ? 0 : NUM_COLORS);
00374
if(d->cg[idx])
00375
return(*d->cg[idx]);
00376 d->cg[idx] =
new QColorGroup(Qt::black, d->colors[idx], d->colors[idx].light(150),
00377 d->colors[idx].dark(), d->colors[idx].dark(120),
00378 Qt::black, QApplication::palette().active().
00379 base());
00380
return(*d->cg[idx]);
00381 }
00382
00383 bool KDecorationOptions::customButtonPositions()
const
00384
{
00385
return d->custom_button_positions;
00386 }
00387
00388 QString
KDecorationOptions::titleButtonsLeft()
const
00389
{
00390
return d->title_buttons_left;
00391 }
00392
00393 QString
KDecorationOptions::titleButtonsRight()
const
00394
{
00395
return d->title_buttons_right;
00396 }
00397
00398 bool KDecorationOptions::showTooltips()
const
00399
{
00400
return d->show_tooltips;
00401 }
00402
00403 KDecorationOptions::BorderSize
KDecorationOptions::preferredBorderSize( KDecorationFactory* factory )
const
00404
{
00405 assert( factory != NULL );
00406
if( d->cached_border_size == BordersCount )
00407 d->cached_border_size = d->findPreferredBorderSize( d->border_size,
00408 factory->borderSizes());
00409
return d->cached_border_size;
00410 }
00411
00412
bool KDecorationOptions::moveResizeMaximizedWindows()
const
00413
{
00414
return d->move_resize_maximized_windows;
00415 }
00416
00417
#include "kdecoration.moc"