/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOW_H #define _COMPWINDOW_H #include #include #include #include #include #include #include #include #include #include #include #include #include class CompWindow; class CompIcon; class PrivateWindow; struct CompStartupSequence; #define ROOTPARENT(x) (((x)->frame ()) ? (x)->frame () : (x)->id ()) #define CompWindowProtocolDeleteMask (1 << 0) #define CompWindowProtocolTakeFocusMask (1 << 1) #define CompWindowProtocolPingMask (1 << 2) #define CompWindowProtocolSyncRequestMask (1 << 3) #define CompWindowTypeDesktopMask (1 << 0) #define CompWindowTypeDockMask (1 << 1) #define CompWindowTypeToolbarMask (1 << 2) #define CompWindowTypeMenuMask (1 << 3) #define CompWindowTypeUtilMask (1 << 4) #define CompWindowTypeSplashMask (1 << 5) #define CompWindowTypeDialogMask (1 << 6) #define CompWindowTypeNormalMask (1 << 7) #define CompWindowTypeDropdownMenuMask (1 << 8) #define CompWindowTypePopupMenuMask (1 << 9) #define CompWindowTypeTooltipMask (1 << 10) #define CompWindowTypeNotificationMask (1 << 11) #define CompWindowTypeComboMask (1 << 12) #define CompWindowTypeDndMask (1 << 13) #define CompWindowTypeModalDialogMask (1 << 14) #define CompWindowTypeFullscreenMask (1 << 15) #define CompWindowTypeUnknownMask (1 << 16) #define NO_FOCUS_MASK (CompWindowTypeDesktopMask | \ CompWindowTypeDockMask | \ CompWindowTypeSplashMask) #define CompWindowStateModalMask (1 << 0) #define CompWindowStateStickyMask (1 << 1) #define CompWindowStateMaximizedVertMask (1 << 2) #define CompWindowStateMaximizedHorzMask (1 << 3) #define CompWindowStateShadedMask (1 << 4) #define CompWindowStateSkipTaskbarMask (1 << 5) #define CompWindowStateSkipPagerMask (1 << 6) #define CompWindowStateHiddenMask (1 << 7) #define CompWindowStateFullscreenMask (1 << 8) #define CompWindowStateAboveMask (1 << 9) #define CompWindowStateBelowMask (1 << 10) #define CompWindowStateDemandsAttentionMask (1 << 11) #define CompWindowStateDisplayModalMask (1 << 12) #define MAXIMIZE_STATE (CompWindowStateMaximizedHorzMask | \ CompWindowStateMaximizedVertMask) #define CompWindowActionMoveMask (1 << 0) #define CompWindowActionResizeMask (1 << 1) #define CompWindowActionStickMask (1 << 2) #define CompWindowActionMinimizeMask (1 << 3) #define CompWindowActionMaximizeHorzMask (1 << 4) #define CompWindowActionMaximizeVertMask (1 << 5) #define CompWindowActionFullscreenMask (1 << 6) #define CompWindowActionCloseMask (1 << 7) #define CompWindowActionShadeMask (1 << 8) #define CompWindowActionChangeDesktopMask (1 << 9) #define CompWindowActionAboveMask (1 << 10) #define CompWindowActionBelowMask (1 << 11) #define MwmFuncAll (1L << 0) #define MwmFuncResize (1L << 1) #define MwmFuncMove (1L << 2) #define MwmFuncIconify (1L << 3) #define MwmFuncMaximize (1L << 4) #define MwmFuncClose (1L << 5) #define MwmDecorHandle (1L << 2) #define MwmDecorTitle (1L << 3) #define MwmDecorMenu (1L << 4) #define MwmDecorMinimize (1L << 5) #define MwmDecorMaximize (1L << 6) #define MwmDecorAll (1L << 0) #define MwmDecorBorder (1L << 1) #define MwmDecorHandle (1L << 2) #define MwmDecorTitle (1L << 3) #define MwmDecorMenu (1L << 4) #define MwmDecorMinimize (1L << 5) #define MwmDecorMaximize (1L << 6) #define WmMoveResizeSizeTopLeft 0 #define WmMoveResizeSizeTop 1 #define WmMoveResizeSizeTopRight 2 #define WmMoveResizeSizeRight 3 #define WmMoveResizeSizeBottomRight 4 #define WmMoveResizeSizeBottom 5 #define WmMoveResizeSizeBottomLeft 6 #define WmMoveResizeSizeLeft 7 #define WmMoveResizeMove 8 #define WmMoveResizeSizeKeyboard 9 #define WmMoveResizeMoveKeyboard 10 #define WmMoveResizeCancel 11 /* EWMH source indication client types */ #define ClientTypeUnknown 0 #define ClientTypeApplication 1 #define ClientTypePager 2 #define CompWindowGrabKeyMask (1 << 0) #define CompWindowGrabButtonMask (1 << 1) #define CompWindowGrabMoveMask (1 << 2) #define CompWindowGrabResizeMask (1 << 3) enum CompStackingUpdateMode { CompStackingUpdateModeNone = 0, CompStackingUpdateModeNormal, CompStackingUpdateModeAboveFullscreen, CompStackingUpdateModeInitialMap, CompStackingUpdateModeInitialMapDeniedFocus }; enum CompWindowNotify { CompWindowNotifyMap, CompWindowNotifyUnmap, CompWindowNotifyRestack, CompWindowNotifyHide, CompWindowNotifyShow, CompWindowNotifyAliveChanged, CompWindowNotifySyncAlarm, CompWindowNotifyReparent, CompWindowNotifyUnreparent, CompWindowNotifyFrameUpdate }; struct CompWindowExtents { int left; int right; int top; int bottom; }; struct CompStruts { XRectangle left; XRectangle right; XRectangle top; XRectangle bottom; }; class WindowInterface : public WrapableInterface { public: virtual void getOutputExtents (CompWindowExtents& output); virtual void getAllowedActions (unsigned int &setActions, unsigned int &clearActions); virtual bool focus (); virtual void activate (); virtual bool place (CompPoint &pos); virtual void validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source); virtual void resizeNotify (int dx, int dy, int dwidth, int dheight); virtual void moveNotify (int dx, int dy, bool immediate); virtual void windowNotify (CompWindowNotify n); virtual void grabNotify (int x, int y, unsigned int state, unsigned int mask); virtual void ungrabNotify (); virtual void stateChangeNotify (unsigned int lastState); virtual void updateFrameRegion (CompRegion ®ion); }; class CompWindow : public WrapableHandler, public PluginClassStorage { public: class Geometry : public CompRect { public: Geometry (); Geometry (int, int, unsigned int, unsigned int, unsigned int); unsigned int border () const; void set (int, int, unsigned int, unsigned int, unsigned int); void setBorder (unsigned int); private: unsigned int mBorder; }; typedef boost::function ForEach; typedef std::map Map; public: CompWindow *next; CompWindow *prev; public: CompWindow (Window id, Window aboveId); ~CompWindow (); Geometry & geometry () const; int x () const; int y () const; CompPoint pos () const; /* With border */ unsigned int width () const; unsigned int height () const; CompSize size () const; Geometry & serverGeometry () const; int serverX () const; int serverY () const; CompPoint serverPos () const; /* With border */ unsigned int serverWidth () const; unsigned int serverHeight () const; const CompSize serverSize () const; Window id (); Window frame (); const CompRegion & region () const; const CompRegion & frameRegion () const; void updateFrameRegion (); void setWindowFrameExtents (CompWindowExtents *input); unsigned int & wmType (); unsigned int type (); unsigned int & state (); unsigned int actions (); unsigned int & protocols (); void close (Time serverTime); bool inShowDesktopMode (); void setShowDesktopMode (bool); bool managed (); bool grabbed (); unsigned int activeNum (); int mapNum () const; CompStruts * struts (); int & saveMask (); XWindowChanges & saveWc (); void moveToViewportPosition (int x, int y, bool sync); char * startupId (); unsigned int desktop (); Window clientLeader (); void changeState (unsigned int newState); void recalcActions (); void recalcType (); void updateWindowOutputExtents (); void destroy (); void sendConfigureNotify (); void sendSyncRequest (); XSyncAlarm syncAlarm (); void map (); void unmap (); bool resize (XWindowAttributes); bool resize (Geometry); bool resize (int x, int y, unsigned int width, unsigned int height, unsigned int border = 0); void move (int dx, int dy, bool immediate = true); void syncPosition (); void moveInputFocusTo (); void moveInputFocusToOtherWindow (); void configureXWindow (unsigned int valueMask, XWindowChanges *xwc); void moveResize (XWindowChanges *xwc, unsigned int xwcm, int gravity, unsigned int source); void raise (); void lower (); void restackAbove (CompWindow *sibling); void restackBelow (CompWindow *sibling); void updateAttributes (CompStackingUpdateMode stackingMode); void hide (); void show (); void minimize (); void unminimize (); void maximize (unsigned int state = 0); CompPoint defaultViewport (); CompPoint & initialViewport () const; CompIcon * getIcon (int width, int height); const CompRect & iconGeometry () const; int outputDevice (); void setDesktop (unsigned int desktop); bool onCurrentDesktop (); bool onAllViewports (); CompPoint getMovementForOffset (CompPoint offset); Window transientFor (); int pendingUnmaps (); bool minimized (); bool placed (); bool shaded (); CompWindowExtents & input () const; CompWindowExtents & output () const; XSizeHints & sizeHints () const; bool destroyed (); bool invisible (); bool syncWait (); bool alpha (); bool alive (); bool overrideRedirect (); bool isMapped () const; bool isViewable () const; bool isFocussable () const; int windowClass (); unsigned int depth (); unsigned int mwmDecor (); unsigned int mwmFunc (); bool constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight); static unsigned int constrainWindowState (unsigned int state, unsigned int actions); static int allocPluginClassIndex (); static void freePluginClassIndex (int index); WRAPABLE_HND (0, WindowInterface, void, getOutputExtents, CompWindowExtents&); WRAPABLE_HND (1, WindowInterface, void, getAllowedActions, unsigned int &, unsigned int &); WRAPABLE_HND (2, WindowInterface, bool, focus); WRAPABLE_HND (3, WindowInterface, void, activate); WRAPABLE_HND (4, WindowInterface, bool, place, CompPoint &); WRAPABLE_HND (5, WindowInterface, void, validateResizeRequest, unsigned int &, XWindowChanges *, unsigned int); WRAPABLE_HND (6, WindowInterface, void, resizeNotify, int, int, int, int); WRAPABLE_HND (7, WindowInterface, void, moveNotify, int, int, bool); WRAPABLE_HND (8, WindowInterface, void, windowNotify, CompWindowNotify); WRAPABLE_HND (9, WindowInterface, void, grabNotify, int, int, unsigned int, unsigned int); WRAPABLE_HND (10, WindowInterface, void, ungrabNotify); WRAPABLE_HND (11, WindowInterface, void, stateChangeNotify, unsigned int); WRAPABLE_HND (12, WindowInterface, void, updateFrameRegion, CompRegion &); friend class PrivateWindow; friend class CompScreen; friend class PrivateScreen; private: PrivateWindow *priv; }; #endif