diff --git a/src/commands.c b/src/commands.c index 09c21b34..60e5a08f 100644 --- a/src/commands.c +++ b/src/commands.c @@ -585,6 +585,39 @@ void show_workspace(xcb_connection_t *conn, int workspace) { render_layout(conn); } +/* + * Jump directly to the specified workspace, row and col. + * Great for reaching windows that you always keep in the + * same spot (hello irssi, I'm looking at you) + */ +static void jump_to_container(xcb_connection_t *conn, const char* arg_str) { + int ws,row,col; + int result; + + result = sscanf(arg_str, "%i %i %i", &ws, &row, &col); + LOG("Jump called with parameters '%s', which parses as %i numbers\n", arg_str, result); + + /* No match? (This is technically a syntax error, but who cares.) */ + if(result < 1) + return; + + /* Move to the target workspace */ + show_workspace(conn, ws); + + if(result < 3) + return; + + /* Move to row/col */ + if(row >= c_ws->rows) + row = c_ws->rows - 1; + if(col >= c_ws->cols) + col = c_ws->cols - 1; + + LOG("Jumping to row %i, col %i\n", row, col); + if (c_ws->table[col][row]->currently_focused != NULL) + set_focus(conn, c_ws->table[col][row]->currently_focused); +} + /* * Parses a command, see file CMDMODE for more information * @@ -626,6 +659,12 @@ void parse_command(xcb_connection_t *conn, const char *command) { return; } + /* Is it a jump to a specified workspae,row,col? */ + if (STARTS_WITH(command, "jump ")) { + jump_to_container(conn, command+strlen("jump ")); + return; + } + /* Is it 'f' for fullscreen? */ if (command[0] == 'f') { if (CUR_CELL->currently_focused == NULL)