Set a prop on locked windows, so panels can see it, and so it persists over restarts.
authorMikael Magnusson <mikachu@comhem.se>
Thu, 28 Feb 2008 03:40:25 +0000 (04:40 +0100)
committerMikael Magnusson <mikachu@comhem.se>
Sat, 8 Mar 2008 16:24:08 +0000 (17:24 +0100)
obt/prop.c
obt/prop.h
openbox/actions/lock.c
openbox/client.c
openbox/client.h

index ffd8afd8f9201961c3697374c6337c695e28c6f8..205ce6cda549a984033499d1f7d5f53f52084bfd 100644 (file)
@@ -188,6 +188,7 @@ void obt_prop_startup(void)
     CREATE_(OB_CONFIG_FILE);
     CREATE_(OB_WM_ACTION_UNDECORATE);
     CREATE_(OB_WM_STATE_UNDECORATED);
+    CREATE_(OB_WM_STATE_LOCKED);
     CREATE_(OB_CONTROL);
     CREATE_(OB_TARGET_WINDOW);
 }
index 924db52df51cdf72410488d17902ac6a157de737..72226ec3a4729f97125a8dcf771334c1157cb8fb 100644 (file)
@@ -206,6 +206,7 @@ typedef enum {
 
     OBT_PROP_OB_WM_ACTION_UNDECORATE,
     OBT_PROP_OB_WM_STATE_UNDECORATED,
+    OBT_PROP_OB_WM_STATE_LOCKED,
     OBT_PROP_OPENBOX_PID, /* this is depreecated in favour of ob_control */
     OBT_PROP_OB_THEME,
     OBT_PROP_OB_CONFIG_FILE,
index bd1395891ec64a6104d678ed09fc9d819a369591..b5f93e0703bd0c1d9e4d1e8def10d6285e4d9573 100644 (file)
@@ -13,6 +13,7 @@ void action_lock_startup(void)
 static gboolean run_func(ObActionsData *data, gpointer options)
 {
     if (data->client)
-        data->client->locked = !data->client->locked;
+        client_set_locked(data->client, !data->client->locked);
+
     return FALSE;
 }
index 66006a48917571f8758fa9cab3fa2c36ccda9a75..ec70295234137078f5aa1c5f2034017d64a4c712 100644 (file)
@@ -1205,6 +1205,8 @@ static void client_get_state(ObClient *self)
                 self->demands_attention = TRUE;
             else if (state[i] == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED))
                 self->undecorated = TRUE;
+            else if (state[i] == OBT_PROP_ATOM(OB_WM_STATE_LOCKED))
+                self->locked = TRUE;
         }
 
         g_free(state);
@@ -2298,7 +2300,7 @@ static void client_change_wm_state(ObClient *self)
 
 static void client_change_state(ObClient *self)
 {
-    gulong netstate[12];
+    gulong netstate[13];
     guint num;
 
     num = 0;
@@ -2326,6 +2328,8 @@ static void client_change_state(ObClient *self)
         netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_DEMANDS_ATTENTION);
     if (self->undecorated)
         netstate[num++] = OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED);
+    if (self->locked)
+        netstate[num++] = OBT_PROP_ATOM(OB_WM_STATE_LOCKED);
     OBT_PROP_SETA32(self->window, NET_WM_STATE, ATOM, netstate, num);
 
     if (self->frame)
@@ -3515,6 +3519,7 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
     gboolean shaded = self->shaded;
     gboolean fullscreen = self->fullscreen;
     gboolean undecorated = self->undecorated;
+    gboolean locked = self->locked;
     gboolean max_horz = self->max_horz;
     gboolean max_vert = self->max_vert;
     gboolean modal = self->modal;
@@ -3578,6 +3583,9 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
             else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED))
                 action = undecorated ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
                     OBT_PROP_ATOM(NET_WM_STATE_ADD);
+            else if (state == OBT_PROP_ATOM(OB_WM_STATE_LOCKED))
+                action = locked ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
+                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
         }
 
         if (action == OBT_PROP_ATOM(NET_WM_STATE_ADD)) {
@@ -3607,6 +3615,8 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
                 demands_attention = TRUE;
             } else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED)) {
                 undecorated = TRUE;
+            } else if (state == OBT_PROP_ATOM(OB_WM_STATE_LOCKED)) {
+                locked = TRUE;
             }
 
         } else { /* action == OBT_PROP_ATOM(NET_WM_STATE_REMOVE) */
@@ -3634,6 +3644,8 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
                 demands_attention = FALSE;
             } else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED)) {
                 undecorated = FALSE;
+            } else if (state == OBT_PROP_ATOM(OB_WM_STATE_LOCKED)) {
+                locked = FALSE;
             }
         }
     }
@@ -3663,6 +3675,8 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
         client_shade(self, shaded);
     if (undecorated != self->undecorated)
         client_set_undecorated(self, undecorated);
+    if (locked != self->locked)
+        client_set_locked(self, locked);
     if (above != self->above || below != self->below) {
         self->above = above;
         self->below = below;
@@ -3873,6 +3887,14 @@ void client_set_layer(ObClient *self, gint layer)
     client_change_state(self); /* reflect this in the state hints */
 }
 
+void client_set_locked(ObClient *self, gboolean locked)
+{
+    if (self->locked != locked) {
+        self->locked = locked;
+        client_change_state(self);
+    }
+}
+
 void client_set_undecorated(ObClient *self, gboolean undecorated)
 {
     if (self->undecorated != undecorated &&
index aadf930308d9fe71e3ebe32d0590df4e57f0d150..7d89c5acec29bd8701d4d2c3b90131858072186f 100644 (file)
@@ -510,6 +510,9 @@ void client_maximize(ObClient *self, gboolean max, gint dir);
 */
 void client_shade(ObClient *self, gboolean shade);
 
+/*! Set a client window to be locked or not */
+void client_set_locked(ObClient *self, gboolean locked);
+
 /*! Set a client window to have decorations or not */
 void client_set_undecorated(ObClient *self, gboolean undecorated);