*
*/
void cmd_focus_output(I3_CMD, const char *name) {
- owindow *current;
-
- DLOG("name = %s\n", name);
-
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) {
- yerror("No such output found.");
+ yerror("Output %s not found.", name);
return;
}
workspace_show(ws);
cmd_output->needs_tree_render = true;
- // XXX: default reply for now, make this a better reply
ysuccess(true);
}
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;