summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-13 17:15:15 +0000
committerDana Jansens <danakj@orodu.net>2007-05-13 17:15:15 +0000
commit11df262d7eb56ae6af98af86cbfee8226107114d (patch)
treed01a30b3025aca83878b672d8df9c65d1e67ba5d
parent0ee1581824f4693884a6f0abde62d20642df82ed (diff)
add support for _NET_WM_ACTION_ABOVE and _NET_WM_ACTION_BELOW which aren't in the NETWM spec yet, but will be shortly.
-rw-r--r--openbox/client.c17
-rw-r--r--openbox/client.h4
-rw-r--r--openbox/client_menu.c4
-rw-r--r--openbox/prop.c3
-rw-r--r--openbox/prop.h2
-rw-r--r--openbox/screen.c2
6 files changed, 26 insertions, 6 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 47f807d8..379342f4 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -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);
diff --git a/openbox/client.h b/openbox/client.h
index 351f063b..c4815d4c 100644
--- a/openbox/client.h
+++ b/openbox/client.h
@@ -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
diff --git a/openbox/client_menu.c b/openbox/client_menu.c
index 13a73d05..499bb912 100644
--- a/openbox/client_menu.c
+++ b/openbox/client_menu.c
@@ -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;
diff --git a/openbox/prop.c b/openbox/prop.c
index e0559068..5b611f2d 100644
--- a/openbox/prop.c
+++ b/openbox/prop.c
@@ -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");
diff --git a/openbox/prop.h b/openbox/prop.h
index d1d6a516..fffbfd4c 100644
--- a/openbox/prop.h
+++ b/openbox/prop.h
@@ -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;*/
diff --git a/openbox/screen.c b/openbox/screen.c
index 73cc4f14..34935f47 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -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;