X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.hh;h=ff119faf746b12961bbfb296b1de8fdc1576f3f3;hb=b18959e1bda52f807f62c95772c69ce3005215a7;hp=2a55d992f7fb9b0d9e9a36a8fff2cb11bf157c98;hpb=44d653e3e8d042bf3f1d68108a8197a895888da8;p=chaz%2Fopenbox diff --git a/src/client.hh b/src/client.hh index 2a55d992..ff119faf 100644 --- a/src/client.hh +++ b/src/client.hh @@ -7,8 +7,7 @@ property changes on the window and some client messages */ -#include "widgetbase.hh" -#include "otk/point.hh" +#include "screen.hh" #include "otk/strut.hh" #include "otk/rect.hh" #include "otk/eventhandler.hh" @@ -28,6 +27,7 @@ extern "C" { namespace ob { class Frame; +class Screen; //! The MWM Hints as retrieved from the window property /*! @@ -54,7 +54,7 @@ struct MwmHints { class' member variables and call whatever is nessary to complete the change (such as causing a redraw of the titlebar after the title is changed). */ -class Client : public otk::EventHandler, public WidgetBase { +class Client : public otk::EventHandler { public: //! The frame window which decorates around the client window @@ -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; @@ -227,7 +223,7 @@ private: For example, with xterms, this value it the number of characters being displayed in the terminal, instead of the number of pixels. */ - otk::Point _logical_size; + otk::Size _logical_size; //! Width of the border on the window. /*! @@ -251,20 +247,20 @@ private: /*! If the min is > the max, then the window is not resizable */ - otk::Point _min_size; + otk::Size _min_size; //! The maximum size of the client window /*! If the min is > the max, then the window is not resizable */ - otk::Point _max_size; + otk::Size _max_size; //! The size of increments to resize the client window by - otk::Point _size_inc; + otk::Size _size_inc; //! The base size of the client window /*! This value should be subtracted from the window's actual size when displaying its size to the user, or working with its min/max size */ - otk::Point _base_size; + otk::Size _base_size; //! Window decoration and functionality hints MwmHints _mwmhints; @@ -376,11 +372,7 @@ private: void setState(StateAction 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); + void setDesktop(unsigned int desktop); //! Calculates the stacking layer for the client window void calcLayer(); @@ -423,6 +415,10 @@ 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); + //! Fires the urgent callbacks which lets the user do what they want with //! urgent windows void fireUrgent(); @@ -431,8 +427,34 @@ private: /*! @param fs true if the window should be made fullscreen; false if it should be returned to normal state. + @param savearea true to have the client's current size and position saved; + otherwise, they are not. You should not save when mapping a + new window that is set to fullscreen. This has no effect + when restoring a window from fullscreen. + */ + 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 fullscreen(bool fs); + 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 + returned to normal size. + @param dir 0 to set both horz and vert, 1 to set horz, 2 to set vert. + @param savearea true to have the client's current size and position saved; + otherwise, they are not. You should not save when mapping a + new window that is set to fullscreen. This has no effect + when unmaximizing a window. + */ + void maximize(bool max, int dir, bool savearea = true); //! Internal version of the Client::move function /*! @@ -455,9 +477,24 @@ 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, int w, int h, bool user = true, - int x = INT_MIN, int y = INT_MIN); + void internal_resize(Corner anchor, int w, int h, + bool user = true, int x = INT_MIN, int y = INT_MIN); + + //! Removes or reapplies the client's border to its window + /*! + Used when managing and unmanaging a window. + @param addborder true if adding the border to the client; false if removing + from the client + */ + void toggleClientBorder(bool addborder); + //! Applies the states requested when the window mapped + /*! + This should be called only once, during the window mapping process. It + applies things like maximized, and fullscreen. + */ + void applyStartupState(); + public: #ifndef SWIG //! Constructs a new Client object around a specified window id @@ -493,7 +530,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 @@ -513,6 +550,8 @@ BB @param window The window id that the Client class should handle inline bool urgent() const { return _urgent; } //! Returns if the window wants to be notified when it receives focus inline bool focusNotify() const { return _focus_notify; } + //! Returns if the window is the focused window + inline bool focused() const { return _focused; } //! Returns if the window uses the Shape extension inline bool shaped() const { return _shaped; } //! Returns the window's gravity @@ -549,7 +588,11 @@ BB @param window The window id that the Client class should handle focus while it exists/remains modal. */ inline bool modal() const { return _modal; } - //! Returns if the window is shaded + //! The window should not be displayed by pagers + 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 /*! When the window is shaded, only its titlebar is visible. */ @@ -569,20 +612,14 @@ BB @param window The window id that the Client class should handle //! Returns the window's stacking layer inline StackLayer layer() const { return _layer; } - //! Applies the states requested when the window mapped + //! Returns the logical size of the window /*! - This should be called only once, during the window mapping process. It - applies things like maximized, and fullscreen. - */ - void applyStartupState(); - - //! Removes or reapplies the client's border to its window - /*! - Used when managing and unmanaging a window. - @param addborder true if adding the border to the client; false if removing - from the client + The "logical" size of the window is refers to the user's perception of the + size of the window, and is the value that should be displayed to the user. + For example, with xterms, this value it the number of characters being + displayed in the terminal, instead of the number of pixels. */ - void toggleClientBorder(bool addborder); + const otk::Size &logicalSize() const { return _logical_size; } //! Returns the position and size of the client relative to the root window inline const otk::Rect &area() const { return _area; } @@ -590,8 +627,10 @@ BB @param window The window id that the Client class should handle //! Returns the client's strut definition inline const otk::Strut &strut() const { return _strut; } - //! Move the client window + //! 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. */ @@ -606,6 +645,19 @@ BB @param window The window id that the Client class should handle */ void resize(Corner anchor, int w, int h); + //! Reapplies the maximized state to the window + /*! + Use this to make the window readjust its maximized size to new + 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 /*! Pass a value of 0 to the function to turn all decorations back on. Note @@ -616,6 +668,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(); @@ -630,6 +688,8 @@ BB @param window The window id that the Client class should handle */ bool validate() const; + void installColormap(bool install) const; + virtual void focusHandler(const XFocusChangeEvent &e); virtual void unfocusHandler(const XFocusChangeEvent &e); virtual void propertyHandler(const XPropertyEvent &e); @@ -641,7 +701,10 @@ BB @param window The window id that the Client class should handle virtual void mapRequestHandler(const XMapRequestEvent &e); #if defined(SHAPE) virtual void shapeHandler(const XShapeEvent &e); -#endif // SHAPE +#endif // SHAPE + + friend void Screen::manageWindow(Window); + friend void Screen::unmanageWindow(Client *); }; }