Bugfix: Obey colspan/rowspan when checking if containers can be snapped to the right/bottom (Thanks Mirko)

This fixes ticket #54.
This commit is contained in:
Michael Stapelberg 2009-06-19 22:39:03 +02:00
parent 325d1b301f
commit 93ff4159c1
1 changed files with 14 additions and 12 deletions

View File

@ -361,7 +361,7 @@ static void snap_current_container(xcb_connection_t *conn, direction_t 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->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;
} }
@ -372,11 +372,12 @@ static void snap_current_container(xcb_connection_t *conn, direction_t direction
case D_RIGHT: { case D_RIGHT: {
/* 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;
if (!cell_exists(new_col, container->row) || for (int i = 0; i < container->rowspan; i++)
CUR_TABLE[new_col][container->row]->currently_focused != NULL) { if (!cell_exists(new_col, container->row + i) ||
LOG("cannot snap to right - the cell is already used\n"); CUR_TABLE[new_col][container->row + i]->currently_focused != NULL) {
return; LOG("cannot snap to right - the cell is already used\n");
} return;
}
/* Check if there are other cells with rowspan, which are in our way. /* Check if there are other cells with rowspan, which are in our way.
* If so, reduce their rowspan. */ * If so, reduce their rowspan. */
@ -393,7 +394,7 @@ static void snap_current_container(xcb_connection_t *conn, direction_t direction
} }
case D_UP: case D_UP:
if (!cell_exists(container->col, container->row - 1) || if (!cell_exists(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;
} }
@ -404,11 +405,12 @@ static void snap_current_container(xcb_connection_t *conn, direction_t direction
case D_DOWN: { case D_DOWN: {
LOG("snapping down\n"); LOG("snapping down\n");
int new_row = container->row + container->rowspan; int new_row = container->row + container->rowspan;
if (!cell_exists(container->col, new_row) || for (int i = 0; i < container->colspan; i++)
CUR_TABLE[container->col][new_row]->currently_focused != NULL) { if (!cell_exists(container->col + i, new_row) ||
LOG("cannot snap down - the cell is already used\n"); CUR_TABLE[container->col + i][new_row]->currently_focused != NULL) {
return; LOG("cannot snap down - the cell is already used\n");
} return;
}
for (int i = container->col-1; i >= 0; i--) { for (int i = container->col-1; i >= 0; i--) {
LOG("we got cell %d, %d with colspan %d\n", LOG("we got cell %d, %d with colspan %d\n",