401 lines
14 KiB
C
401 lines
14 KiB
C
#ifndef __client_h
|
|
#define __client_h
|
|
|
|
#include "geom.h"
|
|
#include "obexport.h"
|
|
#include <glib.h>
|
|
#include <X11/Xlib.h>
|
|
|
|
struct ClientWrap;
|
|
struct Frame;
|
|
|
|
|
|
/*! Holds an icon in ARGB format */
|
|
typedef struct Icon {
|
|
unsigned long w, h;
|
|
unsigned long *data;
|
|
} Icon;
|
|
|
|
/*! The MWM Hints as retrieved from the window property
|
|
This structure only contains 3 elements, even though the Motif 2.0
|
|
structure contains 5. We only use the first 3, so that is all gets
|
|
defined.
|
|
*/
|
|
typedef struct MwmHints {
|
|
/*! A bitmask of Client::MwmFlags values */
|
|
unsigned long flags;
|
|
/*! A bitmask of Client::MwmFunctions values */
|
|
unsigned long functions;
|
|
/*! A bitmask of Client::MwmDecorations values */
|
|
unsigned long decorations;
|
|
} MwmHints;
|
|
/*! The number of elements in the Client::MwmHints struct */
|
|
#define MWM_ELEMENTS 3
|
|
|
|
/*! Possible flags for MWM Hints (defined by Motif 2.0) */
|
|
typedef enum {
|
|
MwmFlag_Functions = 1 << 0, /*!< The MMW Hints define funcs */
|
|
MwmFlag_Decorations = 1 << 1 /*!< The MWM Hints define decor */
|
|
} MwmFlags;
|
|
|
|
/*! Possible functions for MWM Hints (defined by Motif 2.0) */
|
|
typedef enum {
|
|
MwmFunc_All = 1 << 0, /*!< All functions */
|
|
MwmFunc_Resize = 1 << 1, /*!< Allow resizing */
|
|
MwmFunc_Move = 1 << 2, /*!< Allow moving */
|
|
MwmFunc_Iconify = 1 << 3, /*!< Allow to be iconfied */
|
|
MwmFunc_Maximize = 1 << 4 /*!< Allow to be maximized */
|
|
/*MwmFunc_Close = 1 << 5 /!< Allow to be closed */
|
|
} MwmFunctions;
|
|
|
|
/*! Possible decorations for MWM Hints (defined by Motif 2.0) */
|
|
typedef enum {
|
|
MwmDecor_All = 1 << 0, /*!< All decorations */
|
|
MwmDecor_Border = 1 << 1, /*!< Show a border */
|
|
MwmDecor_Handle = 1 << 2, /*!< Show a handle (bottom) */
|
|
MwmDecor_Title = 1 << 3, /*!< Show a titlebar */
|
|
/*MwmDecor_Menu = 1 << 4, /!< Show a menu */
|
|
MwmDecor_Iconify = 1 << 5, /*!< Show an iconify button */
|
|
MwmDecor_Maximize = 1 << 6 /*!< Show a maximize button */
|
|
} MemDecorations;
|
|
|
|
|
|
typedef struct Client {
|
|
Window window;
|
|
|
|
struct Frame *frame;
|
|
|
|
/*! The number of unmap events to ignore on the window */
|
|
int ignore_unmaps;
|
|
|
|
/*! The id of the group the window belongs to */
|
|
Window group;
|
|
/*! Whether or not the client is a transient window. This is guaranteed to
|
|
be TRUE if transient_for != NULL, but not guaranteed to be FALSE if
|
|
transient_for == NULL. */
|
|
gboolean transient;
|
|
/*! The client which this client is a transient (child) for */
|
|
struct Client *transient_for;
|
|
/*! The clients which are transients (children) of this client */
|
|
GSList *transients;
|
|
/*! The desktop on which the window resides (0xffffffff for all
|
|
desktops) */
|
|
unsigned int desktop;
|
|
|
|
/*! Normal window title */
|
|
gchar *title;
|
|
/*! Window title when iconified */
|
|
gchar *icon_title;
|
|
|
|
/*! The application that created the window */
|
|
gchar *res_name;
|
|
/*! The class of the window, can used for grouping */
|
|
gchar *res_class;
|
|
/*! The specified role of the window, used for identification */
|
|
gchar *role;
|
|
|
|
/*! The type of window (what its function is) */
|
|
WindowType type;
|
|
|
|
/*! Position and size of the window
|
|
This will not always be the actual position of the window on screen, it
|
|
is, rather, the position requested by the client, to which the window's
|
|
gravity is applied.
|
|
*/
|
|
Rect area;
|
|
|
|
/*! The window's strut
|
|
The strut defines areas of the screen that are marked off-bounds for
|
|
window placement. In theory, where this window exists.
|
|
*/
|
|
Strut strut;
|
|
|
|
/*! 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.
|
|
*/
|
|
Size logical_size;
|
|
|
|
/*! Width of the border on the window.
|
|
The window manager will set this to 0 while the window is being managed,
|
|
but needs to restore it afterwards, so it is saved here.
|
|
*/
|
|
guint 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
|
|
*/
|
|
Size min_size;
|
|
/*! The maximum size of the client window
|
|
If the min is > the max, then the window is not resizable
|
|
*/
|
|
Size max_size;
|
|
/*! The size of increments to resize the client window by */
|
|
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
|
|
*/
|
|
Size base_size;
|
|
|
|
/*! Window decoration and functionality hints */
|
|
MwmHints mwmhints;
|
|
|
|
/*! Where to place the decorated window in relation to the undecorated
|
|
window */
|
|
int gravity;
|
|
|
|
/*! The state of the window, one of WithdrawnState, IconicState, or
|
|
NormalState */
|
|
long wmstate;
|
|
|
|
/*! True if the client supports the delete_window protocol */
|
|
gboolean delete_window;
|
|
|
|
/*! Was the window's position requested by the application? if not, we
|
|
should place the window ourselves when it first appears */
|
|
gboolean positioned;
|
|
|
|
/*! Can the window receive input focus? */
|
|
gboolean can_focus;
|
|
/*! Urgency flag */
|
|
gboolean urgent;
|
|
/*! Notify the window when it receives focus? */
|
|
gboolean focus_notify;
|
|
/*! Does the client window have the input focus? */
|
|
gboolean focused;
|
|
|
|
/*! The window uses shape extension to be non-rectangular? */
|
|
gboolean shaped;
|
|
|
|
/*! The window is modal, so it must be processed before any windows it is
|
|
related to can be focused */
|
|
gboolean modal;
|
|
/*! Only the window's titlebar is displayed */
|
|
gboolean shaded;
|
|
/*! The window is iconified */
|
|
gboolean iconic;
|
|
/*! The window is maximized to fill the screen vertically */
|
|
gboolean max_vert;
|
|
/*! The window is maximized to fill the screen horizontally */
|
|
gboolean max_horz;
|
|
/*! The window should not be displayed by pagers */
|
|
gboolean skip_pager;
|
|
/*! The window should not be displayed by taskbars */
|
|
gboolean skip_taskbar;
|
|
/*! The window is a 'fullscreen' window, and should be on top of all
|
|
others */
|
|
gboolean fullscreen;
|
|
/*! The window should be on top of other windows of the same type */
|
|
gboolean above;
|
|
/*! The window should be underneath other windows of the same type */
|
|
gboolean 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 Decoration enum
|
|
The values in the variable are the decorations that the client wants to
|
|
be displayed around it.
|
|
*/
|
|
int decorations;
|
|
|
|
/*! A bitmask of values in the Decoration enum.
|
|
Specifies the decorations that should NOT be displayed on the client.
|
|
*/
|
|
int disabled_decorations;
|
|
|
|
/*! A bitmask of values in the Function enum
|
|
The values in the variable specify the ways in which the user is allowed
|
|
to modify this window.
|
|
*/
|
|
int functions;
|
|
|
|
/*! Icons for the client as specified on the client window */
|
|
Icon *icons;
|
|
/*! The number of icons in icons */
|
|
int nicons;
|
|
|
|
/*! The icon for the client specified in the WMHints or the KWM hints */
|
|
Pixmap pixmap_icon;
|
|
/*! The mask for the pixmap_icon, or None if its not masked */
|
|
Pixmap pixmap_icon_mask;
|
|
|
|
/* The instance of the wrapper class if one exists */
|
|
struct ClientWrap *wrap;
|
|
} Client;
|
|
|
|
extern GSList *client_list;
|
|
extern GHashTable *client_map;
|
|
|
|
void client_startup();
|
|
void client_shutdown();
|
|
|
|
/*! Manages all existing windows */
|
|
void client_manage_all();
|
|
/*! Manages a given window */
|
|
void client_manage(Window win);
|
|
/*! Unmanages all managed windows */
|
|
void client_unmanage_all();
|
|
/*! Unmanages a given client */
|
|
void client_unmanage(Client *client);
|
|
|
|
/*! Sets the client list on the root window from the client_list */
|
|
void client_set_list();
|
|
|
|
/*! Reapplies the maximized state to the window
|
|
Use this to make the window readjust its maximized size to new
|
|
surroundings (struts, etc). */
|
|
void client_remaximize(Client *self);
|
|
|
|
/*! Shows the window if it should be shown, or hides it
|
|
Used when changing desktops, the window's state, etc. */
|
|
void client_showhide(Client *self);
|
|
|
|
/*! Returns if the window should be treated as a normal window.
|
|
Some windows (desktops, docks, splash screens) have special rules applied
|
|
to them in a number of places regarding focus or user interaction. */
|
|
gboolean client_normal(Client *self);
|
|
|
|
/*! Internal version of the Client::resize function
|
|
This also maintains things like the client's minsize, and size increments.
|
|
@param anchor The corner to keep in the same position when resizing.
|
|
@param x The x coordiante of the new position for the client.
|
|
@param y The y coordiante of the new position for the client.
|
|
@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. For program requested changes, the
|
|
constraints are not checked.
|
|
@param final If user is true, then this should specify if this is a final
|
|
configuration. e.g. Final should be FALSE if doing an
|
|
interactive move/resize, and then be TRUE for the last call
|
|
only.
|
|
*/
|
|
void client_configure(Client *self, Corner anchor, int x, int y, int w, int h,
|
|
gboolean user, gboolean final);
|
|
|
|
/*! 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. This has no effect
|
|
when restoring a window from fullscreen.
|
|
*/
|
|
void client_fullscreen(Client *self, gboolean fs, gboolean savearea);
|
|
|
|
/*! 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 client_iconify(Client *self, gboolean iconic, gboolean curdesk);
|
|
|
|
/*! 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 client_maximize(Client *self, gboolean max, int dir,
|
|
gboolean savearea);
|
|
|
|
/*! Shades or unshades the client window
|
|
@param shade true if the window should be shaded; false if it should be
|
|
unshaded.
|
|
*/
|
|
void client_shade(Client *self, gboolean shade);
|
|
|
|
/*! Request the client to close its window. */
|
|
void client_close(Client *self);
|
|
|
|
/*! Sends the window to the specified desktop */
|
|
void client_set_desktop(Client *self, unsigned int target);
|
|
|
|
/*! Return a modal child of the client window
|
|
@return A modal child of the client window, or 0 if none was found.
|
|
*/
|
|
Client *client_find_modal_child(Client *self);
|
|
|
|
/*! 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.
|
|
*/
|
|
gboolean client_validate(Client *self);
|
|
|
|
/*! Sets the wm_state to the specified value */
|
|
void client_set_wm_state(Client *self, 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_apply_startup_state is used to do the same things during the mapping
|
|
process.
|
|
*/
|
|
void client_set_state(Client *self, Atom action, long data1, long data2);
|
|
|
|
/*! Attempt to focus the client window */
|
|
gboolean client_focus(Client *self);
|
|
|
|
/*! Remove focus from the client window */
|
|
void client_unfocus(Client *self);
|
|
|
|
/*! Calculates the stacking layer for the client window */
|
|
void client_calc_layer(Client *self);
|
|
|
|
/*! Updates the window's transient status, and any parents of it */
|
|
void client_update_transient_for(Client *self);
|
|
/*! Update the protocols that the window supports and adjusts things if they
|
|
change */
|
|
void client_update_protocols(Client *self);
|
|
/*! Updates the WMNormalHints and adjusts things if they change */
|
|
void client_update_normal_hints(Client *self);
|
|
|
|
/*! Updates the WMHints and adjusts things if they change
|
|
@param initstate Whether to read the initial_state property from the
|
|
WMHints. This should only be used during the mapping
|
|
process.
|
|
*/
|
|
void client_update_wmhints(Client *self);
|
|
/*! Updates the window's title */
|
|
void client_update_title(Client *self);
|
|
/*! Updates the window's icon title */
|
|
void client_update_icon_title(Client *self);
|
|
/*! Updates the window's application name and class */
|
|
void client_update_class(Client *self);
|
|
/*! Updates the strut for the client */
|
|
void client_update_strut(Client *self);
|
|
/*! Updates the window's icons */
|
|
void client_update_icons(Client *self);
|
|
/*! Updates the window's kwm icon */
|
|
void client_update_kwm_icon(Client *self);
|
|
|
|
/*! Set up what decor should be shown on the window and what functions should
|
|
be allowed (Client::_decorations and Client::_functions).
|
|
This also updates the NET_WM_ALLOWED_ACTIONS hint.
|
|
*/
|
|
void client_setup_decor_and_functions(Client *self);
|
|
|
|
/*! Retrieves the window's type and sets Client->type */
|
|
void client_get_type(Client *self);
|
|
|
|
#endif
|