From eea91b3fd21a9c4d855aef4fe40fb37ae30713e1 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Thu, 28 Feb 2008 04:40:25 +0100 Subject: [PATCH] Set a prop on locked windows, so panels can see it, and so it persists over restarts. --- obt/prop.c | 1 + obt/prop.h | 1 + openbox/actions/lock.c | 3 ++- openbox/client.c | 24 +++++++++++++++++++++++- openbox/client.h | 3 +++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/obt/prop.c b/obt/prop.c index ffd8afd8..205ce6cd 100644 --- a/obt/prop.c +++ b/obt/prop.c @@ -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); } diff --git a/obt/prop.h b/obt/prop.h index 924db52d..72226ec3 100644 --- a/obt/prop.h +++ b/obt/prop.h @@ -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, diff --git a/openbox/actions/lock.c b/openbox/actions/lock.c index bd139589..b5f93e07 100644 --- a/openbox/actions/lock.c +++ b/openbox/actions/lock.c @@ -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; } diff --git a/openbox/client.c b/openbox/client.c index 66006a48..ec702952 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -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 && diff --git a/openbox/client.h b/openbox/client.h index aadf9303..7d89c5ac 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -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); -- 2.34.1