Allow client destroy notify functions to be removed based on the data associated...
[dana/openbox.git] / openbox / client.h
index 832405c..18c88ec 100644 (file)
@@ -25,7 +25,7 @@
 #include "geom.h"
 #include "stacking.h"
 #include "window.h"
-#include "render/color.h"
+#include "obrender/color.h"
 
 #include <glib.h>
 #include <X11/Xlib.h>
@@ -73,6 +73,7 @@ struct _ObClient
 {
     ObWindow obwin;
     Window  window;
+    gboolean managed;
 
     /*! If this client is managing an ObPrompt window, then this is set to the
       prompt */
@@ -146,6 +147,9 @@ struct _ObClient
     Rect pre_max_area;
     /*! Position and size of the window prior to being fullscreened */
     Rect pre_fullscreen_area;
+    /*! Remember if the window was maximized before going fullscreen */
+    gboolean pre_fullscreen_max_horz,
+             pre_fullscreen_max_vert;
 
     /*! The window's strut
       The strut defines areas of the screen that are marked off-bounds for
@@ -322,16 +326,15 @@ typedef void (*ObClientCallback)(ObClient *client, gpointer data);
 /*! Get notified when the client is unmanaged */
 void client_add_destroy_notify(ObClientCallback func, gpointer data);
 void client_remove_destroy_notify(ObClientCallback func);
+void client_remove_destroy_notify_data(ObClientCallback func, gpointer data);
 
-/*! Manages all existing windows */
-void client_manage_all();
 /*! Manages a given window
   @param prompt This specifies an ObPrompt which is being managed.  It is
                 possible to manage Openbox-owned windows through this.
 */
 void client_manage(Window win, struct _ObPrompt *prompt);
 /*! Unmanages all managed windows */
-void client_unmanage_all();
+void client_unmanage_all(void);
 /*! Unmanages a given client */
 void client_unmanage(ObClient *client);
 
@@ -344,7 +347,7 @@ ObClient *client_fake_manage(Window win);
 void client_fake_unmanage(ObClient *self);
 
 /*! Sets the client list on the root window from the client_list */
-void client_set_list();
+void client_set_list(void);
 
 /*! Determines if the client should be shown or hidden currently.
   @return TRUE if it should be visible; otherwise, FALSE.
@@ -488,6 +491,11 @@ void client_find_resize_directional(ObClient *self, ObDirection side,
 */
 void client_fullscreen(ObClient *self, gboolean fs);
 
+/*! Determine if the window, using the given client-area, would be considered
+  as an "oldschool fullscreen" window, that is, if it is filling a whole
+  monitor. */
+gboolean client_is_oldfullscreen(const ObClient const *self, const Rect *area);
+
 /*! Iconifies or uniconifies the client window
   @param iconic true if the window should be iconified; false if it should be
                 restored.
@@ -575,15 +583,18 @@ 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 desktop If true, and the window is on another desktop, it will still
+                 be activated.
+  @param here If true, and the window is on another desktop, it will be moved
+              to the current desktop, otherwise the desktop will switch to
+              where the window is.
   @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 raise,
-                     gboolean unshade, gboolean user);
+void client_activate(ObClient *self, gboolean desktop, gboolean here,
+                     gboolean raise, gboolean unshade, gboolean user);
 
 /*! Bring all of its helper windows to its desktop. These are the utility and
   stuff windows. */
@@ -606,6 +617,8 @@ void client_update_sync_request_counter(ObClient *self);
 #endif
 /*! Updates the window's colormap */
 void client_update_colormap(ObClient *self, Colormap colormap);
+/*! Updates the requested opacity for the window from the client. */
+void client_update_opacity(ObClient *self);
 /*! Updates the WMNormalHints and adjusts things if they change */
 void client_update_normal_hints(ObClient *self);
 
@@ -647,6 +660,10 @@ RrImage* client_icon(ObClient *self);
   transient for */
 gboolean client_has_parent(ObClient *self);
 
+/*! Return TRUE if the client has some transient children, and FALSE otherwise.
+*/
+gboolean client_has_children(ObClient *self);
+
 /*! Searches a client's immediate parents for a focused window. The function
   does not check for the passed client, only for *ONE LEVEL* of its parents.
   If no focused parent is found, NULL is returned.
@@ -727,10 +744,15 @@ void client_set_layer(ObClient *self, gint layer);
 
 guint client_monitor(ObClient *self);
 
-ObClient* client_under_pointer();
+ObClient* client_under_pointer(void);
 
 gboolean client_has_group_siblings(ObClient *self);
 
+/*! Returns TRUE if the client has a transient child, a parent, or a
+  group member.  Returns FALSE otherwise.
+*/
+gboolean client_has_relative(ObClient *self);
+
 /*! Returns TRUE if the client is running on the same machine as Openbox */
 gboolean client_on_localhost(ObClient *self);