Add Lock action.
authorMikael Magnusson <mikachu@comhem.se>
Sat, 23 Feb 2008 19:15:34 +0000 (20:15 +0100)
committerMikael Magnusson <mikachu@gmail.com>
Sat, 11 Oct 2014 00:17:19 +0000 (02:17 +0200)
Allows locking windows so you can't move/resize/close/etc them by mistake.

It's probably better to check in client.c than the actions, just
testing if I want it at all for now.

27 files changed:
Makefile.am
openbox/actions.c
openbox/actions.h
openbox/actions/all.c
openbox/actions/all.h
openbox/actions/close.c
openbox/actions/decorations.c
openbox/actions/desktop.c
openbox/actions/growtoedge.c
openbox/actions/iconify.c
openbox/actions/kill.c
openbox/actions/layer.c
openbox/actions/lock.c [new file with mode: 0644]
openbox/actions/lower.c
openbox/actions/maximize.c
openbox/actions/move.c
openbox/actions/moverelative.c
openbox/actions/moveresizeto.c
openbox/actions/movetoedge.c
openbox/actions/omnipresent.c
openbox/actions/raise.c
openbox/actions/raiselower.c
openbox/actions/resize.c
openbox/actions/resizerelative.c
openbox/actions/shade.c
openbox/client.h
openbox/client_menu.c

index f7b09dd90326eb5c22d86f4e7ca65e3de6fc7479..6005306ca5ad1c154a729b4aaa78c7fe3b395efc 100644 (file)
@@ -218,6 +218,7 @@ openbox_openbox_SOURCES = \
        openbox/actions/if.c \
        openbox/actions/kill.c \
        openbox/actions/layer.c \
+       openbox/actions/lock.c \
        openbox/actions/lower.c \
        openbox/actions/maximize.c \
        openbox/actions/move.c \
index bf00c6c83e227fff5599e9e608c902f5026b62a6..fa8ba24c305db006c5da89096d6d977b87dd3393 100644 (file)
@@ -502,3 +502,10 @@ void actions_client_move(ObActionsData *data, gboolean start)
             event_end_ignore_all_enters(ignore_start);
     }
 }
+
+gboolean actions_client_locked(ObActionsData *data)
+{
+    ObClient *c = data->client;
+
+    return c && c->locked;
+}
index f8e1ba83c42d867b2ad6ad10df18b4096f7b7c65..031c67fe219ff24a3dca2ba6b72a219c8a4d1536 100644 (file)
@@ -121,3 +121,5 @@ gboolean actions_interactive_input_event(XEvent *e);
 
 /*! Function for actions to call when they are moving a client around */
 void actions_client_move(ObActionsData *data, gboolean start);
+/*! May we do something to this client? */
+gboolean actions_client_locked(ObActionsData *data);
index d445706ebbfb0e6e6c2f530cf1c3afa6f1be4a68..95bae4453a4a23cd7647516ce19a2fddd53abbdf 100644 (file)
@@ -42,6 +42,7 @@ void action_all_startup(void)
     action_if_startup();
     action_focustobottom_startup();
     action_sendkeyevent_startup();
+    action_lock_startup();
     /* 3.4-compatibility */
     action_shadelowerraise_startup();
 }
index 2acff5210228ed632dc9b7305c80b239766f5876..ce57207c6b5a2fadb1cbedc9c5c4033eda6aa880 100644 (file)
@@ -43,6 +43,7 @@ void action_growtoedge_startup(void);
 void action_if_startup(void);
 void action_focustobottom_startup(void);
 void action_sendkeyevent_startup(void);
+void action_lock_startup(void);
 /* 3.4-compatibility */
 void action_shadelowerraise_startup(void);
 
index d2bc96c2166e424eacbb9c550f50d3f5bda332ce..0032ac0c03ddb49fd9dd8ed999587ab60a75e60a 100644 (file)
@@ -13,7 +13,8 @@ void action_close_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func(ObActionsData *data, gpointer options)
 {
-    if (data->client) client_close(data->client);
+    if (!actions_client_locked(data))
+        client_close(data->client);
 
     return FALSE;
 }
index f6fd2cbeb7762df6a5567a9459d959beefdc14fc..5d6ea13f3741ea306f20bd88f99c921ab40282ec 100644 (file)
@@ -15,7 +15,7 @@ void action_decorations_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func_on(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_set_undecorated(data->client, FALSE);
         actions_client_move(data, FALSE);
@@ -26,7 +26,7 @@ static gboolean run_func_on(ObActionsData *data, gpointer options)
 /* Always return FALSE because its not interactive */
 static gboolean run_func_off(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_set_undecorated(data->client, TRUE);
         actions_client_move(data, FALSE);
@@ -37,7 +37,7 @@ static gboolean run_func_off(ObActionsData *data, gpointer options)
 /* Always return FALSE because its not interactive */
 static gboolean run_func_toggle(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_set_undecorated(data->client, !data->client->undecorated);
         actions_client_move(data, FALSE);
index 8dadf550af3b2ea2787015be50528e48ce8c7a2d..87871440fc0c267f3d11a86e324434130f01fc52 100644 (file)
@@ -296,7 +296,9 @@ static gboolean run_func(ObActionsData *data, gpointer options)
         gboolean go = TRUE;
 
         actions_client_move(data, TRUE);
-        if (o->send && data->client && client_normal(data->client)) {
+        if (o->send && !actions_client_locked(data) &&
+            client_normal(data->client))
+        {
             client_set_desktop(data->client, d, o->follow, FALSE);
             go = o->follow;
         }
index acfbcfabde3545aee64443814990b670580db384..3a9943e877409d9e0a4117b27d0b2f77e2c3f8a0 100644 (file)
@@ -185,7 +185,8 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    if (!data->client)
+    if (!data->client ||
+        actions_client_locked(data))
         return FALSE;
 
     gboolean doing_vertical_resize =
index d1b754a25b5b65a4527c304836a2ee184a8a8fe0..2d1ca75172c9caabdfe974f8bae0137e5f9c8475 100644 (file)
@@ -25,7 +25,7 @@ static gpointer setup_func(xmlNodePtr node)
 /* Always return FALSE because its not interactive */
 static gboolean run_func(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_iconify(data->client, !options, FALSE, FALSE);
         actions_client_move(data, FALSE);
index b7d547b9d5b1ee6a07f87ceee94dcc5fe4ee7f97..0e52f6ed6076e1c2eb03af180145961920c87065 100644 (file)
@@ -13,7 +13,7 @@ void action_kill_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func(ObActionsData *data, gpointer options)
 {
-    if (data->client)
+    if (!actions_client_locked(data))
         client_kill(data->client);
 
     return FALSE;
index ed1eeedc0462c26ed22557edbeb39ef028b4c61e..7b53a6e60020e12cbba776285569c373d0e7ebee 100644 (file)
@@ -83,7 +83,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         ObClient *c = data->client;
 
         actions_client_move(data, TRUE);
diff --git a/openbox/actions/lock.c b/openbox/actions/lock.c
new file mode 100644 (file)
index 0000000..1271cbc
--- /dev/null
@@ -0,0 +1,17 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_lock_startup(void)
+{
+    actions_register("Lock", NULL, NULL, run_func);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client)
+        data->client->locked = !data->client->locked;
+    return FALSE;
+}
index 80ca6b8bcf9fc22c2d229e9f1b2cddb4c299769e..0ad2bb0d0f3539770c9689aecb7a15355fba0024 100644 (file)
@@ -14,7 +14,7 @@ void action_lower_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         stacking_lower(CLIENT_AS_WINDOW(data->client));
         actions_client_move(data, FALSE);
index db7c36bb8aaebb9fd9d47a7eea41768bb40d5662..61495ccf98dd7d3b26b8d91ec92e98e3aebf82ca 100644 (file)
@@ -79,7 +79,7 @@ static void free_func(gpointer o)
 static gboolean run_func_on(ObActionsData *data, gpointer options)
 {
     Options *o = options;
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_maximize(data->client, TRUE, o->dir);
         actions_client_move(data, FALSE);
@@ -91,7 +91,7 @@ static gboolean run_func_on(ObActionsData *data, gpointer options)
 static gboolean run_func_off(ObActionsData *data, gpointer options)
 {
     Options *o = options;
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_maximize(data->client, FALSE, o->dir);
         actions_client_move(data, FALSE);
@@ -103,7 +103,7 @@ static gboolean run_func_off(ObActionsData *data, gpointer options)
 static gboolean run_func_toggle(ObActionsData *data, gpointer options)
 {
     Options *o = options;
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         gboolean toggle;
         actions_client_move(data, TRUE);
         toggle = ((o->dir == HORZ && !data->client->max_horz) ||
index ba8372a584bb0ad50e21ff35397b04385dfe06e3..fa13d015b01f1af8b9d784e902088139d8245b96 100644 (file)
@@ -1,4 +1,5 @@
 #include "openbox/actions.h"
+#include "openbox/client.h"
 #include "openbox/moveresize.h"
 #include "obt/prop.h"
 
@@ -14,7 +15,7 @@ void action_move_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (data->client && !data->client->locked) {
         guint32 corner;
 
         corner = data->button != 0 ?
index b67b5cf1094d3c4fcf03c53726388014bb598a16..31b0a6d2cca5ecc69f0650da397abef86a12a879 100644 (file)
@@ -52,7 +52,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         ObClient *c;
         gint x, y, lw, lh, w, h;
 
index 95de0e98a5ede7bc7209722e6797bb56af72ddc3..2dbddd54944a2f32eb702e353f80459efcef6493 100644 (file)
@@ -99,7 +99,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         Rect *area, *carea;
         ObClient *c;
         guint mon, cmon;
index ef5b69201f54f8229cb0a4e7c0ffabe347569b93..278551792c9f56da2266cb4a12a902e919ec8ab2 100644 (file)
@@ -66,7 +66,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         gint x, y;
 
         client_find_move_directional(data->client, o->dir, &x, &y);
index 4309acc642231a0ee35f555af2108d060a2a9720..20233161d887a076f22da4bbbe5cd511a00b00e1 100644 (file)
@@ -12,7 +12,7 @@ void action_omnipresent_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func_toggle(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_set_desktop(data->client,
                            data->client->desktop == DESKTOP_ALL ?
index f6ac1452a43120cef1b12e41368985eb6fbe1ef3..04b86362643d546778906dda2aaf1fa3c79b0511 100644 (file)
@@ -12,7 +12,7 @@ void action_raise_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         stacking_raise(CLIENT_AS_WINDOW(data->client));
         actions_client_move(data, FALSE);
index dbe41d854028e7239c377e1cdb6f21aa410ded28..6cc937979dc7cad5b177e6240ed9519a4be88c09 100644 (file)
@@ -11,7 +11,7 @@ void action_raiselower_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         stacking_restack_request(data->client, NULL, Opposite);
         actions_client_move(data, FALSE);
index f6858d2d2046edf6667bb94aa319f05dd08ce534..260a422c7a03b99185dd1206cb3a6e016a69e951 100644 (file)
@@ -66,7 +66,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         ObClient *c = data->client;
         guint32 corner;
 
index 74a3bd745a08e1301da9a201307d395a60160d2e..b5da1f7373d444bfb65b76153c40791cb405f3fa 100644 (file)
@@ -64,7 +64,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
 {
     Options *o = options;
 
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         ObClient *c = data->client;
         gint x, y, ow, xoff, nw, oh, yoff, nh, lw, lh;
         gint left = o->left, right = o->right, top = o->top, bottom = o->bottom;
index 502781dd9e34a58739d16d8a66b9ccc38d518776..255d508fdebe44584a082e19c712419973883f7a 100644 (file)
@@ -15,7 +15,7 @@ void action_shade_startup(void)
 /* Always return FALSE because its not interactive */
 static gboolean run_func_on(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_shade(data->client, TRUE);
         actions_client_move(data, FALSE);
@@ -26,7 +26,7 @@ static gboolean run_func_on(ObActionsData *data, gpointer options)
 /* Always return FALSE because its not interactive */
 static gboolean run_func_off(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_shade(data->client, FALSE);
         actions_client_move(data, FALSE);
@@ -37,7 +37,7 @@ static gboolean run_func_off(ObActionsData *data, gpointer options)
 /* Always return FALSE because its not interactive */
 static gboolean run_func_toggle(ObActionsData *data, gpointer options)
 {
-    if (data->client) {
+    if (!actions_client_locked(data)) {
         actions_client_move(data, TRUE);
         client_shade(data->client, !data->client->shaded);
         actions_client_move(data, FALSE);
index 11a014000dfae1a6f31694707a23ddcc3a2881d5..d7e4040811a9d6513eb7fe801257b3d61fccb21f 100644 (file)
@@ -308,6 +308,9 @@ struct _ObClient
     */
     guint functions;
 
+    /*! Prevent window from being accidentally acted upon */
+    gboolean locked;
+
     /* The window's icon, in a variety of shapes and sizes */
     RrImage *icon_set;
 
index c6cdd63557d56a2506fb789ce1e20538d12d8e42..f34c8ef3f85f9408815a28cac562bddc26da74e0 100644 (file)
@@ -121,6 +121,9 @@ static void client_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
     if (!c)
         return;
 
+    if (c->locked)
+        return;
+
     if (!config_focus_under_mouse)
         ignore_start = event_start_ignore_all_enters();
 
@@ -218,6 +221,9 @@ static void layer_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
 
     g_assert(c);
 
+    if (c->locked)
+        return;
+
     if (!config_focus_under_mouse)
         ignore_start = event_start_ignore_all_enters();
 
@@ -290,6 +296,9 @@ static void send_to_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
 {
     g_assert(c);
 
+    if (c->locked)
+        return;
+
     client_set_desktop(c, e->id, FALSE, FALSE);
     if (f && c->desktop != screen_desktop && c->desktop != DESKTOP_ALL)
         /* the client won't even be on the screen anymore, so hide the menu */