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@gmail.com>
Sun, 19 Sep 2010 15:55:02 +0000 (17:55 +0200)
obt/prop.c
obt/prop.h
openbox/actions/lock.c
openbox/client.c
openbox/client.h

index 693d4d2b544db13c8ca453deeb983259a176b8b3..fbe474b15194208812b6bcb97bb34f438dc54be4 100644 (file)
@@ -189,6 +189,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_VERSION);
     CREATE_(OB_APP_ROLE);
index 621376d22468a471a04dabd7cc0fd2fbe6af9c97..e791a1606f733b52e24bc6eb2a308ff91332783e 100644 (file)
@@ -207,6 +207,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 1271cbc8c18d93b1e428e6f69864d4b61d348919..4cea7722143afe071413f00de849f820b80ca127 100644 (file)
@@ -12,6 +12,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 e666d589eda3bfd512d7a5dacaf129035eb75cd8..a9ced8c4346b33a6b3458245e6851e610d72fa74 100644 (file)
@@ -1261,6 +1261,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);
@@ -2396,7 +2398,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;
@@ -2424,6 +2426,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)
@@ -3705,6 +3709,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;
@@ -3752,6 +3757,8 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
                 value = self->demands_attention;
             else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED))
                 value = undecorated;
+            else if (state == OBT_PROP_ATOM(OB_WM_STATE_LOCKED))
+                value = locked;
             else
                 g_assert_not_reached();
             action = value ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
@@ -3790,6 +3797,8 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
             demands_attention = value;
         } else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED)) {
             undecorated = value;
+        } else if (state == OBT_PROP_ATOM(OB_WM_STATE_LOCKED)) {
+            locked = value;
         }
     }
 
@@ -3818,6 +3827,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;
@@ -4038,6 +4049,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 046dbbdabeb07020e2729a02cbbae207eab58312..701078fe777030ef3803dfe6ef8034e2ccd235ba 100644 (file)
@@ -521,6 +521,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);