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