client.h for the Openbox window manager
Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003 Ben Jansens
+ Copyright (c) 2003-2007 Dana Jansens
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/*! 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;
+ /*! 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;
*/
Rect area;
+ /*! Position of the client window relative to the root window */
+ Point root_pos;
+
/*! Position and size of the window prior to being maximized */
Rect pre_max_area;
/*! Position and size of the window prior to being fullscreened */
/*! Window decoration and functionality hints */
ObMwmHints mwmhints;
+
+ /*! The client's specified colormap */
+ Colormap colormap;
/*! Where to place the decorated window in relation to the undecorated
window */
/*! Notify the window when it receives focus? */
gboolean focus_notify;
+#ifdef SYNC
+ /*! The client wants to sync during resizes */
+ gboolean sync_request;
+ /*! The XSync counter used for synchronizing during resizes */
+ guint32 sync_counter;
+ /*! The value we're waiting for the counter to reach */
+ gulong sync_counter_value;
+#endif
+
/*! The window uses shape extension to be non-rectangular? */
gboolean shaped;
/*! Demands attention flag */
gboolean demands_attention;
+ /*! The urgent flag */
+ gboolean urgent;
+
/*! The layer in which the window will be stacked, windows in lower layers
are always below windows in higher layers. */
ObStackingLayer layer;
/*! The number of icons in icons */
guint nicons;
- guint32 user_time;
-};
+ /* Where the window should iconify to/from */
+ Rect icon_geometry;
-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;
+ guint32 user_time;
};
extern GList *client_list;
void client_startup(gboolean reconfig);
void client_shutdown(gboolean reconfig);
-typedef void (*ObClientDestructor)(ObClient *client, gpointer data);
+typedef void (*ObClientCallback)(ObClient *client, gpointer data);
-void client_add_destructor(ObClientDestructor func, gpointer data);
-void client_remove_destructor(ObClientDestructor func);
+/* 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);
/*! Manages all existing windows */
void client_manage_all();
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 focused */
gboolean client_focused(ObClient *self);
+/*! Convery a position/size from a given gravity to the client's true gravity
+ */
+void client_convert_gravity(ObClient *client, gint gravity, gint *x, gint *y,
+ gint w, gint h);
+
#define client_move(self, x, y) \
- client_configure(self, OB_CORNER_TOPLEFT, x, y, \
- self->area.width, self->area.height, \
+ client_configure(self, x, y, self->area.width, self->area.height, \
TRUE, TRUE)
#define client_resize(self, w, h) \
- client_configure(self, OB_CORNER_TOPLEFT, self->area.x, self->area.y, \
- w, h, TRUE, TRUE)
+ 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, OB_CORNER_TOPLEFT, x, y, w, h, TRUE, TRUE)
+ client_configure(self, x, y, w, h, TRUE, TRUE)
-#define client_configure(self, anchor, x, y, w, h, user, final) \
- client_configure_full(self, anchor, x, y, w, h, user, final, FALSE)
+#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.
These values are what client_configure_full will give the window.
- @param anchor The corner to keep in the same position when resizing.
@param x The x coordiante of the new position for the client.
@param y The y coordiante of the new position for the client.
@param w The width component of the new size for the client.
@param h The height component of the new size for the client.
@param logicalw Returns the width component of the new logical width.
+ This value is only returned when the new w or h calculated
+ differ from the ones passed in.
@param logicalh Returns the height component of the new logical height.
+ This value is only returned when the new w or h calculated
+ differ from the ones passed in.
@param user Specifies whether this is a user-requested change or a
program requested change. For program requested changes, the
constraints are not checked.
*/
-void client_try_configure(ObClient *self, ObCorner anchor,
- gint *x, gint *y, gint *w, gint *h,
+void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
gint *logicalw, gint *logicalh,
gboolean user);
/*! Move and/or resize the window.
This also maintains things like the client's minsize, and size increments.
- @param anchor The corner to keep in the same position when resizing.
@param x The x coordiante of the new position for the client.
@param y The y coordiante of the new position for the client.
@param w The width component of the new size for the client.
@param force_reply Send a ConfigureNotify to the client regardless of if
the position changed.
*/
-void client_configure_full(ObClient *self, ObCorner anchor,
- gint x, gint y, gint w, gint h,
+void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h,
gboolean user, gboolean final,
gboolean force_reply);
/*! 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 focus_nonintrusive If TRUE, the window will not be moved in the
+ focus order at all. Do this when moving windows to a desktop in
+ the "background" or something. It can be used to make a window share
+ multiple desktops. Generally this should be FALSE. */
+void client_set_desktop(ObClient *self, guint target,
+ gboolean donthide, gboolean focus_nonintrusive);
+
+/*! Show the client if it should be shown. */
+void 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, and hide it if it should be
hidden. This is for example, when switching desktops.
otherwise, the desktop is changed to where the client lives.
@param user If true, then a user action is what requested the activation;
otherwise, it means an application requested it on its own
- @param timestamp The time at which the activate was requested.
*/
-void client_activate(ObClient *self, gboolean here, gboolean user, Time time);
+void client_activate(ObClient *self, gboolean here, gboolean user);
+
+/*! Bring all of its non-application windows to its desktop. These are the
+ utility and stuff windows. */
+void client_bring_non_application_windows(ObClient *client);
/*! Calculates the stacking layer for the client window */
void client_calc_layer(ObClient *self);
/*! Update the protocols that the window supports and adjusts things if they
change */
void client_update_protocols(ObClient *self);
+#ifdef SYNC
+/*! Updates the window's sync request counter for resizes */
+void client_update_sync_request_counter(ObClient *self);
+#endif
+/*! Updates the window's colormap */
+void client_update_colormap(ObClient *self, Colormap colormap);
/*! Updates the WMNormalHints and adjusts things if they change */
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, gboolean new_event);
+void client_update_user_time(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).
*/
GSList *client_search_all_top_parents(ObClient *self);
+/*! Returns a list of top-level windows which this is a transient for, and
+ which are in the same layer as this client.
+ It will only contain more than 1 element if the client is transient for its
+ group.
+*/
+GSList *client_search_all_top_parents_layer(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_parent(ObClient *self);
+ObClient *client_search_top_normal_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);
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" client in the given direction */
-ObClient *client_find_directional(ObClient *c, ObDirection dir);
-
/*! Return the closest edge in the given direction */
gint client_directional_edge_search(ObClient *c, ObDirection dir, gboolean hang);
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);
+
#endif