if (strcmp(ctype, "con_id") == 0) {
char *end;
- long parsed = strtol(cvalue, &end, 10);
+ long parsed = strtol(cvalue, &end, 0);
if (parsed == LONG_MIN ||
parsed == LONG_MAX ||
parsed < 0 ||
if (strcmp(ctype, "id") == 0) {
char *end;
- long parsed = strtol(cvalue, &end, 10);
+ long parsed = strtol(cvalue, &end, 0);
if (parsed == LONG_MIN ||
parsed == LONG_MAX ||
parsed < 0 ||
return;
}
+ if (strcmp(ctype, "workspace") == 0) {
+ current_match->workspace = regex_new(cvalue);
+ return;
+ }
+
ELOG("Unknown criterion: %s\n", ctype);
}
TAILQ_FOREACH(current, &owindows, owindows) {
DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, ws, true, false);
+ con_move_to_workspace(current->con, ws, true, false, false);
}
cmd_output->needs_tree_render = true;
TAILQ_FOREACH(current, &owindows, owindows) {
DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, ws, true, false);
+ con_move_to_workspace(current->con, ws, true, false, false);
}
cmd_output->needs_tree_render = true;
TAILQ_FOREACH(current, &owindows, owindows) {
DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, ws, true, false);
+ con_move_to_workspace(current->con, ws, true, false, false);
}
cmd_output->needs_tree_render = true;
TAILQ_FOREACH(current, &owindows, owindows) {
DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, workspace, true, false);
+ con_move_to_workspace(current->con, workspace, true, false, false);
}
cmd_output->needs_tree_render = true;
/* ensure that resize will take place even if pixel increment is smaller than
* height increment or width increment.
* fixes #1011 */
- if (strcmp(direction, "up") == 0 || strcmp(direction, "down") == 0 ||
- strcmp(direction, "height") == 0) {
- if (px < 0)
- px = (-px < focused_con->height_increment) ? -focused_con->height_increment : px;
- else
- px = (px < focused_con->height_increment) ? focused_con->height_increment : px;
- } else if (strcmp(direction, "left") == 0 || strcmp(direction, "right") == 0) {
- if (px < 0)
- px = (-px < focused_con->width_increment) ? -focused_con->width_increment : px;
- else
- px = (px < focused_con->width_increment) ? focused_con->width_increment : px;
+ const i3Window *window = focused_con->window;
+ if (window != NULL) {
+ if (strcmp(direction, "up") == 0 || strcmp(direction, "down") == 0 ||
+ strcmp(direction, "height") == 0) {
+ if (px < 0)
+ px = (-px < window->height_increment) ? -window->height_increment : px;
+ else
+ px = (px < window->height_increment) ? window->height_increment : px;
+ } else if (strcmp(direction, "left") == 0 || strcmp(direction, "right") == 0) {
+ if (px < 0)
+ px = (-px < window->width_increment) ? -window->width_increment : px;
+ else
+ px = (px < window->width_increment) ? window->width_increment : px;
+ }
}
if (strcmp(direction, "up") == 0) {
}
/*
- * Implementation of 'border normal|none|1pixel|toggle|pixel'.
+ * Implementation of 'resize set <px> [px] <px> [px]'.
+ *
+ */
+void cmd_size(I3_CMD, char *cwidth, char *cheight) {
+ DLOG("resizing to %sx%s px\n", cwidth, cheight);
+ // TODO: We could either handle this in the parser itself as a separate token (and make the stack typed) or we need a better way to convert a string to a number with error checking
+ int x = atoi(cwidth);
+ int y = atoi(cheight);
+ if (x <= 0 || y <= 0) {
+ ELOG("Resize failed: dimensions cannot be negative (was %sx%s)\n", cwidth, cheight);
+ return;
+ }
+
+ HANDLE_EMPTY_MATCH;
+
+ owindow *current;
+ TAILQ_FOREACH(current, &owindows, owindows) {
+ Con *floating_con;
+ if ((floating_con = con_inside_floating(current->con))) {
+ floating_resize(floating_con, x, y);
+ } else {
+ ELOG("Resize failed: %p not a floating container\n", current->con);
+ }
+ }
+
+ cmd_output->needs_tree_render = true;
+ // XXX: default reply for now, make this a better reply
+ ysuccess(true);
+}
+
+/*
+ * Implementation of 'border normal|pixel [<n>]', 'border none|1pixel|toggle'.
*
*/
void cmd_border(I3_CMD, char *border_style_str, char *border_width) {
FREE(con->mark);
con->mark_changed = true;
}
- DLOG("removed all window marks");
+ DLOG("Removed all window marks.\n");
} else {
Con *con = con_by_mark(mark);
if (con != NULL) {
FREE(con->mark);
con->mark_changed = true;
}
- DLOG("removed window mark %s\n", mark);
+ DLOG("Removed window mark \"%s\".\n", mark);
}
cmd_output->needs_tree_render = true;
TAILQ_FOREACH(current, &owindows, owindows) {
DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, ws, true, false);
+ con_move_to_workspace(current->con, ws, true, false, false);
}
cmd_output->needs_tree_render = true;
count);
cmd_output->needs_tree_render = true;
- // XXX: default reply for now, make this a better reply
- ysuccess(true);
+ ysuccess(count > 0);
}
/*
ysuccess(true);
}
+/*
+ * Implementation of 'sticky enable|disable|toggle'.
+ *
+ */
+void cmd_sticky(I3_CMD, char *action) {
+ DLOG("%s sticky on window\n", action);
+ HANDLE_EMPTY_MATCH;
+
+ owindow *current;
+ TAILQ_FOREACH(current, &owindows, owindows) {
+ if (current->con->window == NULL) {
+ ELOG("only containers holding a window can be made sticky, skipping con = %p\n", current->con);
+ continue;
+ }
+ DLOG("setting sticky for container = %p / %s\n", current->con, current->con->name);
+
+ bool sticky = false;
+ if (strcmp(action, "enable") == 0)
+ sticky = true;
+ else if (strcmp(action, "disable") == 0)
+ sticky = false;
+ else if (strcmp(action, "toggle") == 0)
+ sticky = !current->con->sticky;
+
+ current->con->sticky = sticky;
+ ewmh_update_sticky(current->con->window->id, sticky);
+ }
+
+ /* A window we made sticky might not be on a visible workspace right now, so we need to make
+ * sure it gets pushed to the front now. */
+ output_push_sticky_windows();
+
+ cmd_output->needs_tree_render = true;
+ ysuccess(true);
+}
+
/*
* Implementation of 'move <direction> [<pixels> [px]]'.
*
ysuccess(true);
}
+/*
+ * Implementation of 'title_format <format>'
+ *
+ */
+void cmd_title_format(I3_CMD, char *format) {
+ DLOG("setting title_format to \"%s\"\n", format);
+ HANDLE_EMPTY_MATCH;
+
+ owindow *current;
+ TAILQ_FOREACH(current, &owindows, owindows) {
+ if (current->con->window == NULL)
+ continue;
+
+ DLOG("setting title_format for %p / %s\n", current->con, current->con->name);
+ FREE(current->con->window->title_format);
+
+ /* If we only display the title without anything else, we can skip the parsing step,
+ * so we remove the title format altogether. */
+ if (strcasecmp(format, "%title") != 0) {
+ current->con->window->title_format = sstrdup(format);
+
+ i3String *formatted_title = window_parse_title_format(current->con->window);
+ ewmh_update_visible_name(current->con->window->id, i3string_as_utf8(formatted_title));
+ I3STRING_FREE(formatted_title);
+ } else {
+ /* We can remove _NET_WM_VISIBLE_NAME since we don't display a custom title. */
+ ewmh_update_visible_name(current->con->window->id, NULL);
+ }
+
+ /* Make sure the window title is redrawn immediately. */
+ current->con->window->name_x_changed = true;
+ }
+
+ cmd_output->needs_tree_render = true;
+ ysuccess(true);
+}
+
/*
* Implementation of 'rename workspace [<name>] to <name>'
*
*/
void cmd_rename_workspace(I3_CMD, char *old_name, char *new_name) {
if (strncasecmp(new_name, "__", strlen("__")) == 0) {
- LOG("Cannot rename workspace to \"%s\": names starting with __ are i3-internal.", new_name);
+ LOG("Cannot rename workspace to \"%s\": names starting with __ are i3-internal.\n", new_name);
ysuccess(false);
return;
}