X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.h;h=98f9e6e41afd9441537c3daf5a5c1430b868fed8;hb=881a8647d2eb5f13eccda87a712c180fa9e902cf;hp=d902f72a5d1ee8bc34f8097bac4fcf5fd8545035;hpb=280529221e9349aa07c6c498df6b80b3a8951198;p=chaz%2Fopenbox
diff --git a/openbox/client.h b/openbox/client.h
index d902f72a..98f9e6e4 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
@@ -71,13 +66,15 @@ typedef enum
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 */
+ 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_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! */
@@ -92,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
@@ -166,7 +160,7 @@ struct _ObClient
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;
+ gint border_width;
/*! The minimum aspect ratio the client window can be sized to.
A value of 0 means this is ignored.
@@ -215,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;
@@ -289,13 +287,17 @@ struct _ObClient
/*! The number of icons in icons */
guint nicons;
- /* Where the window should iconify to/from */
+ /*! Where the window should iconify to/from */
Rect icon_geometry;
+ /*! The time when the client last received user interaction */
guint32 user_time;
+ /*! A separate window for the client to update it's user_time on */
+ Window user_time_window;
};
-extern GList *client_list;
+extern GList *client_list;
+extern GHashTable *client_user_time_window_map;
void client_startup(gboolean reconfig);
void client_shutdown(gboolean reconfig);
@@ -305,22 +307,27 @@ typedef void (*ObClientCallback)(ObClient *client, gpointer data);
/* Callback functions */
/*! Get notified when the client is unmanaged */
-void client_add_destructor(ObClientCallback func, gpointer data);
-void client_remove_destructor(ObClientCallback func);
-
-/*! Get notified when the client changes desktop */
-void client_add_desktop_notify(ObClientCallback func, gpointer data);
-void client_remove_desktop_notify(ObClientCallback func);
+void client_add_destroy_notify(ObClientCallback func, gpointer data);
+void client_remove_destroy_notify(ObClientCallback func);
/*! Manages all existing windows */
void client_manage_all();
-/*! Manages a given window */
+/*! Manages a given window
+*/
void client_manage(Window win);
/*! Unmanages all managed windows */
void client_unmanage_all();
/*! Unmanages a given client */
void client_unmanage(ObClient *client);
+/*! This manages a window only so far as is needed to get it's decorations.
+ This is used when you want to determine a window's decorations before it
+ is mapped. Call client_fake_unmanage() with the returned client when you
+ are done with it. */
+ObClient *client_fake_manage(Window win);
+/*! Free the stuff created by client_fake_manage() */
+void client_fake_unmanage(ObClient *self);
+
/*! Sets the client list on the root window from the client_list */
void client_set_list();
@@ -334,30 +341,50 @@ gboolean client_should_show(ObClient *self);
to them in a number of places regarding focus or user interaction. */
gboolean client_normal(ObClient *self);
-/*! Returns if the window is one of an application's main windows (normal or
- dialog type) rather than an accessory window (utilty, menu, etc) or a
- non-normal window */
-gboolean client_application(ObClient *self);
+/*! Returns if the window is one of an application's helper windows
+ (utilty, menu, etc) */
+gboolean client_helper(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
+ that. */
+gboolean client_mouse_focusable(ObClient *self);
+
+/*! Return if the client is a type which should be given focus from the
+ mouse entering the window. This doesn't count for focus cycling, different
+ rules apply to that. */
+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 *client, 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)
#define client_resize(self, w, h) \
client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE)
#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, FALSE)
-
/*! Figure out where a window will end up and what size it will be if you
told it to move/resize to these coordinates.
@@ -397,9 +424,8 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
@param force_reply Send a ConfigureNotify to the client regardless of if
the position changed.
*/
-void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h,
- gboolean user, gboolean final,
- gboolean force_reply);
+void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
+ gboolean user, gboolean final);
void client_reconfigure(ObClient *self);
@@ -439,7 +465,8 @@ void client_fullscreen(ObClient *self, gboolean fs);
be uniconified to the current viewable desktop (true) or to
its previous desktop (false)
*/
-void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk);
+void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk,
+ gboolean hide_animation);
/*! Maximize or unmaximize the client window
@param max true if the window should be maximized; false if it should be
@@ -454,6 +481,9 @@ void client_maximize(ObClient *self, gboolean max, gint dir);
*/
void client_shade(ObClient *self, gboolean shade);
+/*! Set a client window to have decorations or not */
+void client_set_undecorated(ObClient *self, gboolean undecorated);
+
/*! Hilite the window to make the user notice it */
void client_hilite(ObClient *self, gboolean hilite);
@@ -465,14 +495,15 @@ 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. */
+ desktop has been changed. Generally this should be FALSE.
+*/
void client_set_desktop(ObClient *self, guint target, gboolean donthide);
-/*! Show the client if it should be shown. */
-void client_show(ObClient *self);
+/*! Show the client if it should be shown. Returns if the window is shown. */
+gboolean client_show(ObClient *self);
-/*! Show the client if it should be shown. */
-void client_hide(ObClient *self);
+/*! Show the client if it should be shown. Returns if the window is hidden. */
+gboolean client_hide(ObClient *self);
/*! Show the client if it should be shown, and hide it if it should be
hidden. This is for example, when switching desktops.
@@ -506,9 +537,7 @@ 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
@@ -520,29 +549,16 @@ gboolean client_focus(ObClient *self);
*/
void client_activate(ObClient *self, gboolean here, 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);
-/*! Raises the client to the top of its stacking layer
- Normally actions call to the client_* functions to make stuff go, but this
- one is an exception. It just fires off an action, which will be queued.
- This is because stacking order rules can be changed by focus state, and so
- any time focus changes you have to wait for it to complete before you can
- properly restart windows. As such, this only queues an action for later
- execution, once the focus change has gone through.
-*/
-void client_raise(ObClient *self);
-
-/*! Lowers the client to the bottom of its stacking layer
- Normally actions call to the client_* functions to make stuff go, but this
- one is an exception. It just fires off an action, which will be queued.
- This is because stacking order rules can be changed by focus state, and so
- any time focus changes you have to wait for it to complete before you can
- properly restart windows. As such, this only queues an action for later
- execution, once the focus change has gone through.
-*/
-void client_lower(ObClient *self);
-
/*! Updates the window's transient status, and any parents of it */
void client_update_transient_for(ObClient *self);
/*! Update the protocols that the window supports and adjusts things if they
@@ -571,20 +587,29 @@ void client_update_strut(ObClient *self);
void client_update_icons(ObClient *self);
/*! Updates the window's user time */
void client_update_user_time(ObClient *self);
+/*! Updates the window's user time window */
+void client_update_user_time_window(ObClient *self);
/*! Updates the window's icon geometry (where to iconify to/from) */
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);
-/*! Retrieves the window's type and sets ObClient->type */
-void client_get_type(ObClient *self);
+/*! 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);
+/*! 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.
@@ -603,6 +628,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.
@@ -622,10 +652,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);
@@ -642,21 +677,16 @@ ObClient *client_search_transient(ObClient *self, ObClient *search);
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.
+ @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, gint layer);
-/*! Set a client window to have decorations or not */
-void client_set_undecorated(ObClient *self, gboolean undecorated);
-
guint client_monitor(ObClient *self);
ObClient* client_under_pointer();
gboolean client_has_group_siblings(ObClient *self);
-gboolean client_has_application_group_siblings(ObClient *self);
-
#endif