1 #include "openbox/actions.h"
2 #include "openbox/client.h"
5 gint layer; /*!< -1 for below, 0 for normal, and 1 for above */
10 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
11 static void free_func(gpointer options);
12 static gboolean run_func(ObActionsData *data, gpointer options);
14 void action_layer_startup()
16 actions_register("Layer",
23 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
28 o = g_new0(Options, 1);
31 if ((n = parse_find_node("layer", node))) {
32 gchar *s = parse_string(doc, n);
33 if (!g_ascii_strcasecmp(s, "above") ||
34 !g_ascii_strcasecmp(s, "top"))
36 else if (!g_ascii_strcasecmp(s, "below") ||
37 !g_ascii_strcasecmp(s, "bottom"))
39 else if (!g_ascii_strcasecmp(s, "normal") ||
40 !g_ascii_strcasecmp(s, "middle"))
44 if ((n = parse_find_node("state", node))) {
45 gchar *s = parse_string(doc, n);
46 if (g_ascii_strcasecmp(s, "toggle")) {
48 o->on = parse_bool(doc, n);
56 static void free_func(gpointer options)
63 /* Always return FALSE because its not interactive */
64 static gboolean run_func(ObActionsData *data, gpointer options)
69 ObClient *c = data->client;
71 actions_client_move(data, TRUE);
74 if (o->toggle || c->below != o->on)
75 client_set_layer(c, c->below ? 0 : -1);
77 else if (o->layer > 0) {
78 if (o->toggle || c->above != o->on)
79 client_set_layer(c, c->above ? 0 : 1);
82 if ((o->toggle || o->on) && (c->above || c->below))
83 client_set_layer(c, 0);
86 actions_client_move(data, FALSE);