Add Lock action.
authorMikael Magnusson <mikachu@comhem.se>
Sat, 23 Feb 2008 19:15:34 +0000 (20:15 +0100)
committerMikael Magnusson <mikachu@gmail.com>
Sun, 19 Sep 2010 15:55:02 +0000 (17:55 +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 3becf4d25f47559c723a9dd7aac43d757b25788c..0cb7466a1ed869b52e24305033809b4ca7f79d5c 100644 (file)
@@ -204,6 +204,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 419f283153b4ff79d3ed220319d96a5f87457fd4..a6c205260104e3fca7adbcae3f78086526f2cf39 100644 (file)
@@ -466,3 +466,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 e03bc577742fd0eb92d03019c53061b1a3ea9393..78cf434886dc6d63a8c1afa1b9d7e1a662f44325 100644 (file)
@@ -117,3 +117,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 a3a1f6b9c121b00f6158a5ef42d14a1fb6681d7f..a9b9dcc21edc61f67547bcde2f22078ef9cbd7f6 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 d5a7bfdd9e8a30c476dcf2203c45aa8f189e3dc3..e131896ff2f5fff0940011e5ea6e5bd3dcbde87a 100644 (file)
@@ -111,6 +111,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
     gint half;
 
     if (!data->client ||
+        actions_client_locked(data) ||
         /* don't allow vertical resize if shaded */
         ((o->dir == OB_DIRECTION_NORTH || o->dir == OB_DIRECTION_SOUTH) &&
          data->client->shaded))
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 c23661cd401c2fd37645455456de69ba5f60e467..bc5a6a46bdcd1db00ba132d80fd0badbae2e1a2e 100644 (file)
@@ -93,7 +93,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 e32aff32d55e417888ae26985fcc7226f144a4bc..f618731cea9a3842c84482c97e0fc2e106f2bf52 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 47da397ada526e98aed8613580eda41a9a9a3010..046dbbdabeb07020e2729a02cbbae207eab58312 100644 (file)
@@ -304,6 +304,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 fd2549cfd941cef0f690453f0eebeb3ebaa4c632..e5bdbff0fa8762d908181bae18ac461224e66082 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 */