*/
void con_focus(Con *con);
+/**
+ * Closes the given container.
+ *
+ */
+void con_close(Con *con, kill_window_t kill_window);
+
/**
* Returns true when this node is a leaf node (has no children)
*
*/
void tree_render(void);
-/**
- * Closes the current container using tree_close_internal().
- *
- */
-void tree_close_con(kill_window_t kill_window);
-
/**
* Changes focus in the given way (next/previous) and given orientation
* (horizontal/vertical).
void cmd_kill(I3_CMD, const char *kill_mode_str) {
if (kill_mode_str == NULL)
kill_mode_str = "window";
- owindow *current;
DLOG("kill_mode=%s\n", kill_mode_str);
return;
}
- HANDLE_INVALID_MATCH;
+ HANDLE_EMPTY_MATCH;
- /* check if the match is empty, not if the result is empty */
- if (match_is_empty(current_match))
- tree_close_con(kill_mode);
- else {
- TAILQ_FOREACH(current, &owindows, owindows) {
- DLOG("matching: %p / %s\n", current->con, current->con->name);
- tree_close_internal(current->con, kill_mode, false, false);
- }
+ owindow *current;
+ TAILQ_FOREACH(current, &owindows, owindows) {
+ con_close(current->con, kill_mode);
}
cmd_output->needs_tree_render = true;
}
}
+/*
+ * Closes the given container.
+ *
+ */
+void con_close(Con *con, kill_window_t kill_window) {
+ assert(con != NULL);
+ DLOG("Closing con = %p.\n", con);
+
+ /* We never close output or root containers. */
+ if (con->type == CT_OUTPUT || con->type == CT_ROOT) {
+ DLOG("con = %p is of type %d, not closing anything.\n", con, con->type);
+ return;
+ }
+
+ if (con->type == CT_WORKSPACE) {
+ DLOG("con = %p is a workspace, closing all children instead.\n", con);
+ Con *child, *nextchild;
+ for (child = TAILQ_FIRST(&(con->focus_head)); child;) {
+ nextchild = TAILQ_NEXT(child, focused);
+ DLOG("killing child = %p.\n", child);
+ tree_close_internal(child, kill_window, false, false);
+ child = nextchild;
+ }
+
+ return;
+ }
+
+ tree_close_internal(con, kill_window, false, false);
+}
+
/*
* Returns true when this node is a leaf node (has no children)
*
return true;
}
-/*
- * Closes the current container using tree_close_internal().
- *
- */
-void tree_close_con(kill_window_t kill_window) {
- assert(focused != NULL);
-
- /* There *should* be no possibility to focus outputs / root container */
- assert(focused->type != CT_OUTPUT);
- assert(focused->type != CT_ROOT);
-
- if (focused->type == CT_WORKSPACE) {
- DLOG("Workspaces cannot be close, closing all children instead\n");
- Con *child, *nextchild;
- for (child = TAILQ_FIRST(&(focused->focus_head)); child;) {
- nextchild = TAILQ_NEXT(child, focused);
- DLOG("killing child=%p\n", child);
- tree_close_internal(child, kill_window, false, false);
- child = nextchild;
- }
-
- return;
- }
-
- /* Kill con */
- tree_close_internal(focused, kill_window, false, false);
-}
-
/*
* Splits (horizontally or vertically) the given container by creating a new
* container which contains the old one and the future ones.
open_window(wm_class => 'matchme');
cmd '[con_id=__focused__ class=doesnotmatch] kill';
+sync_with_i3;
is(@{get_ws($ws)->{nodes}}, 1, 'window was not killed');
cmd '[con_id=__focused__ class=matchme] kill';
+sync_with_i3;
is(@{get_ws($ws)->{nodes}}, 0, 'window was killed');
###############################################################################
cmd 'mark marked';
cmd '[con_mark=marked class=doesnotmatch] kill';
+sync_with_i3;
is(@{get_ws($ws)->{nodes}}, 1, 'window was not killed');
cmd '[con_mark=marked class=matchme] kill';
+sync_with_i3;
is(@{get_ws($ws)->{nodes}}, 0, 'window was killed');
###############################################################################