]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.h
add copyright headers, adjust --version output to include copyright, and --help outpu...
[chaz/openbox] / openbox / client.h
index b13cf06c3937de730f166fc546de032a7b78ebab..e1e8d29082057bf52189b83c06c8e439ca53559a 100644 (file)
@@ -1,3 +1,21 @@
+/* -*- indent-tabs-mode: t; 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,24 @@ 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;
 
     /*! 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 +149,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 +237,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 FALSE the client will not ever
+      be decorated.
     */
-    int disabled_decorations;
+    gboolean decorate;
 
-    /*! 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 +295,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 +322,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 +437,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);
@@ -444,9 +500,14 @@ ObClient *client_search_modal_child(ObClient *self);
 
 ObClient *client_search_top_transient(ObClient *self);
 
+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>
@@ -456,4 +517,6 @@ void client_set_layer(ObClient *self, int layer);
 
 guint client_monitor(ObClient *self);
 
+void client_update_sm_client_id(ObClient *self);
+
 #endif
This page took 0.028171 seconds and 4 git commands to generate.