]> git.sur5r.net Git - i3/i3/commitdiff
Check if con_id exists in cmd_swap (#2898)
authorOrestis <orestisf1993@gmail.com>
Wed, 6 Sep 2017 05:34:14 +0000 (08:34 +0300)
committerMichael Stapelberg <stapelberg@users.noreply.github.com>
Wed, 6 Sep 2017 05:34:14 +0000 (07:34 +0200)
Also adds some testcases for swap using con_id.

Fixes #2895

include/con.h
src/commands.c
src/con.c
testcases/t/265-swap.t

index 0fa660a10ccd1cad7c55b5d77f3c39f731234036..1c7bb9322a3fa995ab7a0722ace0a3a3fc2e595a 100644 (file)
@@ -152,6 +152,13 @@ bool con_has_parent(Con *con, Con *parent);
  */
 Con *con_by_window_id(xcb_window_t window);
 
+/**
+ * Returns the container with the given container ID or NULL if no such
+ * container exists.
+ *
+ */
+Con *con_by_con_id(long target);
+
 /**
  * Returns the container with the given frame ID or NULL if no such container
  * exists.
index bbe7d2657b60e48b5ddaa3aeef56abf56873767a..faee3916ff03ea5e209890785d0bb872c1a87756 100644 (file)
@@ -1841,7 +1841,7 @@ void cmd_swap(I3_CMD, const char *mode, const char *arg) {
             return;
         }
 
-        con = (Con *)target;
+        con = con_by_con_id(target);
     } else if (strcmp(mode, "mark") == 0) {
         con = con_by_mark(arg);
     } else {
index cf923ec83ed6d4b3654d0f2502ab892bfe6f65c0..b520c110bb2530833a985c4f9aeba77b6b7df7f7 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -557,6 +557,22 @@ Con *con_by_window_id(xcb_window_t window) {
     return NULL;
 }
 
+/*
+ * Returns the container with the given container ID or NULL if no such
+ * container exists.
+ *
+ */
+Con *con_by_con_id(long target) {
+    Con *con;
+    TAILQ_FOREACH(con, &all_cons, all_cons) {
+        if (con == (Con *)target) {
+            return con;
+        }
+    }
+
+    return NULL;
+}
+
 /*
  * Returns the container with the given frame ID or NULL if no such container
  * exists.
index f86bba71ad918d0603bfb6add4633896f75591ed..e3c8e97c395ee6a4d5b0e5269372f771bba27f91 100644 (file)
@@ -32,6 +32,38 @@ my ($nodes, $expected_focus, $A, $B, $F);
 my ($result);
 my @urgent;
 
+###############################################################################
+# Invalid con_id should not crash i3
+# See issue #2895.
+###############################################################################
+
+$pid = launch_with_config($config);
+$ws = fresh_workspace;
+
+open_window;
+cmd "swap container with con_id 1";
+
+does_i3_live;
+exit_gracefully($pid);
+
+###############################################################################
+# Swap 2 windows in different workspaces using con_id
+###############################################################################
+
+$pid = launch_with_config($config);
+
+$ws = fresh_workspace;
+open_window;
+$A = get_focused($ws);
+
+$ws = fresh_workspace;
+open_window;
+
+cmd "swap container with con_id $A";
+is(get_focused($ws), $A, 'A is now focused');
+
+exit_gracefully($pid);
+
 ###############################################################################
 # Swap two containers next to each other.
 # Focus should stay on B because both windows are on the focused workspace.