* vim:ts=4:sw=4:expandtab
*
* i3 - an improved dynamic tiling window manager
- * © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
*
* commands.c: all command functions (see commands_parser.c)
*
return;
}
+ if (strcmp(ctype, "window_type") == 0) {
+ if (strcasecmp(cvalue, "normal") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_NORMAL;
+ else if (strcasecmp(cvalue, "dialog") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_DIALOG;
+ else if (strcasecmp(cvalue, "utility") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_UTILITY;
+ else if (strcasecmp(cvalue, "toolbar") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_TOOLBAR;
+ else if (strcasecmp(cvalue, "splash") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_SPLASH;
+ else if (strcasecmp(cvalue, "menu") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_MENU;
+ else if (strcasecmp(cvalue, "dropdown_menu") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
+ else if (strcasecmp(cvalue, "popup_menu") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_POPUP_MENU;
+ else if (strcasecmp(cvalue, "tooltip") == 0)
+ current_match->window_type = A__NET_WM_WINDOW_TYPE_TOOLTIP;
+ else
+ ELOG("unknown window_type value \"%s\"\n", cvalue);
+
+ return;
+ }
+
if (strcmp(ctype, "con_mark") == 0) {
current_match->mark = regex_new(cvalue);
return;
void cmd_mark(I3_CMD, char *mark, char *toggle) {
HANDLE_EMPTY_MATCH;
- owindow *current;
- TAILQ_FOREACH(current, &owindows, owindows) {
- DLOG("matching: %p / %s\n", current->con, current->con->name);
- current->con->mark_changed = true;
- if (toggle != NULL && current->con->mark && strcmp(current->con->mark, mark) == 0) {
- DLOG("removing window mark %s\n", mark);
- FREE(current->con->mark);
- } else {
- DLOG("marking window with str %s\n", mark);
- FREE(current->con->mark);
- current->con->mark = sstrdup(mark);
- }
+ owindow *current = TAILQ_FIRST(&owindows);
+ if (current == NULL) {
+ ysuccess(false);
+ return;
+ }
+
+ /* Marks must be unique, i.e., no two windows must have the same mark. */
+ if (current != TAILQ_LAST(&owindows, owindows_head)) {
+ yerror("A mark must not be put onto more than one window");
+ return;
+ }
+
+ DLOG("matching: %p / %s\n", current->con, current->con->name);
+ current->con->mark_changed = true;
+ if (toggle != NULL && current->con->mark && strcmp(current->con->mark, mark) == 0) {
+ DLOG("removing window mark %s\n", mark);
+ FREE(current->con->mark);
+ } else {
+ DLOG("marking window with str %s\n", mark);
+ FREE(current->con->mark);
+ current->con->mark = sstrdup(mark);
}
DLOG("Clearing all non-matched windows with this mark\n");
Con *con;
TAILQ_FOREACH(con, &all_cons, all_cons) {
- /* Skip matched windows, we took care of them already. */
- bool matched = false;
- TAILQ_FOREACH(current, &owindows, owindows) {
- if (current->con == con) {
- matched = true;
- break;
- }
- }
- if (matched)
+ /* Skip matched window, we took care of it already. */
+ if (current->con == con)
continue;
if (con->mark && strcmp(con->mark, mark) == 0) {
}
DLOG("removed all window marks");
} else {
- Con *con;
- TAILQ_FOREACH(con, &all_cons, all_cons) {
- if (con->mark && strcmp(con->mark, mark) == 0) {
- FREE(con->mark);
- con->mark_changed = true;
- }
+ Con *con = con_by_mark(mark);
+ if (con != NULL) {
+ FREE(con->mark);
+ con->mark_changed = true;
}
DLOG("removed window mark %s\n", mark);
}
ysuccess(true);
}
+/*
+ * Implementation of 'move [container|window] [to] mark <str>'.
+ *
+ */
+void cmd_move_con_to_mark(I3_CMD, char *mark) {
+ DLOG("moving window to mark \"%s\"\n", mark);
+
+ HANDLE_EMPTY_MATCH;
+
+ bool result = true;
+ owindow *current;
+ TAILQ_FOREACH(current, &owindows, owindows) {
+ DLOG("moving matched window %p / %s to mark \"%s\"\n", current->con, current->con->name, mark);
+ result &= con_move_to_mark(current->con, mark);
+ }
+
+ cmd_output->needs_tree_render = true;
+ ysuccess(result);
+}
+
/*
* Implementation of 'floating enable|disable|toggle'
*