X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.hh;h=a9fe942766666e91087849372cf95462a19d0ad3;hb=fc4885a3f4c2a023a6e64cce62fc5cde1667f2e9;hp=d2c8b5f81c828c2012d1903e507040f84b3972da;hpb=105e3524a3f6b526d54ecc761a6e6c91b04f3949;p=chaz%2Fopenbox diff --git a/src/client.hh b/src/client.hh index d2c8b5f8..a9fe9427 100644 --- a/src/client.hh +++ b/src/client.hh @@ -7,6 +7,7 @@ property changes on the window and some client messages */ +#include "screen.hh" #include "widgetbase.hh" #include "otk/point.hh" #include "otk/strut.hh" @@ -28,6 +29,7 @@ extern "C" { namespace ob { class Frame; +class Screen; //! The MWM Hints as retrieved from the window property /*! @@ -89,7 +91,7 @@ public: enum WindowType { Type_Desktop, //!< A desktop (bottom-most window) Type_Dock, //!< A dock bar/panel window Type_Toolbar, //!< A toolbar window, pulled off an app - Type_Menu, //!< A sticky menu from an app + Type_Menu, //!< An unpinned menu from an app Type_Utility, //!< A small utility window such as a palette Type_Splash, //!< A splash screen window Type_Dialog, //!< A dialog window @@ -121,23 +123,27 @@ public: }; //! The things the user can do to the client window - enum Function { Func_Resize = 1 << 0, //!< Allow resizing - Func_Move = 1 << 1, //!< Allow moving - Func_Iconify = 1 << 2, //!< Allow to be iconified - Func_Maximize = 1 << 3, //!< Allow to be maximized - Func_Close = 1 << 4 //!< Allow to be closed + enum Function { Func_Resize = 1 << 0, //!< Allow resizing + Func_Move = 1 << 1, //!< Allow moving + Func_Iconify = 1 << 2, //!< Allow to be iconified + Func_Maximize = 1 << 3, //!< Allow to be maximized + Func_Shade = 1 << 4, //!< Allow to be shaded + Func_Fullscreen = 1 << 5, //!< Allow to be made fullscreen + Func_Close = 1 << 6 //!< Allow to be closed }; //! Holds a bitmask of Client::Function values typedef unsigned char FunctionFlags; //! The decorations the client window wants to be displayed on it - 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_Sticky = 1 << 5, //!< Display a sticky button - Decor_Close = 1 << 6 //!< Display a close button + 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 + //! Display a button to toggle the window's placement on + //! all desktops + Decor_AllDesktops = 1 << 5, + Decor_Close = 1 << 6 //!< Display a close button }; //! Holds a bitmask of Client::Decoration values typedef unsigned char DecorationFlags; @@ -160,6 +166,10 @@ 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; @@ -228,6 +238,17 @@ private: */ int _border_width; + //! The minimum aspect ratio the client window can be sized to. + /*! + A value of 0 means this is ignored. + */ + float _min_ratio; + //! The maximum aspect ratio the client window can be sized to. + /*! + A value of 0 means this is ignored. + */ + float _max_ratio; + //! The minimum size of the client window /*! If the min is > the max, then the window is not resizable @@ -257,6 +278,9 @@ private: //! NormalState long _wmstate; + //! True if the client supports the delete_window protocol + bool _delete_window; + //! Was the window's position requested by the application? if not, we should //! place the window ourselves when it first appears bool _positioned; @@ -273,6 +297,9 @@ 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; @@ -304,6 +331,12 @@ private: */ DecorationFlags _decorations; + //! A bitmask of values in the Client::Decoration enum. + /*! + Specifies the decorations that should NOT be displayed on the client. + */ + DecorationFlags _disabled_decorations; + //! A bitmask of values in the Client::Function enum /*! The values in the variable specify the ways in which the user is allowed to @@ -339,10 +372,25 @@ private: //! Sets the wm_state to the specified value void setWMState(long state); //! Adjusts the window's net_state + /*! + This should not be called as part of the window mapping process! It is for + use when updating the state post-mapping.
+ Client::applyStartupState is used to do the same things during the mapping + process. + */ 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); + //! Set whether the window is modal or not + /*! + This adjusts references in parents etc to match. + */ + void setModal(bool modal); //! Calculates the stacking layer for the client window void calcLayer(); @@ -353,7 +401,12 @@ private: //! Updates the WMNormalHints and adjusts things if they change void updateNormalHints(); //! Updates the WMHints and adjusts things if they change - void updateWMHints(); + /*! + @param initstate Whether to read the initial_state property from the + WMHints. This should only be used during the mapping + process. + */ + void updateWMHints(bool initstate = false); //! Updates the window's title void updateTitle(); //! Updates the window's icon title @@ -380,6 +433,31 @@ private: */ void shade(bool shade); + //! Fires the urgent callbacks which lets the user do what they want with + //! urgent windows + void fireUrgent(); + + //! Fullscreen's or unfullscreen's the client window + /*! + @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. + */ + void fullscreen(bool fs, bool savearea); + + //! 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. + */ + void maximize(bool max, int dir, bool savearea); + //! Internal version of the Client::move function /*! @param x The X coordinate to move to. @@ -392,6 +470,8 @@ private: @param anchor The corner to keep in the same position when resizing. @param w The width component of the new size for the client. @param h The height component of the new size for the client. + @param user Specifies whether this is a user-requested change or a + program requested change. @param x An optional X coordinate to which the window will be moved after resizing. @param y An optional Y coordinate to which the window will be moved @@ -399,9 +479,27 @@ 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, + 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. + @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 @@ -457,6 +555,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 @@ -477,23 +577,36 @@ BB @param window The window id that the Client class should handle //! Returns the decorations that the client window wishes to be displayed on //! it inline DecorationFlags decorations() const { return _decorations; } + //! Returns the decorations that the user has requested to be disabled on the + //! client + inline DecorationFlags disabledDecorations() const + { return _disabled_decorations; } //! Returns the functions that the user can perform on the window inline FunctionFlags funtions() 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 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. */ inline bool shaded() const { return _shaded; } + //! Returns if the window is in fullscreen mode + inline bool fullscreen() const { return _fullscreen; } //! Returns if the window is iconified /*! When the window is iconified, it is not visible at all (except in iconbars/ @@ -507,13 +620,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; } - //! Removes or reapplies the client's border to its window + //! Returns the logical size of the 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::Point &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; } @@ -521,8 +635,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. */ @@ -537,12 +653,39 @@ 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(); + + //! 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 + that you cannot add decorations to a window with this, you can only remove + decorations that would otherwise have been displayed. + @param flags The mask of values from Client::Decoration to specify which + decorations should not be displayed. + */ + void disableDecorations(DecorationFlags flags); + //! Attempt to focus the client window - bool focus() const; + bool focus(); //! Remove focus from the client window void unfocus() const; + //! Validate client, by making sure no Destroy or Unmap events exist in + //! the event queue for the window. + /*! + @return true if the client is valid; false if the client has already + been unmapped/destroyed, and so is invalid. + */ + 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); @@ -551,9 +694,13 @@ BB @param window The window id that the Client class should handle virtual void unmapHandler(const XUnmapEvent &e); virtual void destroyHandler(const XDestroyWindowEvent &e); virtual void reparentHandler(const XReparentEvent &e); + 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 *); }; }