]> Dogcows Code - chaz/openbox/commitdiff
add support for _NET_WM_ACTION_ABOVE and _NET_WM_ACTION_BELOW which aren't in the...
authorDana Jansens <danakj@orodu.net>
Sun, 13 May 2007 17:15:15 +0000 (17:15 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 13 May 2007 17:15:15 +0000 (17:15 +0000)
openbox/client.c
openbox/client.h
openbox/client_menu.c
openbox/prop.c
openbox/prop.h
openbox/screen.c

index 47f807d80adad7efe160cbbe886f01cab1e418b9..379342f48578efb074fcba9eba417f0fcd480cf7 100644 (file)
@@ -1594,7 +1594,9 @@ void client_setup_decor_and_functions(ObClient *self)
          OB_CLIENT_FUNC_ICONIFY |
          OB_CLIENT_FUNC_MAXIMIZE |
          OB_CLIENT_FUNC_SHADE |
-         OB_CLIENT_FUNC_CLOSE);
+         OB_CLIENT_FUNC_CLOSE |
+         OB_CLIENT_FUNC_BELOW |
+         OB_CLIENT_FUNC_ABOVE);
 
     if (!(self->min_size.width < self->max_size.width ||
           self->min_size.height < self->max_size.height))
@@ -1626,10 +1628,15 @@ void client_setup_decor_and_functions(ObClient *self)
         self->functions = OB_CLIENT_FUNC_MOVE;
 
     case OB_CLIENT_TYPE_DESKTOP:
-    case OB_CLIENT_TYPE_DOCK:
         /* these windows are not manipulated by the window manager */
         self->decorations = 0;
         self->functions = 0;
+
+    case OB_CLIENT_TYPE_DOCK:
+        /* these windows are not manipulated by the window manager, but they
+           can set below layer which has a special meaning */
+        self->decorations = 0;
+        self->functions = OB_CLIENT_FUNC_BELOW;
         break;
     }
 
@@ -1719,7 +1726,7 @@ void client_setup_decor_and_functions(ObClient *self)
 
 static void client_change_allowed_actions(ObClient *self)
 {
-    gulong actions[9];
+    gulong actions[11];
     gint num = 0;
 
     /* desktop windows are kept on all desktops */
@@ -1742,6 +1749,10 @@ static void client_change_allowed_actions(ObClient *self)
         actions[num++] = prop_atoms.net_wm_action_maximize_horz;
         actions[num++] = prop_atoms.net_wm_action_maximize_vert;
     }
+    if (self->functions & OB_CLIENT_FUNC_ABOVE)
+        actions[num++] = prop_atoms.net_wm_action_above;
+    if (self->functions & OB_CLIENT_FUNC_BELOW)
+        actions[num++] = prop_atoms.net_wm_action_below;
 
     PROP_SETA32(self->window, net_wm_allowed_actions, atom, actions, num);
 
index 351f063b911eb9d025d3b6aa23174bd51f27b0b4..c4815d4c83e0cfb56b796d5b4a7b771798caa215 100644 (file)
@@ -71,7 +71,9 @@ typedef enum
     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 */
+    OB_CLIENT_FUNC_CLOSE      = 1 << 6, /*!< Allow to be closed */
+    OB_CLIENT_FUNC_ABOVE      = 1 << 7, /*!< Allow to be put in lower layer */
+    OB_CLIENT_FUNC_BELOW      = 1 << 8  /*!< Allow to be put in higher layer */
 } ObFunctions;
 
 struct _ObClient
index 13a73d0554b149f16f0a45e4db95aa98b26e8bfa..499bb9128ad8375d8ce414731c3d43fca1cfee3f 100644 (file)
@@ -176,13 +176,13 @@ static gboolean layer_menu_update(ObMenuFrame *frame, gpointer data)
         if (e->type == OB_MENU_ENTRY_TYPE_NORMAL) {
             switch (e->id) {
             case LAYER_TOP:
-                *en = !c->above;
+                *en = !c->above && (c->functions & OB_CLIENT_FUNC_ABOVE);
                 break;
             case LAYER_NORMAL:
                 *en = c->above || c->below;
                 break;
             case LAYER_BOTTOM:
-                *en = !c->below;
+                *en = !c->below && (c->functions & OB_CLIENT_FUNC_BELOW);
                 break;
             default:
                 *en = TRUE;
index e055906879bb73fcf8c81fbfbd3e531f6ed847c1..5b611f2d417722e30c5fe05a795f27a795ed9039 100644 (file)
@@ -135,6 +135,9 @@ void prop_startup()
     CREATE(net_wm_action_fullscreen, "_NET_WM_ACTION_FULLSCREEN");
     CREATE(net_wm_action_change_desktop, "_NET_WM_ACTION_CHANGE_DESKTOP");
     CREATE(net_wm_action_close, "_NET_WM_ACTION_CLOSE");
+    CREATE(net_wm_action_above, "_NET_WM_ACTION_ABOVE");
+    CREATE(net_wm_action_below, "_NET_WM_ACTION_BELOW");
+
     CREATE(net_wm_state_modal, "_NET_WM_STATE_MODAL");
 /*    CREATE(net_wm_state_sticky, "_NET_WM_STATE_STICKY");*/
     CREATE(net_wm_state_maximized_vert, "_NET_WM_STATE_MAXIMIZED_VERT");
index d1d6a5169e027130fae4e59ba4702e82fcae8846..fffbfd4cc5836b1368a751846dd83367287f100a 100644 (file)
@@ -160,6 +160,8 @@ typedef struct Atoms {
     Atom net_wm_action_fullscreen;
     Atom net_wm_action_change_desktop;
     Atom net_wm_action_close;
+    Atom net_wm_action_above;
+    Atom net_wm_action_below;
 
     Atom net_wm_state_modal;
 /*    Atom net_wm_state_sticky;*/
index 73cc4f14b2bb253f852fc6726096a658fe2d420c..34935f47d6ddc245729e17a35de56aa12f404e35 100644 (file)
@@ -258,6 +258,8 @@ gboolean screen_annex(const gchar *program_name)
     supported[i++] = prop_atoms.net_wm_action_fullscreen;
     supported[i++] = prop_atoms.net_wm_action_change_desktop;
     supported[i++] = prop_atoms.net_wm_action_close;
+    supported[i++] = prop_atoms.net_wm_action_above;
+    supported[i++] = prop_atoms.net_wm_action_below;
     supported[i++] = prop_atoms.net_wm_state;
     supported[i++] = prop_atoms.net_wm_state_modal;
     supported[i++] = prop_atoms.net_wm_state_maximized_vert;
This page took 0.029531 seconds and 4 git commands to generate.