X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.hh;h=382ab1df01794e33adaf1d7dc59dca931858a7fa;hb=b8de0b48fd32efed1fe242eaee9352cc16b2ee50;hp=6e11ed8c27ead0e191ca9b0c8573e8dd797b17fa;hpb=17b0266979137ad957a701c7093a14841a8c2091;p=chaz%2Fopenbox diff --git a/src/client.hh b/src/client.hh index 6e11ed8c..382ab1df 100644 --- a/src/client.hh +++ b/src/client.hh @@ -29,6 +29,11 @@ namespace ob { class Frame; class Screen; +struct Icon { + unsigned long w, h; + unsigned long *data; +}; + //! The MWM Hints as retrieved from the window property /*! This structure only contains 3 elements, even though the Motif 2.0 @@ -136,22 +141,17 @@ public: enum Decoration { Decor_Titlebar = 1 << 0, //!< Display a titlebar Decor_Handle = 1 << 1, //!< Display a handle (bottom) Decor_Border = 1 << 2, //!< Display a border - Decor_Iconify = 1 << 3, //!< Display an iconify button - Decor_Maximize = 1 << 4, //!< Display a maximize button + Decor_Icon = 1 << 3, //!< Display the window's icon + Decor_Iconify = 1 << 4, //!< Display an iconify button + Decor_Maximize = 1 << 5, //!< Display a maximize button //! Display a button to toggle the window's placement on //! all desktops - Decor_AllDesktops = 1 << 5, - Decor_Close = 1 << 6 //!< Display a close button + Decor_AllDesktops = 1 << 6, + Decor_Close = 1 << 7 //!< Display a close button }; //! Holds a bitmask of Client::Decoration values typedef unsigned char DecorationFlags; - //! Possible actions that can be made with the _NET_WM_STATE client message - enum StateAction { State_Remove = 0, //!< _NET_WM_STATE_REMOVE - State_Add, //!< _NET_WM_STATE_ADD - State_Toggle //!< _NET_WM_STATE_TOGGLE - }; - //! The event mask to grab on client windows static const long event_mask = PropertyChangeMask | FocusChangeMask | StructureNotifyMask; @@ -164,10 +164,6 @@ public: static const long no_propagate_mask = ButtonPressMask | ButtonReleaseMask | ButtonMotionMask; - //! The desktop value which indicated the window is iconified and not on any - //! desktop - static const long ICONIC_DESKTOP = 0xfffffffe; - //! The number of unmap events to ignore on the window int ignore_unmaps; @@ -188,7 +184,7 @@ private: Client::List _transients; //! The desktop on which the window resides (0xffffffff for all desktops) - long _desktop; + unsigned int _desktop; //! Normal window title otk::ustring _title; @@ -295,9 +291,6 @@ private: //! The window uses shape extension to be non-rectangular? bool _shaped; - //! If the window has a modal child window, then this will point to it - Client *_modal_child; - //! The window is modal, so it must be processed before any windows it is //! related to can be focused bool _modal; @@ -320,6 +313,8 @@ private: //! The window should be underneath other windows of the same type bool _below; + //! The layer in which the window will be stacked, windows in lower layers + //! are always below windows in higher layers. StackLayer _layer; //! A bitmask of values in the Client::Decoration enum @@ -342,6 +337,14 @@ private: */ FunctionFlags _functions; + //! Icons for the client as specified on the client window + Icon *_icons; + //! The number of icons in _icons + int _nicons; + + Pixmap _pixmap_icon; + Pixmap _pixmap_icon_mask; + //! Retrieves the window's initial gravity void getGravity(); //! Retrieves the desktop hint's value and sets Client::_desktop @@ -376,19 +379,10 @@ private: Client::applyStartupState is used to do the same things during the mapping process. */ - void setState(StateAction action, long data1, long data2); + void setState(Atom action, long data1, long data2); //! Sends the window to the specified desktop - /*! - A window is iconified by sending it to the ICONIC_DESKTOP, and restored - by sending it to any other valid desktop. - */ - void setDesktop(long desktop); - //! Set whether the window is modal or not - /*! - This adjusts references in parents etc to match. - */ - void setModal(bool modal); + void setDesktop(unsigned int desktop); //! Calculates the stacking layer for the client window void calcLayer(); @@ -415,6 +409,10 @@ private: void updateStrut(); //! Updates the window's transient status, and any parents of it void updateTransientFor(); + //! Updates the window's icons + void updateIcons(); + //! Updates the window's kwm icon + void updateKwmIcon(); //! Change the client's state hints to match the class' data void changeState(); @@ -431,6 +429,14 @@ private: */ void shade(bool shade); + //! Recursively searches the client 'tree' for a modal client, always skips + //! the topmost node (the window you're starting with). + Client *Client::searchModalTree(Client *node, Client *skip); + + //! Recursively searches the client 'tree' for a focused client, always skips + //! the topmost node (the window you're starting with). + Client *Client::searchFocusTree(Client *node, Client *skip); + //! Fires the urgent callbacks which lets the user do what they want with //! urgent windows void fireUrgent(); @@ -446,6 +452,16 @@ private: */ void fullscreen(bool fs, bool savearea = true); + //! Iconifies or uniconifies the client window + /*! + @param iconic true if the window should be iconified; false if it should be + restored. + @param curdesk If iconic is false, then this determines if the window will + be uniconified to the current viewable desktop (true) or to + its previous desktop (false) + */ + void iconify(bool iconic, bool curdesk = true); + //! Maximize or unmaximize the client window /*! @param max true if the window should be maximized; false if it should be @@ -462,8 +478,11 @@ private: /*! @param x The X coordinate to move to. @param y The Y coordinate to move to. + @param final true if this is the final move, false if there are more move + events coming. The client is not notified of the move when + final is false. */ - void internal_move(int x, int y); + void internal_move(int x, int y, bool final = true); //! Internal version of the Client::resize function /*! This also maintains things like the client's minsize, and size increments. @@ -479,12 +498,9 @@ private: The x and y coordinates must both be sepcified together, or they will have no effect. When they are specified, the anchor is ignored. */ - void internal_resize(Corner anchor, unsigned int w, unsigned int h, + void internal_resize(Corner anchor, int w, int h, bool user = true, int x = INT_MIN, int y = INT_MIN); - //! Attempts to find and return a modal child of this window, recursively. - Client *findModalChild(Client *skip = 0) const; - //! Removes or reapplies the client's border to its window /*! Used when managing and unmanaging a window. @@ -501,16 +517,14 @@ private: void applyStartupState(); public: -#ifndef SWIG //! Constructs a new Client object around a specified window id /*! -BB @param window The window id that the Client class should handle + @param window The window id that the Client class should handle @param screen The screen on which the window resides */ Client(int screen, Window window); //! Destroys the Client object virtual ~Client(); -#endif //! Returns the screen on which the clien resides inline int screen() const { return _screen; } @@ -535,7 +549,7 @@ BB @param window The window id that the Client class should handle This value is a 0-based index.
A value of 0xffffffff indicates that the window exists on all desktops. */ - inline long desktop() const { return _desktop; } + inline unsigned int desktop() const { return _desktop; } //! Returns the window's title inline const otk::ustring &title() const { return _title; } //! Returns the window's title when it is iconified @@ -582,14 +596,11 @@ BB @param window The window id that the Client class should handle inline DecorationFlags disabledDecorations() const { return _disabled_decorations; } //! Returns the functions that the user can perform on the window - inline FunctionFlags funtions() const { return _functions; } + inline FunctionFlags functions() const { return _functions; } //! Return the client this window is transient for inline Client *transientFor() const { return _transient_for; } - //! Returns the window which is a modal child of this window - inline Client *modalChild() const { return _modal_child; } - //! Returns if the window is modal /*! If the window is modal, then no other windows that it is related to can get @@ -600,7 +611,7 @@ BB @param window The window id that the Client class should handle inline bool skipPager() const { return _skip_pager; } //! The window should not be displayed by taskbars inline bool skipTaskbar() const { return _skip_taskbar; } - //! Returns if the window is shaded + //! Returns if the window is shaded /*! When the window is shaded, only its titlebar is visible. */ @@ -630,19 +641,47 @@ BB @param window The window id that the Client class should handle const otk::Size &logicalSize() const { return _logical_size; } //! Returns the position and size of the client relative to the root window + /*! + Note that this value is *not* the size and position of the window's + frame, though the position will often line up.
+ If you want the frame's area, use Frame::area() instead. + */ inline const otk::Rect &area() const { return _area; } //! Returns the client's strut definition inline const otk::Strut &strut() const { return _strut; } + //! Returns an icon for the window + /*! + The icon chosen will be the smallest icon available that is still bigger or + equal to the specified Size.
+ If none that meet the requirements is found, the largest icon that is + smaller than the specified size will be returned. + */ + const Icon *icon(const otk::Size &s) const; + + //! Returns the pixmap for the pixmap icon specified on the window (or None) + /*! + The icon given by Client::icon should take precedence over this icon/mask. + */ + Pixmap pixmapIcon() const { return _pixmap_icon; } + //! Returns the mask for the pixmap icon specified on the window (or None) + /*! + The icon given by Client::icon should take precedence over this icon/mask. + */ + Pixmap pixmapIconMask() const { return _pixmap_icon_mask; } + //! Move the window (actually, its frame) to a position. /*! This moves the window so that the top-left corner of its frame will be at the position specified. @param x The X coordinate to move to. @param y The Y coordinate to move to. + @param final true if this is the final move, false if there are more move + events coming. The client is not notified of the move when + final is false. */ - void move(int x, int y); + void move(int x, int y, bool final = true); //! Resizes the client window, anchoring it in a given corner /*! @@ -651,7 +690,7 @@ BB @param window The window id that the Client class should handle @param w The width component of the new size for the client. @param h The height component of the new size for the client. */ - void resize(Corner anchor, unsigned int w, unsigned int h); + void resize(Corner anchor, int w, int h); //! Reapplies the maximized state to the window /*! @@ -659,6 +698,12 @@ BB @param window The window id that the Client class should handle surroundings (struts, etc). */ void remaximize(); + + //! Shows the window if it should be shown, or hides it + /*! + Used when changing desktops, the window's state, etc. + */ + void showhide(); //! Choose a mask of decorations to not display on the client /*! @@ -670,6 +715,12 @@ BB @param window The window id that the Client class should handle */ void disableDecorations(DecorationFlags flags); + //! Return a modal child of the client window + /*! + @return A modal child of the client window, or 0 if none was found. + */ + Client *findModalChild(); + //! Attempt to focus the client window bool focus();