Bugfix: resizing: boundary checking (Thanks Mirko)
This commit is contained in:
parent
07bebdf841
commit
ee217523f1
28
src/resize.c
28
src/resize.c
|
@ -24,6 +24,8 @@
|
||||||
#include "xcb.h"
|
#include "xcb.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "layout.h"
|
#include "layout.h"
|
||||||
|
#include "xinerama.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Renders the resize window between the first/second container and resizes
|
* Renders the resize window between the first/second container and resizes
|
||||||
|
@ -35,6 +37,13 @@ int resize_graphical_handler(xcb_connection_t *conn, Workspace *ws, int first, i
|
||||||
int new_position;
|
int new_position;
|
||||||
xcb_window_t root = xcb_setup_roots_iterator(xcb_get_setup(conn)).data->root;
|
xcb_window_t root = xcb_setup_roots_iterator(xcb_get_setup(conn)).data->root;
|
||||||
xcb_screen_t *root_screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
|
xcb_screen_t *root_screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
|
||||||
|
i3Screen *screen = get_screen_containing(event->root_x, event->root_y);
|
||||||
|
if (screen == NULL) {
|
||||||
|
LOG("BUG: No screen found at this position (%d, %d)\n", event->root_x, event->root_y);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG("Screen dimensions: (%d, %d) %d x %d\n", screen->rect.x, screen->rect.y, screen->rect.width, screen->rect.height);
|
||||||
|
|
||||||
/* FIXME: horizontal resizing causes empty spaces to exist */
|
/* FIXME: horizontal resizing causes empty spaces to exist */
|
||||||
if (orientation == O_HORIZONTAL) {
|
if (orientation == O_HORIZONTAL) {
|
||||||
|
@ -57,9 +66,9 @@ int resize_graphical_handler(xcb_connection_t *conn, Workspace *ws, int first, i
|
||||||
Rect helprect;
|
Rect helprect;
|
||||||
if (orientation == O_VERTICAL) {
|
if (orientation == O_VERTICAL) {
|
||||||
helprect.x = event->root_x;
|
helprect.x = event->root_x;
|
||||||
helprect.y = 0;
|
helprect.y = screen->rect.y;
|
||||||
helprect.width = 2;
|
helprect.width = 2;
|
||||||
helprect.height = root_screen->height_in_pixels;
|
helprect.height = screen->rect.height;
|
||||||
new_position = event->root_x;
|
new_position = event->root_x;
|
||||||
} else {
|
} else {
|
||||||
helprect.x = 0;
|
helprect.x = 0;
|
||||||
|
@ -70,7 +79,7 @@ int resize_graphical_handler(xcb_connection_t *conn, Workspace *ws, int first, i
|
||||||
}
|
}
|
||||||
|
|
||||||
mask = XCB_CW_BACK_PIXEL;
|
mask = XCB_CW_BACK_PIXEL;
|
||||||
values[0] = get_colorpixel(conn, "#4c7899");
|
values[0] = config.client.focused.border;
|
||||||
|
|
||||||
mask |= XCB_CW_OVERRIDE_REDIRECT;
|
mask |= XCB_CW_OVERRIDE_REDIRECT;
|
||||||
values[1] = 1;
|
values[1] = 1;
|
||||||
|
@ -107,10 +116,16 @@ int resize_graphical_handler(xcb_connection_t *conn, Workspace *ws, int first, i
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (nr) {
|
switch (nr) {
|
||||||
case XCB_MOTION_NOTIFY:
|
case XCB_MOTION_NOTIFY: {
|
||||||
|
xcb_motion_notify_event_t *motion_event = (xcb_motion_notify_event_t*)inside_event;
|
||||||
if (orientation == O_VERTICAL) {
|
if (orientation == O_VERTICAL) {
|
||||||
values[0] = new_position = ((xcb_motion_notify_event_t*)inside_event)->root_x;
|
if (motion_event->root_x < (screen->rect.x + screen->rect.width) &&
|
||||||
xcb_configure_window(conn, helpwin, XCB_CONFIG_WINDOW_X, values);
|
motion_event->root_x > screen->rect.x) {
|
||||||
|
values[0] = new_position = ((xcb_motion_notify_event_t*)inside_event)->root_x;
|
||||||
|
xcb_configure_window(conn, helpwin, XCB_CONFIG_WINDOW_X, values);
|
||||||
|
} else {
|
||||||
|
LOG("Ignoring new position\n");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
values[0] = new_position = ((xcb_motion_notify_event_t*)inside_event)->root_y;
|
values[0] = new_position = ((xcb_motion_notify_event_t*)inside_event)->root_y;
|
||||||
xcb_configure_window(conn, helpwin, XCB_CONFIG_WINDOW_Y, values);
|
xcb_configure_window(conn, helpwin, XCB_CONFIG_WINDOW_Y, values);
|
||||||
|
@ -118,6 +133,7 @@ int resize_graphical_handler(xcb_connection_t *conn, Workspace *ws, int first, i
|
||||||
|
|
||||||
xcb_flush(conn);
|
xcb_flush(conn);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
LOG("Passing to original handler\n");
|
LOG("Passing to original handler\n");
|
||||||
/* Use original handler */
|
/* Use original handler */
|
||||||
|
|
Loading…
Reference in New Issue