]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.h
add a NONE user action, for internal stuff, ie running actions without direct user...
[chaz/openbox] / openbox / client.h
index b13cf06c3937de730f166fc546de032a7b78ebab..0c523debeabdf8f4490fdbfa4806cdd6f878f4d3 100644 (file)
@@ -1,3 +1,21 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   client.h for the Openbox window manager
+   Copyright (c) 2003        Ben 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
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
 #ifndef __client_h
 #define __client_h
 
 #include <glib.h>
 #include <X11/Xlib.h>
 
-struct Frame;
-struct Group;
+struct _ObFrame;
+struct _ObGroup;
+struct _ObSessionState;
 
 typedef struct _ObClient     ObClient;
 typedef struct _ObClientIcon ObClientIcon;
 
 /* The value in client.transient_for indicating it is a transient for its
    group instead of for a single window */
-#define TRAN_GROUP ((void*)~0l)
+#define OB_TRAN_GROUP ((void*)~0l)
 
 /*! Holds an icon in ARGB format */
 struct _ObClientIcon
@@ -29,42 +48,29 @@ struct _ObClientIcon
 };
      
 /*! Possible window types */
-typedef enum {
-    Type_Desktop, /*!< A desktop (bottom-most window) */
-    Type_Dock,    /*!< A dock bar/panel window */
-    Type_Toolbar, /*!< A toolbar window, pulled off an app */
-    Type_Menu,    /*!< An unpinned menu from an app */
-    Type_Utility, /*!< A small utility window such as a palette */
-    Type_Splash,  /*!< A splash screen window */
-    Type_Dialog,  /*!< A dialog window */
-    Type_Normal   /*!< A normal application window */
-} WindowType;
+typedef enum
+{
+    OB_CLIENT_TYPE_DESKTOP, /*!< A desktop (bottom-most window) */
+    OB_CLIENT_TYPE_DOCK,    /*!< A dock bar/panel window */
+    OB_CLIENT_TYPE_TOOLBAR, /*!< A toolbar window, pulled off an app */
+    OB_CLIENT_TYPE_MENU,    /*!< An unpinned menu from an app */
+    OB_CLIENT_TYPE_UTILITY, /*!< A small utility window such as a palette */
+    OB_CLIENT_TYPE_SPLASH,  /*!< A splash screen window */
+    OB_CLIENT_TYPE_DIALOG,  /*!< A dialog window */
+    OB_CLIENT_TYPE_NORMAL   /*!< A normal application window */
+} ObClientType;
 
 /*! The things the user can do to the client window */
-typedef enum {
-    Func_Resize     = 1 << 0, /*!< Allow resizing */
-    Func_Move       = 1 << 1, /*!< Allow moving */
-    Func_Iconify    = 1 << 2, /*!< Allow to be iconified */
-    Func_Maximize   = 1 << 3, /*!< Allow to be maximized */
-    Func_Shade      = 1 << 4, /*!< Allow to be shaded */
-    Func_Fullscreen = 1 << 5, /*!< Allow to be made fullscreen */
-    Func_Close      = 1 << 6  /*!< Allow to be closed */
-} Function;
-
-/*! The decorations the client window wants to be displayed on it */
-typedef enum {
-    Decor_Titlebar    = 1 << 0, /*!< Display a titlebar */
-    Decor_Handle      = 1 << 1, /*!< Display a handle (bottom) */
-    Decor_Border      = 1 << 2, /*!< Display a border */
-    Decor_Icon        = 1 << 3, /*!< Display the window's icon */
-    Decor_Iconify     = 1 << 4, /*!< Display an iconify button */
-    Decor_Maximize    = 1 << 5, /*!< Display a maximize button */
-    /*! Display a button to toggle the window's placement on
-      all desktops */
-    Decor_AllDesktops = 1 << 6,
-    Decor_Shade       = 1 << 7, /*!< Displays a shade button */
-    Decor_Close       = 1 << 8  /*!< Display a close button */
-} Decoration;
+typedef enum
+{
+    OB_CLIENT_FUNC_RESIZE     = 1 << 0, /*!< Allow user resizing */
+    OB_CLIENT_FUNC_MOVE       = 1 << 1, /*!< Allow user moving */
+    OB_CLIENT_FUNC_ICONIFY    = 1 << 2, /*!< Allow to be iconified */
+    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 */
+} ObFunctions;
 
 struct _ObClient
 {
@@ -73,20 +79,24 @@ struct _ObClient
     Window  window;
 
     /*! The window's decorations. NULL while the window is being managed! */
-    struct Frame *frame;
+    struct _ObFrame *frame;
 
     /*! The number of unmap events to ignore on the window */
     int ignore_unmaps;
 
     /*! The id of the group the window belongs to */
-    struct Group *group;
+    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. */
     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 Group, and is not a valid pointer to be followed in this
+      members of its ObGroup, and is not a valid pointer to be followed in this
       case.
      */
     ObClient *transient_for;
@@ -96,6 +106,10 @@ struct _ObClient
       desktops) */
     guint desktop;
 
+    /*! The startup id for the startup-notification protocol. This will be
+      NULL if a startup id is not set. */
+    gchar *startup_id;
+
     /*! Normal window title */
     gchar *title;
     /*! The count for the title. When another window with the same title
@@ -110,22 +124,29 @@ struct _ObClient
     gchar *class;
     /*! The specified role of the window, used for identification */
     gchar *role;
+    /*! The session client id for the window. *This can be NULL!* */
+    gchar *sm_client_id;
 
     /*! The type of window (what its function is) */
-    WindowType type;
+    ObClientType type;
 
     /*! Position and size of the window
       This will not always be the actual position of the window on screen, it
       is, rather, the position requested by the client, to which the window's
       gravity is applied.
     */
-    Rect    area;
+    Rect area;
+
+    /*! Position and size of the window prior to being maximized */
+    Rect pre_max_area;
+    /*! Position and size of the window prior to being fullscreened */
+    Rect pre_fullscreen_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
@@ -133,7 +154,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,
@@ -221,35 +242,38 @@ struct _ObClient
 
     /*! The layer in which the window will be stacked, windows in lower layers
       are always below windows in higher layers. */
-    StackLayer layer;
+    ObStackingLayer layer;
 
-    /*! A bitmask of values in the Decoration enum
+    /*! A bitmask of values in the ObFrameDecorations enum
       The values in the variable are the decorations that the client wants to
       be displayed around it.
     */
-    int decorations;
+    guint decorations;
 
-    /*! A bitmask of values in the Decoration enum.
-      Specifies the decorations that should NOT be displayed on the client.
+    /*! A user option. When this is set to TRUE the client will not ever
+      be decorated.
     */
-    int disabled_decorations;
+    gboolean undecorated;
 
-    /*! A bitmask of values in the Function enum
+    /*! A bitmask of values in the ObFunctions enum
       The values in the variable specify the ways in which the user is allowed
       to modify this window.
     */
-    int functions;
+    guint functions;
 
     /*! Icons for the client as specified on the client window */
     ObClientIcon *icons;
     /*! The number of icons in icons */
-    int nicons;
+    guint nicons;
 };
 
 extern GList *client_list;
 
-void client_startup();
-void client_shutdown();
+void client_startup(gboolean reconfig);
+void client_shutdown(gboolean reconfig);
+
+void client_add_destructor(GDestroyNotify func);
+void client_remove_destructor(GDestroyNotify func);
 
 /*! Manages all existing windows */
 void client_manage_all();
@@ -276,6 +300,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.
@@ -290,17 +327,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
@@ -384,8 +442,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);
@@ -424,6 +485,12 @@ void client_get_type(ObClient *self);
 
 ObClientIcon *client_icon(ObClient *self, int w, int h);
 
+/*! 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.
+*/
+ObClient *client_search_focus_parent(ObClient *self);
+
 /*! Searches a client's transients for a focused window. The function does not
   check for the passed client, only for its transients.
   If no focused transient is found, NULL is returned.
@@ -444,9 +511,20 @@ ObClient *client_search_modal_child(ObClient *self);
 
 ObClient *client_search_top_transient(ObClient *self);
 
+/*! Search for a parent of a client. This only searches up *ONE LEVEL*, and
+  returns the searched for parent if it is a parent, or NULL if not. */
+ObClient *client_search_parent(ObClient *self, ObClient *search);
+
+/*! Search for a transient of a client. The transient is returned if it is one,
+  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 */
+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.<br>
          = 0 indicates the client should be placed with other clients.<br>
@@ -454,6 +532,13 @@ ObClient *client_find_directional(ObClient *c, ObDirection dir);
 */
 void client_set_layer(ObClient *self, int 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();
+
 #endif
This page took 0.035969 seconds and 4 git commands to generate.