]> git.sur5r.net Git - i3/i3/commitdiff
cmd_focus_output: Avoid assertion crash
authorOrestis Floros <orestisf1993@gmail.com>
Thu, 21 Mar 2019 21:57:24 +0000 (23:57 +0200)
committerOrestis Floros <orestisf1993@gmail.com>
Fri, 22 Mar 2019 08:47:48 +0000 (10:47 +0200)
Happened when the command criteria didn't match any windows. For
example: `[con_mark=doesnotexist] focus output left`.

src/commands.c
testcases/t/502-focus-output.t

index b7fbce902f324836cab989ab2cfca3bd96e7fc5a..3cf5a57c480192806b2bb8c53b159941a210429f 100644 (file)
@@ -1626,24 +1626,18 @@ void cmd_open(I3_CMD) {
  *
  */
 void cmd_focus_output(I3_CMD, const char *name) {
  *
  */
 void cmd_focus_output(I3_CMD, const char *name) {
-    owindow *current;
-
-    DLOG("name = %s\n", name);
-
     HANDLE_EMPTY_MATCH;
 
     HANDLE_EMPTY_MATCH;
 
-    /* get the output */
-    Output *current_output = NULL;
-    Output *output;
-
-    TAILQ_FOREACH(current, &owindows, owindows)
-    current_output = get_output_for_con(current->con);
-    assert(current_output != NULL);
+    if (TAILQ_EMPTY(&owindows)) {
+        ysuccess(true);
+        return;
+    }
 
 
-    output = get_output_from_string(current_output, name);
+    Output *current_output = get_output_for_con(TAILQ_FIRST(&owindows)->con);
+    Output *output = get_output_from_string(current_output, name);
 
     if (!output) {
 
     if (!output) {
-        yerror("No such output found.");
+        yerror("Output %s not found.", name);
         return;
     }
 
         return;
     }
 
@@ -1658,7 +1652,6 @@ void cmd_focus_output(I3_CMD, const char *name) {
     workspace_show(ws);
 
     cmd_output->needs_tree_render = true;
     workspace_show(ws);
 
     cmd_output->needs_tree_render = true;
-    // XXX: default reply for now, make this a better reply
     ysuccess(true);
 }
 
     ysuccess(true);
 }
 
index 01d8db33bc341fa535b7ee3b8fdee93566f73ab6..118aba163de9183c8dc81077d94bfafadfa20b6c 100644 (file)
@@ -86,4 +86,33 @@ is(focused_output, 'fake-1', 'focus on second output');
 cmd 'focus output fake-0';
 is(focused_output, 'fake-0', 'focus on first output');
 
 cmd 'focus output fake-0';
 is(focused_output, 'fake-0', 'focus on first output');
 
+################################################################################
+# use 'focus output' with command criteria and verify that i3 does not crash
+# when they don't match any window
+################################################################################
+
+is(focused_output, 'fake-0', 'focus on first output');
+
+cmd '[con_mark=doesnotexist] focus output right';
+does_i3_live;
+is(focused_output, 'fake-0', 'focus remained on first output');
+
+################################################################################
+# use 'focus output' with command criteria and verify that focus gets changed
+# appropriately
+################################################################################
+
+is(focused_output, 'fake-0', 'focus on first output');
+
+my $window = open_window;
+
+cmd 'focus output right';
+is(focused_output, 'fake-1', 'focus on second output');
+
+cmd '[id= . ' . $window->id . '] focus output right';
+is(focused_output, 'fake-1', 'focus on second output after command with criteria');
+
+cmd 'focus output right';
+is(focused_output, 'fake-0', 'focus on first output after command without criteria');
+
 done_testing;
 done_testing;