X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=inline;f=openbox%2Fclient.h;h=bb783458cee5ea2eaf9a32ad24ba3933d0040ad0;hb=d9699d14700da5f227f6e5ad708519b1efdd874d;hp=3fab451e0e9747a1d19eb2776cf1b3053991b4f3;hpb=277db2822d79a6000d31b93ec963ae87286d6ade;p=chaz%2Fopenbox
diff --git a/openbox/client.h b/openbox/client.h
index 3fab451e..bb783458 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
@@ -118,6 +112,8 @@ struct _ObClient
gchar *icon_title;
/*! Hostname of machine running the client */
gchar *client_machine;
+ /*! The command used to run the program. Pre-XSMP window identification. */
+ gchar *wm_command;
/*! The application that created the window */
gchar *name;
@@ -164,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.
@@ -213,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;
@@ -287,57 +287,47 @@ 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;
};
-struct _ObAppSettings
-{
- gchar *class;
- gchar *name;
- gchar *role;
-
- Point position;
- gboolean center_x;
- gboolean center_y;
- gboolean pos_given;
-
- guint desktop;
- gint shade;
- gint decor;
- gint focus;
- gint head;
- gint iconic;
- gint skip_pager;
- gint skip_taskbar;
- gint max_horz;
- gint max_vert;
- gint fullscreen;
-
- gint layer;
-};
-
-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);
-typedef void (*ObClientDestructor)(ObClient *client, gpointer data);
+typedef void (*ObClientCallback)(ObClient *client, gpointer data);
+
+/* Callback functions */
-void client_add_destructor(ObClientDestructor func, gpointer data);
-void client_remove_destructor(ObClientDestructor func);
+/*! Get notified when the client is unmanaged */
+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();
@@ -351,34 +341,59 @@ 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,\
+ 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, FALSE)
+ 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.
@@ -412,13 +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,
- gboolean force_reply);
-
-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
@@ -456,7 +468,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
@@ -471,6 +484,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);
@@ -482,14 +498,18 @@ 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. */
-void client_set_desktop(ObClient *self, guint target, gboolean donthide);
+ 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,
+ gboolean dontraise);
-/*! 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.
@@ -523,43 +543,31 @@ 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);
-/*! 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
@@ -582,28 +590,37 @@ void client_update_normal_hints(ObClient *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(ObClient *self);
/*! Updates the strut for the client */
void client_update_strut(ObClient *self);
/*! Updates the window's icons */
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);
+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.
@@ -622,6 +639,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.
@@ -641,10 +663,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);
@@ -661,23 +688,18 @@ 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);
-void client_update_sm_client_id(ObClient *self);
-
ObClient* client_under_pointer();
gboolean client_has_group_siblings(ObClient *self);
-gboolean client_has_application_group_siblings(ObClient *self);
+void clienticon_free(ObClientIcon *ci);
#endif