Use a saner sanity check for floating_reposition.
The function contained_by_output checks whether any output contains any parts of a give rect. Rather than relying on the central point of the rect.
This commit is contained in:
parent
5b4ff1804d
commit
5adb09c5fc
|
@ -87,6 +87,16 @@ Output *get_output_by_name(const char *name);
|
||||||
*/
|
*/
|
||||||
Output *get_output_containing(int x, int y);
|
Output *get_output_containing(int x, int y);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In contained_by_output, we check if any active output contains part of the container.
|
||||||
|
* We do this by checking if the output rect is intersected by the Rect.
|
||||||
|
* This is the 2-dimensional counterpart of get_output_containing.
|
||||||
|
* Since we don't actually need the outputs intersected by the given Rect (There could
|
||||||
|
* be many), we just return true or false for convenience.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool contained_by_output(Rect rect);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the output which is the next one in the given direction.
|
* Gets the output which is the next one in the given direction.
|
||||||
*
|
*
|
||||||
|
|
|
@ -659,11 +659,7 @@ void drag_pointer(Con *con, const xcb_button_press_event_t *event, xcb_window_t
|
||||||
void floating_reposition(Con *con, Rect newrect) {
|
void floating_reposition(Con *con, Rect newrect) {
|
||||||
/* Sanity check: Are the new coordinates on any output? If not, we
|
/* Sanity check: Are the new coordinates on any output? If not, we
|
||||||
* ignore that request. */
|
* ignore that request. */
|
||||||
Output *output = get_output_containing(
|
if (!contained_by_output(newrect)) {
|
||||||
newrect.x + (newrect.width / 2),
|
|
||||||
newrect.y + (newrect.height / 2));
|
|
||||||
|
|
||||||
if (!output) {
|
|
||||||
ELOG("No output found at destination coordinates. Not repositioning.\n");
|
ELOG("No output found at destination coordinates. Not repositioning.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
25
src/randr.c
25
src/randr.c
|
@ -92,6 +92,31 @@ Output *get_output_containing(int x, int y) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In contained_by_output, we check if any active output contains part of the container.
|
||||||
|
* We do this by checking if the output rect is intersected by the Rect.
|
||||||
|
* This is the 2-dimensional counterpart of get_output_containing.
|
||||||
|
* Since we don't actually need the outputs intersected by the given Rect (There could
|
||||||
|
* be many), we just return true or false for convenience.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool contained_by_output(Rect rect){
|
||||||
|
Output *output;
|
||||||
|
int lx = rect.x, uy = rect.y;
|
||||||
|
int rx = rect.x + rect.width, by = rect.y + rect.height;
|
||||||
|
TAILQ_FOREACH(output, &outputs, outputs) {
|
||||||
|
if (!output->active)
|
||||||
|
continue;
|
||||||
|
DLOG("comparing x=%d y=%d with x=%d and y=%d width %d height %d\n",
|
||||||
|
rect.x, rect.y, output->rect.x, output->rect.y, output->rect.width, output->rect.height);
|
||||||
|
if (rx >= (int)output->rect.x && lx <= (int)(output->rect.x + output->rect.width) &&
|
||||||
|
by >= (int)output->rect.y && uy <= (int)(output->rect.y + output->rect.height))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Like get_output_next with close_far == CLOSEST_OUTPUT, but wraps.
|
* Like get_output_next with close_far == CLOSEST_OUTPUT, but wraps.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue