Bugfix: Perform some bounds checking for snapped containers in fix_colrowspan (Thanks jchome)

This fixes ticket #22
This commit is contained in:
Michael Stapelberg 2009-04-11 14:52:11 +02:00
parent bcbe800720
commit bb8727cf27
2 changed files with 9 additions and 5 deletions

View File

@ -635,6 +635,8 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
if (client->container != NULL) if (client->container != NULL)
cleanup_table(conn, client->container->workspace); cleanup_table(conn, client->container->workspace);
fix_colrowspan(conn, client->container->workspace);
/* Lets see how many clients there are left on the workspace to delete it if its empty */ /* Lets see how many clients there are left on the workspace to delete it if its empty */
bool workspace_empty = true; bool workspace_empty = true;
FOR_TABLE(client->workspace) FOR_TABLE(client->workspace)

View File

@ -296,7 +296,7 @@ void cleanup_table(xcb_connection_t *conn, Workspace *workspace) {
} }
/* /*
* Fixes col/rowspan (makes sure there are no overlapping windows) * Fixes col/rowspan (makes sure there are no overlapping windows, obeys borders).
* *
*/ */
void fix_colrowspan(xcb_connection_t *conn, Workspace *workspace) { void fix_colrowspan(xcb_connection_t *conn, Workspace *workspace) {
@ -305,16 +305,18 @@ void fix_colrowspan(xcb_connection_t *conn, Workspace *workspace) {
FOR_TABLE(workspace) { FOR_TABLE(workspace) {
Container *con = workspace->table[cols][rows]; Container *con = workspace->table[cols][rows];
if (con->colspan > 1) { if (con->colspan > 1) {
LOG("gots one with colspan %d\n", con->colspan); LOG("gots one with colspan %d (at %d c, %d r)\n", con->colspan, cols, rows);
while (con->colspan > 1 && while (con->colspan > 1 &&
workspace->table[cols + (con->colspan - 1)][rows]->currently_focused != NULL) (!cell_exists(cols + (con->colspan-1), rows) ||
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);
} }
if (con->rowspan > 1) { if (con->rowspan > 1) {
LOG("gots one with rowspan %d\n", con->rowspan); LOG("gots one with rowspan %d (at %d c, %d r)\n", con->rowspan, cols, rows);
while (con->rowspan > 1 && while (con->rowspan > 1 &&
workspace->table[cols][rows + (con->rowspan - 1)]->currently_focused != NULL) (!cell_exists(cols, rows + (con->rowspan - 1)) ||
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);
} }