X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=inline;f=openbox%2Fclient.h;h=b28acab2dbe77aca7999128c095142b840c7232b;hb=3b2b0998fccb395f0ed83230ac640d9fec315151;hp=7001765f60b0e830c3ea86d0afdb1b49e0bb5ab5;hpb=11cde9683d8d722d34c8b730d6bdd73fe73b080b;p=chaz%2Fopenbox
diff --git a/openbox/client.h b/openbox/client.h
index 7001765f..b28acab2 100644
--- a/openbox/client.h
+++ b/openbox/client.h
@@ -12,6 +12,7 @@
struct _ObFrame;
struct _ObGroup;
+struct _ObSessionState;
typedef struct _ObClient ObClient;
typedef struct _ObClientIcon ObClientIcon;
@@ -67,6 +68,10 @@ struct _ObClient
/*! The id of the group the window belongs to */
struct _ObGroup *group;
+
+ /*! 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. */
@@ -106,13 +111,13 @@ struct _ObClient
is, rather, the position requested by the client, to which the window's
gravity is applied.
*/
- Rect area;
+ Rect area;
/*! The window's strut
The strut defines areas of the screen that are marked off-bounds for
window placement. In theory, where this window exists.
*/
- Strut strut;
+ StrutPartial strut;
/*! The logical size of the window
The "logical" size of the window is refers to the user's perception of
@@ -120,7 +125,7 @@ struct _ObClient
user. For example, with xterms, this value it the number of characters
being displayed in the terminal, instead of the number of pixels.
*/
- Size logical_size;
+ Size logical_size;
/*! Width of the border on the window.
The window manager will set this to 0 while the window is being managed,
@@ -238,6 +243,11 @@ extern GList *client_list;
void client_startup();
void client_shutdown();
+typedef void (*ObClientDestructorFunc)(ObClient *c);
+
+void client_add_destructor(ObClientDestructorFunc func);
+void client_remove_destructor(ObClientDestructorFunc func);
+
/*! Manages all existing windows */
void client_manage_all();
/*! Manages a given window */
@@ -263,6 +273,19 @@ gboolean client_normal(ObClient *self);
/* Returns if the window is focused */
gboolean client_focused(ObClient *self);
+#define client_move(self, x, y) \
+ client_configure(self, OB_CORNER_TOPLEFT, 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)
+#define client_move_resize(self, x, y, w, h) \
+ client_configure(self, OB_CORNER_TOPLEFT, 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)
+
/*! 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.
@@ -277,17 +300,38 @@ gboolean client_focused(ObClient *self);
configuration. e.g. Final should be FALSE if doing an
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.
*/
-void client_configure(ObClient *self, ObCorner anchor,
- int x, int y, int w, int h,
- gboolean user, gboolean final);
+void client_configure_full(ObClient *self, ObCorner anchor,
+ int x, int y, int w, int h,
+ gboolean user, gboolean final,
+ gboolean force_reply);
void client_reconfigure(ObClient *self);
+/*! Finds coordinates to keep a client on the screen.
+ @param self The client
+ @param x The x coord of the client, may be changed.
+ @param y The y coord of the client, may be changed.
+ @param w The width of the client.
+ @param w The height of the client.
+ @param rude Be rude about it. If false, it is only moved if it is entirely
+ not visible. If true, then make sure the window is inside the
+ struts if possible.
+ @return true if the client was moved to be on-screen; false if not.
+*/
+gboolean client_find_onscreen(ObClient *self, int *x, int *y, int w, int h,
+ gboolean rude);
+
/*! Moves a client so that it is on screen if it is entirely out of the
viewable screen.
+ @param self The client to move
+ @param rude Be rude about it. If false, it is only moved if it is entirely
+ not visible. If true, then make sure the window is inside the
+ struts if possible.
*/
-void client_move_onscreen(ObClient *self);
+void client_move_onscreen(ObClient *self, gboolean rude);
/*! Fullscreen's or unfullscreen's the client window
@param fs true if the window should be made fullscreen; false if it should
@@ -371,8 +415,11 @@ gboolean client_focus(ObClient *self);
void client_unfocus(ObClient *self);
/*! Activates the client for use, focusing, uniconifying it, etc. To be used
- when the user deliberately selects a window for use. */
-void client_activate(ObClient *self);
+ 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.
+*/
+void client_activate(ObClient *self, gboolean here);
/*! Calculates the stacking layer for the client window */
void client_calc_layer(ObClient *self);
@@ -436,6 +483,9 @@ 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 */
+int client_directional_edge_search(ObClient *c, ObDirection dir);
+
/*! 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.
@@ -445,4 +495,6 @@ void client_set_layer(ObClient *self, int layer);
guint client_monitor(ObClient *self);
+gchar* client_get_sm_client_id(ObClient *self);
+
#endif