Bugfix: Containers could lose their snap state (Thanks Atsutane)
When being on a different workspace than the one where the snapped container is, the function to cleanup cols/rows would clean up too much.
This commit is contained in:
parent
8adce413f5
commit
505eaaf349
|
@ -48,7 +48,7 @@ void expand_table_cols_at_head(Workspace *workspace);
|
||||||
* Performs simple bounds checking for the given column/row
|
* Performs simple bounds checking for the given column/row
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
bool cell_exists(int col, int row);
|
bool cell_exists(Workspace *ws, int col, int row);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shrinks the table by "compacting" it, that is, removing completely empty
|
* Shrinks the table by "compacting" it, that is, removing completely empty
|
||||||
|
|
|
@ -211,7 +211,7 @@ static bool floating_mod_on_tiled_client(xcb_connection_t *conn, Client *client,
|
||||||
first = con->col + (con->colspan - 1);
|
first = con->col + (con->colspan - 1);
|
||||||
LOG("column %d\n", first);
|
LOG("column %d\n", first);
|
||||||
|
|
||||||
if (!cell_exists(first, con->row) ||
|
if (!cell_exists(ws, first, con->row) ||
|
||||||
(first == (ws->cols-1)))
|
(first == (ws->cols-1)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ static bool floating_mod_on_tiled_client(xcb_connection_t *conn, Client *client,
|
||||||
to_bottom < to_top) {
|
to_bottom < to_top) {
|
||||||
/* …bottom border */
|
/* …bottom border */
|
||||||
first = con->row + (con->rowspan - 1);
|
first = con->row + (con->rowspan - 1);
|
||||||
if (!cell_exists(con->col, first) ||
|
if (!cell_exists(ws, con->col, first) ||
|
||||||
(first == (ws->rows-1)))
|
(first == (ws->rows-1)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ int handle_button_press(void *ignored, xcb_connection_t *conn, xcb_button_press_
|
||||||
} else if (event->event_y >= (client->rect.height - 2)) {
|
} else if (event->event_y >= (client->rect.height - 2)) {
|
||||||
/* …bottom border */
|
/* …bottom border */
|
||||||
first = con->row + (con->rowspan - 1);
|
first = con->row + (con->rowspan - 1);
|
||||||
if (!cell_exists(con->col, first) ||
|
if (!cell_exists(ws, con->col, first) ||
|
||||||
(first == (ws->rows-1)))
|
(first == (ws->rows-1)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -394,7 +394,7 @@ int handle_button_press(void *ignored, xcb_connection_t *conn, xcb_button_press_
|
||||||
first = con->col + (con->colspan - 1);
|
first = con->col + (con->colspan - 1);
|
||||||
LOG("column %d\n", first);
|
LOG("column %d\n", first);
|
||||||
|
|
||||||
if (!cell_exists(first, con->row) ||
|
if (!cell_exists(ws, first, con->row) ||
|
||||||
(first == (ws->cols-1)))
|
(first == (ws->cols-1)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
|
@ -143,9 +143,9 @@ static void focus_thing(xcb_connection_t *conn, direction_t direction, thing_t t
|
||||||
if (focus_window_in_container(conn, container, direction))
|
if (focus_window_in_container(conn, container, direction))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (direction == D_DOWN && cell_exists(current_col, current_row+1))
|
if (direction == D_DOWN && cell_exists(t_ws, current_col, current_row+1))
|
||||||
new_row = current_row + t_ws->table[current_col][current_row]->rowspan;
|
new_row = current_row + t_ws->table[current_col][current_row]->rowspan;
|
||||||
else if (direction == D_UP && cell_exists(current_col, current_row-1)) {
|
else if (direction == D_UP && cell_exists(c_ws, current_col, current_row-1)) {
|
||||||
/* Set new_row as a sane default, but it may get overwritten in a second */
|
/* Set new_row as a sane default, but it may get overwritten in a second */
|
||||||
new_row--;
|
new_row--;
|
||||||
|
|
||||||
|
@ -186,9 +186,9 @@ static void focus_thing(xcb_connection_t *conn, direction_t direction, thing_t t
|
||||||
LOG("Fixed it to new col %d\n", new_col);
|
LOG("Fixed it to new col %d\n", new_col);
|
||||||
}
|
}
|
||||||
} else if (direction == D_LEFT || direction == D_RIGHT) {
|
} else if (direction == D_LEFT || direction == D_RIGHT) {
|
||||||
if (direction == D_RIGHT && cell_exists(current_col+1, current_row))
|
if (direction == D_RIGHT && cell_exists(t_ws, current_col+1, current_row))
|
||||||
new_col = current_col + t_ws->table[current_col][current_row]->colspan;
|
new_col = current_col + t_ws->table[current_col][current_row]->colspan;
|
||||||
else if (direction == D_LEFT && cell_exists(current_col-1, current_row)) {
|
else if (direction == D_LEFT && cell_exists(t_ws, current_col-1, current_row)) {
|
||||||
/* Set new_col as a sane default, but it may get overwritten in a second */
|
/* Set new_col as a sane default, but it may get overwritten in a second */
|
||||||
new_col--;
|
new_col--;
|
||||||
|
|
||||||
|
@ -451,7 +451,7 @@ static void snap_current_container(xcb_connection_t *conn, direction_t direction
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
case D_LEFT:
|
case D_LEFT:
|
||||||
/* Snap to the left is actually a move to the left and then a snap right */
|
/* Snap to the left is actually a move to the left and then a snap right */
|
||||||
if (!cell_exists(container->col - 1, container->row) ||
|
if (!cell_exists(container->workspace, container->col - 1, container->row) ||
|
||||||
CUR_TABLE[container->col-1][container->row]->currently_focused != NULL) {
|
CUR_TABLE[container->col-1][container->row]->currently_focused != NULL) {
|
||||||
LOG("cannot snap to left - the cell is already used\n");
|
LOG("cannot snap to left - the cell is already used\n");
|
||||||
return;
|
return;
|
||||||
|
@ -464,7 +464,7 @@ static void snap_current_container(xcb_connection_t *conn, direction_t direction
|
||||||
/* Check if the cell is used */
|
/* Check if the cell is used */
|
||||||
int new_col = container->col + container->colspan;
|
int new_col = container->col + container->colspan;
|
||||||
for (int i = 0; i < container->rowspan; i++)
|
for (int i = 0; i < container->rowspan; i++)
|
||||||
if (!cell_exists(new_col, container->row + i) ||
|
if (!cell_exists(container->workspace, new_col, container->row + i) ||
|
||||||
CUR_TABLE[new_col][container->row + i]->currently_focused != NULL) {
|
CUR_TABLE[new_col][container->row + i]->currently_focused != NULL) {
|
||||||
LOG("cannot snap to right - the cell is already used\n");
|
LOG("cannot snap to right - the cell is already used\n");
|
||||||
return;
|
return;
|
||||||
|
@ -484,7 +484,7 @@ static void snap_current_container(xcb_connection_t *conn, direction_t direction
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case D_UP:
|
case D_UP:
|
||||||
if (!cell_exists(container->col, container->row - 1) ||
|
if (!cell_exists(container->workspace, container->col, container->row - 1) ||
|
||||||
CUR_TABLE[container->col][container->row-1]->currently_focused != NULL) {
|
CUR_TABLE[container->col][container->row-1]->currently_focused != NULL) {
|
||||||
LOG("cannot snap to top - the cell is already used\n");
|
LOG("cannot snap to top - the cell is already used\n");
|
||||||
return;
|
return;
|
||||||
|
@ -497,7 +497,7 @@ static void snap_current_container(xcb_connection_t *conn, direction_t direction
|
||||||
LOG("snapping down\n");
|
LOG("snapping down\n");
|
||||||
int new_row = container->row + container->rowspan;
|
int new_row = container->row + container->rowspan;
|
||||||
for (int i = 0; i < container->colspan; i++)
|
for (int i = 0; i < container->colspan; i++)
|
||||||
if (!cell_exists(container->col + i, new_row) ||
|
if (!cell_exists(container->workspace, container->col + i, new_row) ||
|
||||||
CUR_TABLE[container->col + i][new_row]->currently_focused != NULL) {
|
CUR_TABLE[container->col + i][new_row]->currently_focused != NULL) {
|
||||||
LOG("cannot snap down - the cell is already used\n");
|
LOG("cannot snap down - the cell is already used\n");
|
||||||
return;
|
return;
|
||||||
|
@ -823,7 +823,7 @@ static void parse_resize_command(xcb_connection_t *conn, Client *last_focused, c
|
||||||
first = con->col + (con->colspan - 1);
|
first = con->col + (con->colspan - 1);
|
||||||
LOG("column %d\n", first);
|
LOG("column %d\n", first);
|
||||||
|
|
||||||
if (!cell_exists(first, con->row) ||
|
if (!cell_exists(ws, first, con->row) ||
|
||||||
(first == (ws->cols-1)))
|
(first == (ws->cols-1)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -838,7 +838,7 @@ static void parse_resize_command(xcb_connection_t *conn, Client *last_focused, c
|
||||||
command += strlen("top");
|
command += strlen("top");
|
||||||
} else if (STARTS_WITH(command, "bottom")) {
|
} else if (STARTS_WITH(command, "bottom")) {
|
||||||
first = con->row + (con->rowspan - 1);
|
first = con->row + (con->rowspan - 1);
|
||||||
if (!cell_exists(con->col, first) ||
|
if (!cell_exists(ws, con->col, first) ||
|
||||||
(first == (ws->rows-1)))
|
(first == (ws->rows-1)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
10
src/table.c
10
src/table.c
|
@ -241,9 +241,9 @@ static void shrink_table_rows(Workspace *workspace) {
|
||||||
* Performs simple bounds checking for the given column/row
|
* Performs simple bounds checking for the given column/row
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
bool cell_exists(int col, int row) {
|
bool cell_exists(Workspace *ws, int col, int row) {
|
||||||
return (col >= 0 && col < c_ws->cols) &&
|
return (col >= 0 && col < ws->cols) &&
|
||||||
(row >= 0 && row < c_ws->rows);
|
(row >= 0 && row < ws->rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_container(xcb_connection_t *conn, Workspace *workspace, int col, int row) {
|
static void free_container(xcb_connection_t *conn, Workspace *workspace, int col, int row) {
|
||||||
|
@ -388,7 +388,7 @@ void fix_colrowspan(xcb_connection_t *conn, Workspace *workspace) {
|
||||||
if (con->colspan > 1) {
|
if (con->colspan > 1) {
|
||||||
LOG("gots one with colspan %d (at %d c, %d r)\n", con->colspan, cols, rows);
|
LOG("gots one with colspan %d (at %d c, %d r)\n", con->colspan, cols, rows);
|
||||||
while (con->colspan > 1 &&
|
while (con->colspan > 1 &&
|
||||||
(!cell_exists(cols + (con->colspan-1), rows) ||
|
(!cell_exists(workspace, cols + (con->colspan-1), rows) &&
|
||||||
workspace->table[cols + (con->colspan - 1)][rows]->currently_focused != NULL))
|
workspace->table[cols + (con->colspan - 1)][rows]->currently_focused != NULL))
|
||||||
con->colspan--;
|
con->colspan--;
|
||||||
LOG("fixed it to %d\n", con->colspan);
|
LOG("fixed it to %d\n", con->colspan);
|
||||||
|
@ -396,7 +396,7 @@ void fix_colrowspan(xcb_connection_t *conn, Workspace *workspace) {
|
||||||
if (con->rowspan > 1) {
|
if (con->rowspan > 1) {
|
||||||
LOG("gots one with rowspan %d (at %d c, %d r)\n", con->rowspan, cols, rows);
|
LOG("gots one with rowspan %d (at %d c, %d r)\n", con->rowspan, cols, rows);
|
||||||
while (con->rowspan > 1 &&
|
while (con->rowspan > 1 &&
|
||||||
(!cell_exists(cols, rows + (con->rowspan - 1)) ||
|
(!cell_exists(workspace, cols, rows + (con->rowspan - 1)) &&
|
||||||
workspace->table[cols][rows + (con->rowspan - 1)]->currently_focused != NULL))
|
workspace->table[cols][rows + (con->rowspan - 1)]->currently_focused != NULL))
|
||||||
con->rowspan--;
|
con->rowspan--;
|
||||||
LOG("fixed it to %d\n", con->rowspan);
|
LOG("fixed it to %d\n", con->rowspan);
|
||||||
|
|
Loading…
Reference in New Issue