X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.h;h=9f208596f2fe6261fc2573b09b289e5c80bcbe19;hb=7c1a00802326a608bc1baeb67731a9ab3eda8ba6;hp=5526c282ddf6d9cc242b445206c4fa3c460d8a05;hpb=f5d7952a9470f132a612d71b8c86a1279ea3efa3;p=chaz%2Fopenbox diff --git a/openbox/client.h b/openbox/client.h index 5526c282..9f208596 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -35,11 +35,6 @@ struct _ObSessionState; typedef struct _ObClient ObClient; typedef struct _ObClientIcon ObClientIcon; -typedef struct _ObAppSettings ObAppSettings; - -/* The value in client.transient_for indicating it is a transient for its - group instead of for a single window */ -#define OB_TRAN_GROUP ((void*)~0l) /*! Holds an icon in ARGB format */ struct _ObClientIcon @@ -73,13 +68,13 @@ typedef enum OB_CLIENT_FUNC_FULLSCREEN = 1 << 5, /*!< Allow to be made fullscreen */ OB_CLIENT_FUNC_CLOSE = 1 << 6, /*!< Allow to be closed */ OB_CLIENT_FUNC_ABOVE = 1 << 7, /*!< Allow to be put in lower layer */ - OB_CLIENT_FUNC_BELOW = 1 << 8 /*!< Allow to be put in higher layer */ + OB_CLIENT_FUNC_BELOW = 1 << 8, /*!< Allow to be put in higher layer */ + OB_CLIENT_FUNC_UNDECORATE = 1 << 9 /*!< Allow to be undecorated */ } ObFunctions; struct _ObClient { ObWindow obwin; - Window window; /*! The window's decorations. NULL while the window is being managed! */ @@ -94,16 +89,13 @@ struct _ObClient /*! Saved session data to apply to this client */ struct _ObSessionState *session; - /*! 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. */ + /*! Whether or not the client is a transient window. It may or may not + have parents when this is true. */ gboolean transient; - /*! 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 ObGroup, and is not a valid pointer to be followed in this - case. - */ - ObClient *transient_for; + /*! Whether or not the client is transient for its group */ + gboolean transient_for_group; + /*! The client which are parents of this client */ + GSList *parents; /*! The clients which are transients (children) of this client */ GSList *transients; /*! The desktop on which the window resides (0xffffffff for all @@ -217,6 +209,10 @@ struct _ObClient we only force it if it tries to go completely offscreen, if neither, we should place the window ourselves when it first appears */ guint positioned; + + /*! Was the window's size requested by the application or the user? + If by the application we don't let it go outside the available area */ + guint sized; /*! Can the window receive input focus? */ gboolean can_focus; @@ -363,26 +359,41 @@ gboolean client_enter_focusable(ObClient *self); /* Returns if the window is focused */ gboolean client_focused(ObClient *self); -/*! Convery a position/size from a given gravity to the client's true gravity +/*! When the client is resized but not moved, figure out the new position + for it based on its gravity: + http://standards.freedesktop.org/wm-spec/wm-spec-1.4.html#id2512541 +*/ +void client_gravity_resize_w(ObClient *self, gint *x, gint oldw, gint neww); + +/*! When the client is resized but not moved, figure out the new position + for it based on its gravity: + http://standards.freedesktop.org/wm-spec/wm-spec-1.4.html#id2512541 +*/ +void client_gravity_resize_h(ObClient *self, gint *y, gint oldh, gint newh); + +/*! Convert a position/size from a given gravity to the client's true gravity, + when the client is only resizing (the reference point doesn't move) */ -void client_convert_gravity(ObClient *self, gint gravity, gint *x, gint *y, - gint w, gint h); +void client_convert_gravity_resize(ObClient *self, gint gravity, + gint *x, gint *y, + gint w, gint h); #define client_move(self, x, y) \ - client_configure(self, x, y, self->area.width, self->area.height, \ - TRUE, TRUE) + client_configure(self, x, y, self->area.width, self->area.height, TRUE, TRUE,\ + FALSE) #define client_resize(self, w, h) \ - client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE) + client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE, FALSE) #define client_move_resize(self, x, y, w, h) \ - client_configure(self, x, y, w, h, TRUE, TRUE) - -#define client_configure(self, x, y, w, h, user, final) \ - client_configure_full(self, x, y, w, h, user, final) + client_configure(self, x, y, w, h, TRUE, TRUE, FALSE) +#define client_reconfigure(self, force) \ + client_configure(self, ((ObClient*)self)->area.x, ((ObClient*)self)->area.y, \ + ((ObClient*)self)->area.width, \ + ((ObClient*)self)->area.height, FALSE, TRUE, force) /*! Figure out where a window will end up and what size it will be if you told it to move/resize to these coordinates. - These values are what client_configure_full will give the window. + These values are what client_configure will give the window. @param x The x coordiante of the new position for the client. @param y The y coordiante of the new position for the client. @@ -416,12 +427,10 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h, interactive move/resize, and then be TRUE for the last call only. @param force_reply Send a ConfigureNotify to the client regardless of if - the position changed. + the position/size changed. */ -void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h, - gboolean user, gboolean final); - -void client_reconfigure(ObClient *self); +void client_configure(ObClient *self, gint x, gint y, gint w, gint h, + gboolean user, gboolean final, gboolean force_reply); /*! Finds coordinates to keep a client on the screen. @param self The client @@ -446,6 +455,18 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h, */ void client_move_onscreen(ObClient *self, gboolean rude); +/*! dir is either North, South, East or West. It can't be, for example, + Northwest */ +void client_find_edge_directional(ObClient *self, ObDirection dir, + gint my_head, gint my_tail, + gint my_edge_start, gint my_edge_size, + gint *dest, gboolean *near_edge); +void client_find_move_directional(ObClient *self, ObDirection dir, + gint *x, gint *y); +void client_find_resize_directional(ObClient *self, ObDirection side, + gboolean grow, + gint *x, gint *y, gint *w, gint *h); + /*! 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. @@ -490,8 +511,11 @@ void client_kill(ObClient *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. + @param dontraise If TRUE, the window will not be raised. Generally this should + be FALSE. */ -void client_set_desktop(ObClient *self, guint target, gboolean donthide); +void client_set_desktop(ObClient *self, guint target, gboolean donthide, + gboolean dontraise); /*! Show the client if it should be shown. Returns if the window is shown. */ gboolean client_show(ObClient *self); @@ -531,24 +555,28 @@ ObClient *client_focus_target(ObClient *self); without focusing it or modifying the focus order lists. */ gboolean client_can_focus(ObClient *self); -/*! Attempt to focus the client window - NOTE: You should validate the client before calling this !! (client_validate) -*/ +/*! Attempt to focus the client window */ 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 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 user); +void client_activate(ObClient *self, gboolean here, gboolean raise, + gboolean unshade, gboolean user); /*! Bring all of its helper windows to its desktop. These are the utility and stuff windows. */ void client_bring_helper_windows(ObClient *self); +/*! Bring all of its modal windows to its desktop. */ +void client_bring_modal_windows(ObClient *self); + /*! Calculates the stacking layer for the client window */ void client_calc_layer(ObClient *self); @@ -588,14 +616,23 @@ void client_update_icon_geometry(ObClient *self); /*! Set up what decor should be shown on the window and what functions should be allowed (ObClient::decorations and ObClient::functions). This also updates the NET_WM_ALLOWED_ACTIONS hint. + @param reconfig When TRUE, the window will be reconfigured to show the + changes */ -void client_setup_decor_and_functions(ObClient *self); +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); const ObClientIcon *client_icon(ObClient *self, gint w, gint h); +ObClientIcon *client_thumbnail(ObClient *self, gint w, gint h); + +/*! 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. @@ -614,6 +651,11 @@ ObClient *client_search_focus_tree(ObClient *self); */ ObClient *client_search_focus_tree_full(ObClient *self); +/*! Searches a client's group and each member's transients for a focused + window. This doesn't go up the window's transient tree at all. If no + focused client is found, NULL is returned. */ +ObClient *client_search_focus_group_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. @@ -633,10 +675,15 @@ GSList *client_search_all_top_parents(ObClient *self); */ GSList *client_search_all_top_parents_layer(ObClient *self); +/*! Returns the client's parent when it is transient for a direct window + rather than a group. If it has no parents, or is transient for the + group, this returns null */ +ObClient *client_direct_parent(ObClient *self); + /*! Returns a window's top level parent. This only counts direct parents, not groups if it is transient for its group. */ -ObClient *client_search_top_normal_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.) */ gboolean client_is_direct_child(ObClient *parent, ObClient *child); @@ -649,9 +696,6 @@ ObClient *client_search_parent(ObClient *self, ObClient *search); NULL is returned if the given search is not a transient of the client. */ ObClient *client_search_transient(ObClient *self, ObClient *search); -/*! Return the closest edge in the given direction */ -gint client_directional_edge_search(ObClient *c, ObDirection dir, gboolean hang); - /*! 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.
@@ -665,4 +709,6 @@ ObClient* client_under_pointer(); gboolean client_has_group_siblings(ObClient *self); +void clienticon_free(ObClientIcon *ci); + #endif