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
};
//! 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;
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;
*/
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
//! 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;
*/
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
//! 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.<br>
+ 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);
//! Calculates the stacking layer for the client window
//! 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
*/
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.
@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
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);
public:
//! 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; }
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/
//! Returns the window's stacking layer
inline StackLayer layer() const { return _layer; }
+ //! Returns the logical size of the window
+ /*!
+ 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.
+ */
+ const otk::Point &logicalSize() const { return _logical_size; }
+
+ //! 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();
+
//! Removes or reapplies the client's border to its window
/*!
Used when managing and unmanaging a window.
//! 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.
*/
*/
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;
+
virtual void focusHandler(const XFocusChangeEvent &e);
virtual void unfocusHandler(const XFocusChangeEvent &e);
virtual void propertyHandler(const XPropertyEvent &e);
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