00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef KWIN_CLIENT_H
00013 #define KWIN_CLIENT_H
00014
00015 #include "utils.h"
00016 #include "options.h"
00017 #include "workspace.h"
00018 #include "kdecoration.h"
00019 #include <qframe.h>
00020 #include <qvbox.h>
00021 #include <qpixmap.h>
00022 #include <netwm.h>
00023 #include <kdebug.h>
00024 #include <assert.h>
00025 #include <X11/X.h>
00026 #include <X11/Xlib.h>
00027 #include <X11/Xutil.h>
00028 #include <fixx11h.h>
00029
00030 class QTimer;
00031 class KProcess;
00032 class KStartupInfoData;
00033
00034 namespace KWinInternal
00035 {
00036
00037 class Workspace;
00038 class Client;
00039 class WinInfo;
00040 class SessionInfo;
00041 class Bridge;
00042
00043 class Client : public QObject, public KDecorationDefines
00044 {
00045 Q_OBJECT
00046 public:
00047 Client( Workspace *ws );
00048 Window window() const;
00049 Window frameId() const;
00050 Window wrapperId() const;
00051 Window decorationId() const;
00052
00053 Workspace* workspace() const;
00054 const Client* transientFor() const;
00055 Client* transientFor();
00056 bool isTransient() const;
00057 bool groupTransient() const;
00058 bool wasOriginallyGroupTransient() const;
00059 ClientList mainClients() const;
00060 bool hasTransient( const Client* c, bool indirect ) const;
00061 const ClientList& transients() const;
00062 void checkTransient( Window w );
00063 Client* findModal();
00064 const Group* group() const;
00065 Group* group();
00066 void checkGroup( Group* gr = NULL, bool force = false );
00067
00068 NET::WindowType windowType( bool strict = false, int supported_types = SUPPORTED_WINDOW_TYPES_MASK ) const;
00069
00070 QRect geometry() const;
00071 QSize size() const;
00072 QSize minSize() const;
00073 QPoint pos() const;
00074 QRect rect() const;
00075 int x() const;
00076 int y() const;
00077 int width() const;
00078 int height() const;
00079 QPoint clientPos() const;
00080 QSize clientSize() const;
00081
00082 bool windowEvent( XEvent* e );
00083 virtual bool eventFilter( QObject* o, QEvent* e );
00084
00085 bool manage( Window w, bool isMapped );
00086
00087 void releaseWindow( bool on_shutdown = false );
00088
00089 enum Sizemode
00090 {
00091 SizemodeAny,
00092 SizemodeFixedW,
00093 SizemodeFixedH,
00094 SizemodeMax,
00095 SizemodeShaded
00096 };
00097 QSize adjustedSize( const QSize&, Sizemode mode = SizemodeAny ) const;
00098
00099 QPixmap icon() const;
00100 QPixmap miniIcon() const;
00101
00102 bool isActive() const;
00103 void setActive( bool );
00104
00105 int desktop() const;
00106 void setDesktop( int );
00107 bool isOnDesktop( int d ) const;
00108 bool isOnCurrentDesktop() const;
00109 bool isOnAllDesktops() const;
00110 void setOnAllDesktops( bool set );
00111
00112
00113 bool isShown( bool shaded_is_shown ) const;
00114
00115 enum ShadeMode
00116 {
00117 ShadeNone,
00118 ShadeNormal,
00119 ShadeHover,
00120 ShadeActivated
00121 };
00122 bool isShade() const;
00123 ShadeMode shadeMode() const;
00124 void setShade( ShadeMode mode );
00125 bool isShadeable() const;
00126
00127 bool isMinimized() const;
00128 bool isMaximizable() const;
00129 QRect geometryRestore() const;
00130 MaximizeMode maximizeMode() const;
00131 bool isMinimizable() const;
00132 void setMaximize( bool vertically, bool horizontally );
00133
00134 void setFullScreen( bool set, bool user );
00135 bool isFullScreen() const;
00136 bool isFullScreenable( bool fullscreen_hack = false ) const;
00137 bool userCanSetFullScreen() const;
00138 QRect geometryFSRestore() const { return geom_fs_restore; }
00139 int fullScreenMode() const { return fullscreen_mode; }
00140
00141 bool isUserNoBorder() const;
00142 void setUserNoBorder( bool set );
00143 bool userCanSetNoBorder() const;
00144 bool noBorder() const;
00145
00146 bool skipTaskbar( bool from_outside = false ) const;
00147 void setSkipTaskbar( bool set, bool from_outside );
00148
00149 bool skipPager() const;
00150 void setSkipPager( bool );
00151
00152 bool keepAbove() const;
00153 void setKeepAbove( bool );
00154 bool keepBelow() const;
00155 void setKeepBelow( bool );
00156 Layer layer() const;
00157 Layer belongsToLayer() const;
00158 void invalidateLayer();
00159
00160 void setModal( bool modal );
00161 bool isModal() const;
00162
00163 bool storeSettings() const;
00164 void setStoreSettings( bool );
00165
00166
00167 bool wantsTabFocus() const;
00168 bool wantsInput() const;
00169 bool hasNETSupport() const;
00170 bool isMovable() const;
00171 bool isDesktop() const;
00172 bool isDock() const;
00173 bool isToolbar() const;
00174 bool isTopMenu() const;
00175 bool isMenu() const;
00176 bool isNormalWindow() const;
00177 bool isDialog() const;
00178 bool isSplash() const;
00179 bool isUtility() const;
00180 bool isOverride() const;
00181
00182
00183
00184
00185 bool isSpecialWindow() const;
00186
00187 bool isResizable() const;
00188 bool isCloseable() const;
00189
00190 void takeFocus( bool force, allowed_t );
00191 void demandAttention( bool set = true );
00192
00193 void setMask( const QRegion& r, int mode = X::Unsorted );
00194 QRegion mask() const;
00195
00196 void updateDecoration( bool check_workspace_pos, bool force = false );
00197 void checkBorderSizes();
00198
00199
00200 bool shape() const;
00201 void updateShape();
00202
00203 void setGeometry( int x, int y, int w, int h, ForceGeometry_t force = NormalGeometrySet );
00204 void setGeometry( const QRect& r, ForceGeometry_t force = NormalGeometrySet );
00205 void move( int x, int y, ForceGeometry_t force = NormalGeometrySet );
00206 void move( const QPoint & p, ForceGeometry_t force = NormalGeometrySet );
00207
00208 void plainResize( int w, int h, ForceGeometry_t force = NormalGeometrySet );
00209 void plainResize( const QSize& s, ForceGeometry_t force = NormalGeometrySet );
00210 void keepInArea( const QRect& area );
00211
00212 void growHorizontal();
00213 void shrinkHorizontal();
00214 void growVertical();
00215 void shrinkVertical();
00216
00217 bool providesContextHelp() const;
00218
00219 bool performMouseCommand( Options::MouseCommand, QPoint globalPos );
00220
00221 QCString windowRole() const;
00222 QCString sessionId();
00223 QCString resourceName() const;
00224 QCString resourceClass() const;
00225 QCString wmCommand();
00226 QCString wmClientMachine() const;
00227 Window wmClientLeader() const;
00228 pid_t pid() const;
00229
00230 QRect adjustedClientArea( const QRect& area ) const;
00231
00232 Colormap colormap() const;
00233
00234
00235 void hideClient( bool hide );
00236
00237 void virtualDesktopChange();
00238
00239 QString caption() const;
00240
00241 void keyPressEvent( uint key_code );
00242
00243 Window moveResizeGrabWindow() const;
00244
00245 const QPoint calculateGravitation( bool invert, int gravity = 0 ) const;
00246
00247 void NETMoveResize( int x_root, int y_root, NET::Direction direction );
00248 void NETMoveResizeWindow( int flags, int x, int y, int width, int height );
00249 void restackWindow( Window above, int detail, NET::RequestSource source, bool send_event = false );
00250
00251 void gotPing( Time timestamp );
00252
00253 static QCString staticWindowRole(WId);
00254 static QCString staticSessionId(WId);
00255 static QCString staticWmCommand(WId);
00256 static QCString staticWmClientMachine(WId);
00257 static Window staticWmClientLeader(WId);
00258
00259 void checkWorkspacePosition();
00260 void updateUserTime( Time time = CurrentTime );
00261 Time userTime() const;
00262 bool hasUserTimeSupport() const;
00263 bool ignoreFocusStealing() const;
00264
00265
00266 static void deleteClient( Client* c, allowed_t );
00267
00268 static bool resourceMatch( const Client* c1, const Client* c2 );
00269 static bool belongToSameApplication( const Client* c1, const Client* c2, bool active_hack = false );
00270 static void readIcons( Window win, QPixmap* icon, QPixmap* miniicon );
00271
00272 public slots:
00273 void minimize();
00274 void unminimize();
00275 void closeWindow();
00276 void killWindow();
00277 void maximize( MaximizeMode );
00278 void toggleOnAllDesktops();
00279 void toggleShade();
00280 void showContextHelp();
00281 void autoRaise();
00282 void cancelAutoRaise();
00283 void shadeHover();
00284 void destroyClient();
00285
00286 private:
00287 friend class Bridge;
00288 virtual void processMousePressEvent( QMouseEvent* e );
00289
00290 private:
00291
00292 virtual ~Client();
00293
00294 Position mousePosition( const QPoint& ) const;
00295 void setCursor( Position m );
00296 void setCursor( const QCursor& c );
00297
00298 void animateMinimizeOrUnminimize( bool minimize );
00299 QPixmap animationPixmap( int w );
00300
00301 void drawbound( const QRect& geom );
00302 void clearbound();
00303 void doDrawbound( const QRect& geom, bool clear );
00304
00305
00306 bool mapRequestEvent( XMapRequestEvent* e );
00307 void unmapNotifyEvent( XUnmapEvent*e );
00308 void destroyNotifyEvent( XDestroyWindowEvent*e );
00309 void configureRequestEvent( XConfigureRequestEvent* e );
00310 void propertyNotifyEvent( XPropertyEvent* e );
00311 void clientMessageEvent( XClientMessageEvent* e );
00312 void enterNotifyEvent( XCrossingEvent* e );
00313 void leaveNotifyEvent( XCrossingEvent* e );
00314 void visibilityNotifyEvent( XVisibilityEvent* e );
00315 void focusInEvent( XFocusInEvent* e );
00316 void focusOutEvent( XFocusOutEvent* e );
00317
00318 bool buttonPressEvent( Window w, int button, int state, int x, int y, int x_root, int y_root );
00319 bool buttonReleaseEvent( Window w, int button, int state, int x, int y, int x_root, int y_root );
00320 bool motionNotifyEvent( Window w, int state, int x, int y, int x_root, int y_root );
00321
00322 void processDecorationButtonPress( int button, int state, int x, int y, int x_root, int y_root );
00323
00324 private slots:
00325 void pingTimeout();
00326 void processKillerExited();
00327
00328 private:
00329
00330 void setMappingState( int s );
00331 int mappingState() const;
00332 bool isIconicState() const;
00333 bool isNormalState() const;
00334 bool isManaged() const;
00335 void updateAllowedActions( bool force = false );
00336 QSize sizeForClientSize( const QSize&, Sizemode mode = SizemodeAny ) const;
00337 void changeMaximize( bool horizontal, bool vertical, bool adjust );
00338 void getWmNormalHints();
00339 void getIcons();
00340 void getWmClientLeader();
00341 void fetchName();
00342 void fetchIconicName();
00343 bool hasTransientInternal( const Client* c, bool indirect, ConstClientList& set ) const;
00344
00345 void updateWorkareaDiffs();
00346 void checkDirection( int new_diff, int old_diff, QRect& rect, const QRect& area );
00347 static int computeWorkareaDiff( int left, int right, int a_left, int a_right );
00348 void configureRequest( int value_mask, int rx, int ry, int rw, int rh, int gravity = 0 );
00349
00350 void resizeWithChecks( int w, int h, ForceGeometry_t force = NormalGeometrySet );
00351 void resizeWithChecks( const QSize& s, ForceGeometry_t force = NormalGeometrySet );
00352
00353 bool startMoveResize();
00354 void finishMoveResize( bool cancel );
00355 void leaveMoveResize();
00356 void checkUnrestrictedMoveResize();
00357 void handleMoveResize( int x, int y, int x_root, int y_root );
00358 void positionGeometryTip();
00359 void updateMouseGrab();
00360 void grabButton( int mod );
00361 void ungrabButton( int mod );
00362 void resetMaximize();
00363 void resizeDecoration( const QSize& s );
00364
00365 void pingWindow();
00366 void killProcess( bool ask, Time timestamp = CurrentTime );
00367 void updateUrgency();
00368
00369 void embedClient( Window w, const XWindowAttributes &attr );
00370 void detectNoBorder();
00371 void destroyDecoration();
00372 void updateFrameStrut();
00373
00374 void rawShow();
00375 void rawHide();
00376
00377 Time readUserTimeMapTimestamp( const KStartupInfoData* asn_data,
00378 const SessionInfo* session ) const;
00379 Time readUserCreationTime() const;
00380 static bool sameAppWindowRoleMatch( const Client* c1, const Client* c2, bool active_hack );
00381 void startupIdChanged();
00382
00383 Window client;
00384 Window wrapper;
00385 Window frame;
00386 KDecoration* decoration;
00387 Workspace* wspace;
00388 Bridge* bridge;
00389 int desk;
00390 bool buttonDown;
00391 bool moveResizeMode;
00392 bool move_faked_activity;
00393 Window move_resize_grab_window;
00394 bool unrestrictedMoveResize;
00395 bool isMove() const
00396 {
00397 return moveResizeMode && mode == PositionCenter;
00398 }
00399 bool isResize() const
00400 {
00401 return moveResizeMode && mode != PositionCenter;
00402 }
00403
00404 Position mode;
00405 QPoint moveOffset;
00406 QPoint invertedMoveOffset;
00407 QRect moveResizeGeom;
00408 QRect initialMoveResizeGeom;
00409 XSizeHints xSizeHint;
00410 void sendSyntheticConfigureNotify();
00411 int mapping_state;
00412 void readTransient();
00413 Window verifyTransientFor( Window transient_for, bool set );
00414 void addTransient( Client* cl );
00415 void removeTransient( Client* cl );
00416 void removeFromMainClients();
00417 void cleanGrouping();
00418 void checkGroupTransients();
00419 void setTransient( Window new_transient_for_id );
00420 Client* transient_for;
00421 Window transient_for_id;
00422 Window original_transient_for_id;
00423 ClientList transients_list;
00424 ShadeMode shade_mode;
00425 uint active :1;
00426 uint keep_above : 1;
00427 uint is_shape :1;
00428 uint skip_taskbar :1;
00429 uint original_skip_taskbar :1;
00430 uint Pdeletewindow :1;
00431 uint Ptakefocus :1;
00432 uint Pcontexthelp : 1;
00433 uint Pping : 1;
00434 uint input :1;
00435 uint store_settings : 1;
00436 uint skip_pager : 1;
00437 uint motif_may_resize : 1;
00438 uint motif_may_move :1;
00439 uint motif_may_close : 1;
00440 uint keep_below : 1;
00441 uint minimized : 1;
00442 uint hidden : 1;
00443 uint modal : 1;
00444 uint noborder : 1;
00445 uint user_noborder : 1;
00446 uint not_obscured : 1;
00447 uint urgency : 1;
00448 uint ignore_focus_stealing : 1;
00449 uint check_active_modal : 1;
00450 void getWMHints();
00451 void readIcons();
00452 void getWindowProtocols();
00453 QPixmap icon_pix;
00454 QPixmap miniicon_pix;
00455 QCursor cursor;
00456
00457
00458 enum FullScreenMode { FullScreenNone, FullScreenNormal, FullScreenHack };
00459 FullScreenMode fullscreen_mode;
00460 MaximizeMode max_mode;
00461 QRect geom_restore;
00462 QRect geom_fs_restore;
00463 int workarea_diff_x, workarea_diff_y;
00464 WinInfo* info;
00465 QTimer* autoRaiseTimer;
00466 QTimer* shadeHoverTimer;
00467 Colormap cmap;
00468 QCString resource_name;
00469 QCString resource_class;
00470 QString cap_normal, cap_iconic, cap_suffix;
00471 WId wmClientLeaderWin;
00472 QCString window_role;
00473 Group* in_group;
00474 Window window_group;
00475 Layer in_layer;
00476 QTimer* ping_timer;
00477 KProcess* process_killer;
00478 Time ping_timestamp;
00479 Time user_time;
00480 unsigned long allowed_actions;
00481 QRect frame_geometry;
00482 QSize client_size;
00483 int block_geometry;
00484 bool shade_geometry_change;
00485 int border_left, border_right, border_top, border_bottom;
00486 QRegion _mask;
00487 friend struct FetchNameInternalPredicate;
00488 friend struct CheckIgnoreFocusStealingProcedure;
00489 void show() { assert( false ); }
00490 void hide() { assert( false ); }
00491 };
00492
00493
00494 class WinInfo : public NETWinInfo
00495 {
00496 private:
00497 typedef KWinInternal::Client Client;
00498 public:
00499 WinInfo( Client* c, Display * display, Window window,
00500 Window rwin, const unsigned long pr[], int pr_size );
00501 virtual void changeDesktop(int desktop);
00502 virtual void changeState( unsigned long state, unsigned long mask );
00503 private:
00504 Client * m_client;
00505 };
00506
00507 inline Window Client::window() const
00508 {
00509 return client;
00510 }
00511
00512 inline Window Client::frameId() const
00513 {
00514 return frame;
00515 }
00516
00517 inline Window Client::wrapperId() const
00518 {
00519 return wrapper;
00520 }
00521
00522 inline Window Client::decorationId() const
00523 {
00524 return decoration != NULL ? decoration->widget()->winId() : None;
00525 }
00526
00527 inline Workspace* Client::workspace() const
00528 {
00529 return wspace;
00530 }
00531
00532 inline const Client* Client::transientFor() const
00533 {
00534 return transient_for;
00535 }
00536
00537 inline Client* Client::transientFor()
00538 {
00539 return transient_for;
00540 }
00541
00542 inline bool Client::groupTransient() const
00543 {
00544 return transient_for_id == workspace()->rootWin();
00545 }
00546
00547
00548
00549 inline bool Client::wasOriginallyGroupTransient() const
00550 {
00551 return original_transient_for_id == workspace()->rootWin();
00552 }
00553
00554 inline bool Client::isTransient() const
00555 {
00556 return transient_for_id != None;
00557 }
00558
00559 inline const ClientList& Client::transients() const
00560 {
00561 return transients_list;
00562 }
00563
00564 inline const Group* Client::group() const
00565 {
00566 return in_group;
00567 }
00568
00569 inline Group* Client::group()
00570 {
00571 return in_group;
00572 }
00573
00574 inline int Client::mappingState() const
00575 {
00576 return mapping_state;
00577 }
00578
00579 inline QCString Client::resourceName() const
00580 {
00581 return resource_name;
00582 }
00583
00584 inline QCString Client::resourceClass() const
00585 {
00586 return resource_class;
00587 }
00588
00589 inline
00590 bool Client::isMinimized() const
00591 {
00592 return minimized;
00593 }
00594
00595 inline bool Client::isActive() const
00596 {
00597 return active;
00598 }
00599
00606 inline int Client::desktop() const
00607 {
00608 return desk;
00609 }
00610
00611 inline bool Client::isOnAllDesktops() const
00612 {
00613 return desk == NET::OnAllDesktops;
00614 }
00619 inline bool Client::isOnDesktop( int d ) const
00620 {
00621 return desk == d || isOnAllDesktops();
00622 }
00623
00624 inline
00625 bool Client::isShown( bool shaded_is_shown ) const
00626 {
00627 return !isMinimized() && ( !isShade() || shaded_is_shown ) && !hidden;
00628 }
00629
00630 inline
00631 bool Client::isShade() const
00632 {
00633 return shade_mode == ShadeNormal;
00634 }
00635
00636 inline
00637 Client::ShadeMode Client::shadeMode() const
00638 {
00639 return shade_mode;
00640 }
00641
00642 inline QPixmap Client::icon() const
00643 {
00644 return icon_pix;
00645 }
00646
00647 inline QPixmap Client::miniIcon() const
00648 {
00649 return miniicon_pix;
00650 }
00651
00652 inline QRect Client::geometryRestore() const
00653 {
00654 return geom_restore;
00655 }
00656
00657 inline Client::MaximizeMode Client::maximizeMode() const
00658 {
00659 return max_mode;
00660 }
00661
00662 inline bool Client::skipTaskbar( bool from_outside ) const
00663 {
00664 return from_outside ? original_skip_taskbar : skip_taskbar;
00665 }
00666
00667 inline bool Client::skipPager() const
00668 {
00669 return skip_pager;
00670 }
00671
00672 inline bool Client::keepAbove() const
00673 {
00674 return keep_above;
00675 }
00676
00677 inline bool Client::keepBelow() const
00678 {
00679 return keep_below;
00680 }
00681
00682 inline bool Client::storeSettings() const
00683 {
00684 return store_settings;
00685 }
00686
00687 inline void Client::setStoreSettings( bool b )
00688 {
00689 store_settings = b;
00690 }
00691
00692
00693 inline bool Client::shape() const
00694 {
00695 return is_shape;
00696 }
00697
00698
00699 inline bool Client::isFullScreen() const
00700 {
00701 return fullscreen_mode != FullScreenNone;
00702 }
00703
00704 inline bool Client::isModal() const
00705 {
00706 return modal;
00707 }
00708
00709 inline bool Client::hasNETSupport() const
00710 {
00711 return info->hasNETSupport();
00712 }
00713
00714 inline Colormap Client::colormap() const
00715 {
00716 return cmap;
00717 }
00718
00719 inline pid_t Client::pid() const
00720 {
00721 return info->pid();
00722 }
00723
00724 inline void Client::invalidateLayer()
00725 {
00726 in_layer = UnknownLayer;
00727 }
00728
00729 inline bool Client::isIconicState() const
00730 {
00731 return mapping_state == IconicState;
00732 }
00733
00734 inline bool Client::isNormalState() const
00735 {
00736 return mapping_state == NormalState;
00737 }
00738
00739 inline bool Client::isManaged() const
00740 {
00741 return mapping_state != WithdrawnState;
00742 }
00743
00744 inline QCString Client::windowRole() const
00745 {
00746 return window_role;
00747 }
00748
00749 inline QRect Client::geometry() const
00750 {
00751 return frame_geometry;
00752 }
00753
00754 inline QSize Client::size() const
00755 {
00756 return frame_geometry.size();
00757 }
00758
00759 inline QSize Client::minSize() const
00760 {
00761 return QSize( xSizeHint.min_width, xSizeHint.min_height );
00762 }
00763
00764 inline QPoint Client::pos() const
00765 {
00766 return frame_geometry.topLeft();
00767 }
00768
00769 inline int Client::x() const
00770 {
00771 return frame_geometry.x();
00772 }
00773
00774 inline int Client::y() const
00775 {
00776 return frame_geometry.y();
00777 }
00778
00779 inline int Client::width() const
00780 {
00781 return frame_geometry.width();
00782 }
00783
00784 inline int Client::height() const
00785 {
00786 return frame_geometry.height();
00787 }
00788
00789 inline QRect Client::rect() const
00790 {
00791 return QRect( 0, 0, width(), height());
00792 }
00793
00794 inline QPoint Client::clientPos() const
00795 {
00796 return QPoint( border_left, border_top );
00797 }
00798
00799 inline QSize Client::clientSize() const
00800 {
00801 return client_size;
00802 }
00803
00804 inline void Client::setGeometry( const QRect& r, ForceGeometry_t force )
00805 {
00806 setGeometry( r.x(), r.y(), r.width(), r.height(), force );
00807 }
00808
00809 inline void Client::move( const QPoint & p, ForceGeometry_t force )
00810 {
00811 move( p.x(), p.y(), force );
00812 }
00813
00814 inline void Client::plainResize( const QSize& s, ForceGeometry_t force )
00815 {
00816 plainResize( s.width(), s.height(), force );
00817 }
00818
00819 inline void Client::resizeWithChecks( const QSize& s, ForceGeometry_t force )
00820 {
00821 resizeWithChecks( s.width(), s.height(), force );
00822 }
00823
00824 inline bool Client::hasUserTimeSupport() const
00825 {
00826 return info->userTime() != -1U;
00827 }
00828
00829 inline bool Client::ignoreFocusStealing() const
00830 {
00831 return ignore_focus_stealing;
00832 }
00833
00834 KWIN_PROCEDURE( CheckIgnoreFocusStealingProcedure, cl->ignore_focus_stealing = options->checkIgnoreFocusStealing( cl ));
00835
00836 inline Window Client::moveResizeGrabWindow() const
00837 {
00838 return move_resize_grab_window;
00839 }
00840
00841 #ifdef NDEBUG
00842 kndbgstream& operator<<( kndbgstream& stream, const Client* );
00843 kndbgstream& operator<<( kndbgstream& stream, const ClientList& );
00844 kndbgstream& operator<<( kndbgstream& stream, const ConstClientList& );
00845 #else
00846 kdbgstream& operator<<( kdbgstream& stream, const Client* );
00847 kdbgstream& operator<<( kdbgstream& stream, const ClientList& );
00848 kdbgstream& operator<<( kdbgstream& stream, const ConstClientList& );
00849 #endif
00850
00851 KWIN_COMPARE_PREDICATE( WindowMatchPredicate, Window, cl->window() == value );
00852 KWIN_COMPARE_PREDICATE( FrameIdMatchPredicate, Window, cl->frameId() == value );
00853 KWIN_COMPARE_PREDICATE( WrapperIdMatchPredicate, Window, cl->wrapperId() == value );
00854
00855 }
00856
00857 #endif