X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.h;h=ecfb17d1faec124404ae21b86416231a080a256f;hb=4736c257a54409bf3b0ef0d803da650c71684dee;hp=808f4e5f8a6f2aee151483bce96400d0ba2370a7;hpb=9b514b3b6165c80cfe7152c2088a97765f6c82f4;p=chaz%2Fopenbox diff --git a/openbox/client.h b/openbox/client.h index 808f4e5f..ecfb17d1 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -1,93 +1,57 @@ #ifndef __client_h #define __client_h +#include "misc.h" +#include "mwm.h" #include "geom.h" #include "stacking.h" +#include "render/color.h" + #include #include struct Frame; +struct Group; + +typedef struct _ObClient ObClient; +typedef struct _ObClientIcon ObClientIcon; +/* The value in client.transient_for indicating it is a transient for its + group instead of for a single window */ +#define TRAN_GROUP ((void*)~0l) /*! Holds an icon in ARGB format */ -typedef struct Icon { - unsigned long w, h; - unsigned long *data; -} Icon; +struct _ObClientIcon +{ + gint width; + gint height; + RrPixel32 *data; +}; -/*! 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; - -/*! Corners of the client window, used for anchor positions */ -typedef enum { - Corner_TopLeft, - Corner_TopRight, - Corner_BottomLeft, - Corner_BottomRight -} Corner; - /*! Possible window types */ -typedef enum { - 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, /*!< 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 */ - Type_Normal /*!< A normal application window */ -} WindowType; +typedef enum +{ + OB_CLIENT_TYPE_DESKTOP, /*!< A desktop (bottom-most window) */ + OB_CLIENT_TYPE_DOCK, /*!< A dock bar/panel window */ + OB_CLIENT_TYPE_TOOLBAR, /*!< A toolbar window, pulled off an app */ + OB_CLIENT_TYPE_MENU, /*!< An unpinned menu from an app */ + OB_CLIENT_TYPE_UTILITY, /*!< A small utility window such as a palette */ + OB_CLIENT_TYPE_SPLASH, /*!< A splash screen window */ + OB_CLIENT_TYPE_DIALOG, /*!< A dialog window */ + OB_CLIENT_TYPE_NORMAL /*!< A normal application window */ +} ObClientType; /*! The things the user can do to the client window */ -typedef enum { - 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 */ -} Function; +typedef enum +{ + OB_CLIENT_FUNC_RESIZE = 1 << 0, /*!< Allow user resizing */ + OB_CLIENT_FUNC_MOVE = 1 << 1, /*!< Allow user moving */ + OB_CLIENT_FUNC_ICONIFY = 1 << 2, /*!< Allow to be iconified */ + OB_CLIENT_FUNC_MAXIMIZE = 1 << 3, /*!< Allow to be maximized */ + OB_CLIENT_FUNC_SHADE = 1 << 4, /*!< Allow to be shaded */ + OB_CLIENT_FUNC_FULLSCREEN = 1 << 5, /*!< Allow to be made fullscreen */ + OB_CLIENT_FUNC_CLOSE = 1 << 6 /*!< Allow to be closed */ +} ObFunctions; /*! The decorations the client window wants to be displayed on it */ typedef enum { @@ -100,34 +64,45 @@ typedef enum { /*! Display a button to toggle the window's placement on all desktops */ Decor_AllDesktops = 1 << 6, - Decor_Close = 1 << 7 /*!< Display a close button */ + Decor_Shade = 1 << 7, /*!< Displays a shade button */ + Decor_Close = 1 << 8 /*!< Display a close button */ } Decoration; +struct _ObClient +{ + ObWindow obwin; -typedef struct Client { Window window; + /*! The window's decorations. NULL while the window is being managed! */ 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; + struct Group *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 client which this client is a transient (child) for. + A value of TRAN_GROUP signifies that the window is a transient for all + members of its Group, and is not a valid pointer to be followed in this + case. + */ + ObClient *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; + guint desktop; /*! Normal window title */ gchar *title; + /*! The count for the title. When another window with the same title + exists, a count will be appended to it. */ + guint title_count; /*! Window title when iconified */ gchar *icon_title; @@ -139,7 +114,7 @@ typedef struct Client { gchar *role; /*! The type of window (what its function is) */ - WindowType type; + ObClientType type; /*! Position and size of the window This will not always be the actual position of the window on screen, it @@ -194,7 +169,7 @@ typedef struct Client { Size base_size; /*! Window decoration and functionality hints */ - MwmHints mwmhints; + ObMwmHints mwmhints; /*! Where to place the decorated window in relation to the undecorated window */ @@ -254,38 +229,26 @@ typedef struct Client { The values in the variable are the decorations that the client wants to be displayed around it. */ - int decorations; + guint decorations; /*! A bitmask of values in the Decoration enum. Specifies the decorations that should NOT be displayed on the client. */ - int disabled_decorations; + guint disabled_decorations; - /*! A bitmask of values in the Function enum + /*! A bitmask of values in the ObFunctions enum The values in the variable specify the ways in which the user is allowed to modify this window. */ - int functions; - - /*! Saved decorations from before becoming fullscreen */ - int pre_fs_decor; - - /*! Saved functions from before becoming fullscreen */ - int pre_fs_func; + guint functions; /*! Icons for the client as specified on the client window */ - Icon *icons; + ObClientIcon *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; -} Client; + guint nicons; +}; -extern GSList *client_list; -extern GHashTable *client_map; +extern GList *client_list; void client_startup(); void client_shutdown(); @@ -297,33 +260,23 @@ void client_manage(Window win); /*! Unmanages all managed windows */ void client_unmanage_all(); /*! Unmanages a given client */ -void client_unmanage(Client *client); +void client_unmanage(ObClient *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); - /*! Determines if the client should be shown or hidden currently. @return TRUE if it should be visible; otherwise, FALSE. */ -gboolean client_should_show(Client *self); +gboolean client_should_show(ObClient *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); +gboolean client_normal(ObClient *self); /* Returns if the window is focused */ -gboolean client_focused(Client *self); - -/*! Sets the client to a focused or unfocused state. This does not actually - change the input focus, but rather is used once focus has been moved to tell - the client that it is so. */ -void client_set_focused(Client *self, gboolean focused); +gboolean client_focused(ObClient *self); /*! Move and/or resize the window. This also maintains things like the client's minsize, and size increments. @@ -340,9 +293,17 @@ void client_set_focused(Client *self, gboolean focused); 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, +void client_configure(ObClient *self, ObCorner anchor, + int x, int y, int w, int h, gboolean user, gboolean final); +void client_reconfigure(ObClient *self); + +/*! Moves a client so that it is on screen if it is entirely out of the + viewable screen. +*/ +void client_move_onscreen(ObClient *self); + /*! 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. @@ -351,7 +312,7 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, 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); +void client_fullscreen(ObClient *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 @@ -360,7 +321,7 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea); be uniconified to the current viewable desktop (true) or to its previous desktop (false) */ -void client_iconify(Client *self, gboolean iconic, gboolean curdesk); +void client_iconify(ObClient *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 @@ -371,38 +332,35 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk); new window that is set to fullscreen. This has no effect when unmaximizing a window. */ -void client_maximize(Client *self, gboolean max, int dir, +void client_maximize(ObClient *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); +void client_shade(ObClient *self, gboolean shade); /*! Request the client to close its window */ -void client_close(Client *self); +void client_close(ObClient *self); /*! Kill the client off violently */ -void client_kill(Client *self); - -/*! Sends the window to the specified desktop */ -void client_set_desktop(Client *self, guint target); +void client_kill(ObClient *self); -/*! 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); +/*! Sends the window to the specified desktop + @param donthide If TRUE, the window will not be shown/hidden after its + desktop has been changed. Generally this should be FALSE. */ +void client_set_desktop(ObClient *self, guint target, gboolean donthide); /*! 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); +gboolean client_validate(ObClient *self); /*! Sets the wm_state to the specified value */ -void client_set_wm_state(Client *self, long state); +void client_set_wm_state(ObClient *self, long state); /*! Adjusts the window's net_state This should not be called as part of the window mapping process! It is for @@ -410,51 +368,94 @@ void client_set_wm_state(Client *self, long state); 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); +void client_set_state(ObClient *self, Atom action, long data1, long data2); + +/* Given a ObClient, find the client that focus would actually be sent to if + you wanted to give focus to the specified ObClient. Will return the same + ObClient passed to it or another ObClient if appropriate. */ +ObClient *client_focus_target(ObClient *self); + +/*! Returns what client_focus would return if passed the same client, but + without focusing it or modifying the focus order lists. */ +gboolean client_can_focus(ObClient *self); /*! Attempt to focus the client window */ -gboolean client_focus(Client *self); +gboolean client_focus(ObClient *self); /*! Remove focus from the client window */ -void client_unfocus(Client *self); +void client_unfocus(ObClient *self); + +/*! Activates the client for use, focusing, uniconifying it, etc. To be used + when the user deliberately selects a window for use. */ +void client_activate(ObClient *self); /*! Calculates the stacking layer for the client window */ -void client_calc_layer(Client *self); +void client_calc_layer(ObClient *self); /*! Updates the window's transient status, and any parents of it */ -void client_update_transient_for(Client *self); +void client_update_transient_for(ObClient *self); /*! Update the protocols that the window supports and adjusts things if they change */ -void client_update_protocols(Client *self); +void client_update_protocols(ObClient *self); /*! Updates the WMNormalHints and adjusts things if they change */ -void client_update_normal_hints(Client *self); +void client_update_normal_hints(ObClient *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); +void client_update_wmhints(ObClient *self); +/*! Updates the window's title and icon title */ +void client_update_title(ObClient *self); /*! Updates the window's application name and class */ -void client_update_class(Client *self); +void client_update_class(ObClient *self); /*! Updates the strut for the client */ -void client_update_strut(Client *self); +void client_update_strut(ObClient *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); +void client_update_icons(ObClient *self); /*! Set up what decor should be shown on the window and what functions should - be allowed (Client::decorations and Client::functions). + be allowed (ObClient::decorations and ObClient::functions). This also updates the NET_WM_ALLOWED_ACTIONS hint. */ -void client_setup_decor_and_functions(Client *self); +void client_setup_decor_and_functions(ObClient *self); + +/*! Retrieves the window's type and sets ObClient->type */ +void client_get_type(ObClient *self); + +ObClientIcon *client_icon(ObClient *self, int w, int h); + +/*! Searches a client's transients for a focused window. The function does not + check for the passed client, only for its transients. + If no focused transient is found, NULL is returned. +*/ +ObClient *client_search_focus_tree(ObClient *self); + +/*! Searches a client's transient tree for a focused window. The function + searches up the tree and down other branches as well as the passed client's. + If no focused client is found, NULL is returned. +*/ +ObClient *client_search_focus_tree_full(ObClient *self); + +/*! Return a modal child of the client window that can be focused. + @return A modal child of the client window that can be focused, or 0 if + none was found. +*/ +ObClient *client_search_modal_child(ObClient *self); + +ObClient *client_search_top_transient(ObClient *self); + +/*! Return the "closest" client in the given direction */ +ObClient *client_find_directional(ObClient *c, ObDirection dir); + +/*! Set a client window to be above/below other clients. + @layer < 0 indicates the client should be placed below other clients.
+ = 0 indicates the client should be placed with other clients.
+ > 0 indicates the client should be placed above other clients. +*/ +void client_set_layer(ObClient *self, int layer); -/*! Retrieves the window's type and sets Client->type */ -void client_get_type(Client *self); +guint client_monitor(ObClient *self); #endif