X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fopenbox;a=blobdiff_plain;f=openbox%2Fclient.h;h=a946f274bc906a19cab39ca66dfa7f8251eb3de3;hp=f568b00884c9d2406a033fee7fd21555beb08ae3;hb=9325c92056ff4268db2263cdf8c07bb529e158aa;hpb=e6d33facc8f02a068f62b4f60c2872589b620dab diff --git a/openbox/client.h b/openbox/client.h index f568b008..a946f274 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -25,7 +25,7 @@ #include "geom.h" #include "stacking.h" #include "window.h" -#include "render/color.h" +#include "obrender/color.h" #include #include @@ -37,17 +37,9 @@ struct _ObFrame; struct _ObGroup; struct _ObSessionState; +struct _ObPrompt; typedef struct _ObClient ObClient; -typedef struct _ObClientIcon ObClientIcon; - -/*! Holds an icon in ARGB format */ -struct _ObClientIcon -{ - gint width; - gint height; - RrPixel32 *data; -}; /*! Possible window types */ typedef enum @@ -81,6 +73,11 @@ struct _ObClient { ObWindow obwin; Window window; + gboolean managed; + + /*! If this client is managing an ObPrompt window, then this is set to the + prompt */ + struct _ObPrompt *prompt; /*! The window's decorations. NULL while the window is being managed! */ struct _ObFrame *frame; @@ -115,6 +112,8 @@ struct _ObClient gchar *title; /*! Window title when iconified */ gchar *icon_title; + /*! The title as requested by the client, without any of our own changes */ + gchar *original_title; /*! Hostname of machine running the client */ gchar *client_machine; /*! The command used to run the program. Pre-XSMP window identification. */ @@ -128,6 +127,10 @@ struct _ObClient gchar *class; /*! The specified role of the window, used for identification */ gchar *role; + /*! The application that created the window's group. */ + gchar *group_name; + /*! The class of the window's group, can used for grouping */ + gchar *group_class; /*! The session client id for the window. *This can be NULL!* */ gchar *sm_client_id; @@ -148,6 +151,9 @@ struct _ObClient Rect pre_max_area; /*! Position and size of the window prior to being fullscreened */ Rect pre_fullscreen_area; + /*! Remember if the window was maximized before going fullscreen */ + gboolean pre_fullscreen_max_horz, + pre_fullscreen_max_vert; /*! The window's strut The strut defines areas of the screen that are marked off-bounds for @@ -231,8 +237,11 @@ struct _ObClient /*! Indicates if the client is trying to close but has stopped responding to pings */ gboolean not_responding; - /*! We tried to kill the client with SIGTERM */ - gboolean kill_tried_term; + /*! A prompt shown when you are trying to close a client that is not + responding. It asks if you want to kill the client */ + struct _ObPrompt *kill_prompt; + /*! We tried to close the window with a SIGTERM */ + gint kill_level; #ifdef SYNC /*! The client wants to sync during resizes */ @@ -245,6 +254,8 @@ struct _ObClient /*! The window uses shape extension to be non-rectangular? */ gboolean shaped; + /*! The window uses shape extension to have non-rectangular input? */ + gboolean shaped_input; /*! The window is modal, so it must be processed before any windows it is related to can be focused */ @@ -257,6 +268,8 @@ struct _ObClient gboolean max_vert; /*! The window is maximized to fill the screen horizontally */ gboolean max_horz; + /*! The window is semi-transparent */ + guint8 opacity; /*! The window should not be displayed by pagers */ gboolean skip_pager; /*! The window should not be displayed by taskbars */ @@ -297,13 +310,14 @@ struct _ObClient */ guint functions; - /*! Icons for the client as specified on the client window */ - ObClientIcon *icons; - /*! The number of icons in icons */ - guint nicons; + /* The window's icon, in a variety of shapes and sizes */ + RrImage *icon_set; /*! Where the window should iconify to/from */ Rect icon_geometry; + + /*! A boolean used for algorithms which need to mark clients as visited */ + gboolean visited; }; extern GList *client_list; @@ -318,14 +332,15 @@ typedef void (*ObClientCallback)(ObClient *client, gpointer data); /*! Get notified when the client is unmanaged */ void client_add_destroy_notify(ObClientCallback func, gpointer data); void client_remove_destroy_notify(ObClientCallback func); +void client_remove_destroy_notify_data(ObClientCallback func, gpointer data); -/*! Manages all existing windows */ -void client_manage_all(); /*! Manages a given window + @param prompt This specifies an ObPrompt which is being managed. It is + possible to manage Openbox-owned windows through this. */ -void client_manage(Window win); +void client_manage(Window win, struct _ObPrompt *prompt); /*! Unmanages all managed windows */ -void client_unmanage_all(); +void client_unmanage_all(void); /*! Unmanages a given client */ void client_unmanage(ObClient *client); @@ -338,7 +353,7 @@ ObClient *client_fake_manage(Window win); void client_fake_unmanage(ObClient *self); /*! Sets the client list on the root window from the client_list */ -void client_set_list(); +void client_set_list(void); /*! Determines if the client should be shown or hidden currently. @return TRUE if it should be visible; otherwise, FALSE. @@ -354,6 +369,10 @@ gboolean client_normal(ObClient *self); (utilty, menu, etc) */ gboolean client_helper(ObClient *self); +/*! Returns true if the window occupies space in the monitor conceptually, or + false if it does not and its presence should be ignored when possible. */ +gboolean client_occupies_space(ObClient *self); + /*! Return if the client is a type which should be given focus from mouse presses on the *client* window. This doesn't affect clicking on the decorations. This doesn't count for focus cycling, different rules apply to @@ -482,6 +501,11 @@ void client_find_resize_directional(ObClient *self, ObDirection side, */ void client_fullscreen(ObClient *self, gboolean fs); +/*! Determine if the window, using the given client-area, would be considered + as an "oldschool fullscreen" window, that is, if it is filling a whole + monitor. */ +gboolean client_is_oldfullscreen(const ObClient *self, const Rect *area); + /*! Iconifies or uniconifies the client window @param iconic true if the window should be iconified; false if it should be restored. @@ -526,6 +550,9 @@ void client_kill(ObClient *self); void client_set_desktop(ObClient *self, guint target, gboolean donthide, gboolean dontraise); +/*! Adjust the client opacity */ +void client_set_opacity(ObClient *self, guint8 opacity); + /*! Show the client if it should be shown. Returns if the window is shown. */ gboolean client_show(ObClient *self); @@ -569,15 +596,18 @@ gboolean client_focus(ObClient *self); /*! Activates the client for use, focusing, uniconifying it, etc. To be used when the user deliberately selects a window for use. - @param here If true, then the client is brought to the current desktop; - otherwise, the desktop is changed to where the client lives. + @param desktop If true, and the window is on another desktop, it will still + be activated. + @param here If true, and the window is on another desktop, it will be moved + to the current desktop, otherwise the desktop will switch to + where the window is. @param raise If true, the client is brought to the front. @param unshade If true, the client is unshaded (if it is shaded) @param user If true, then a user action is what requested the activation; otherwise, it means an application requested it on its own */ -void client_activate(ObClient *self, gboolean here, gboolean raise, - gboolean unshade, gboolean user); +void client_activate(ObClient *self, gboolean desktop, gboolean here, + gboolean raise, gboolean unshade, gboolean user); /*! Bring all of its helper windows to its desktop. These are the utility and stuff windows. */ @@ -600,6 +630,8 @@ void client_update_sync_request_counter(ObClient *self); #endif /*! Updates the window's colormap */ void client_update_colormap(ObClient *self, Colormap colormap); +/*! Updates the requested opacity for the window from the client. */ +void client_update_opacity(ObClient *self); /*! Updates the WMNormalHints and adjusts things if they change */ void client_update_normal_hints(ObClient *self); @@ -628,20 +660,35 @@ void client_setup_decor_and_functions(ObClient *self, gboolean reconfig); /*! Sets the window's type and transient flag */ void client_get_type_and_transientness(ObClient *self); +/*! Gets the motif wm hints */ +void client_get_mwm_hints(ObClient *self); -const ObClientIcon *client_icon(ObClient *self, gint w, gint h); +/*! Returns a client's icon set, or its parents (recursively) if it doesn't + have one +*/ +RrImage* client_icon(ObClient *self); /*! Return TRUE if the client is transient for some other window. Return FALSE if it's not transient or there is no window for it to be transient for */ gboolean client_has_parent(ObClient *self); -/*! Searches a client's direct parents for a focused window. The function does - not check for the passed client, only for *ONE LEVEL* of its parents. - If no focused parentt is found, NULL is returned. +/*! Return TRUE if the client has some transient children, and FALSE otherwise. +*/ +gboolean client_has_children(ObClient *self); + +/*! Searches a client's immediate parents for a focused window. The function + does not check for the passed client, only for *ONE LEVEL* of its parents. + If no focused parent is found, NULL is returned. */ ObClient *client_search_focus_parent(ObClient *self); +/*! Searches a client's parents for a focused window. The function + does not check for the passed client, but searches through all of its + parents. If no focused parent is found, NULL is returned. +*/ +ObClient *client_search_focus_parent_full(ObClient *self); + /*! 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. @@ -688,7 +735,9 @@ ObClient *client_direct_parent(ObClient *self); */ ObClient *client_search_top_direct_parent(ObClient *self); -/*! Is one client a direct child of another (i.e. not through the group.) */ +/*! Is one client a direct child of another (i.e. not through the group.) + This checks more than one level, so there may be another direct child in + between */ gboolean client_is_direct_child(ObClient *parent, ObClient *child); /*! Search for a parent of a client. This only searches up *ONE LEVEL*, and @@ -708,8 +757,16 @@ void client_set_layer(ObClient *self, gint layer); guint client_monitor(ObClient *self); -ObClient* client_under_pointer(); +ObClient* client_under_pointer(void); gboolean client_has_group_siblings(ObClient *self); +/*! Returns TRUE if the client has a transient child, a parent, or a + group member. Returns FALSE otherwise. +*/ +gboolean client_has_relative(ObClient *self); + +/*! Returns TRUE if the client is running on the same machine as Openbox */ +gboolean client_on_localhost(ObClient *self); + #endif