contained_by_output: return output and rename to output_containing_rect

This commit is contained in:
Orestis Floros 2018-03-17 17:42:49 +02:00
parent 8f5c1cb6b8
commit e09861f73f
3 changed files with 23 additions and 14 deletions

View File

@ -95,15 +95,14 @@ Output *get_output_containing(unsigned int x, unsigned int y);
*/ */
Output *get_output_with_dimensions(Rect rect); Output *get_output_with_dimensions(Rect rect);
/* /**
* In contained_by_output, we check if any active output contains part of the container. * In output_containing_rect, 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. * We do this by checking if the output rect is intersected by the Rect.
* This is the 2-dimensional counterpart of get_output_containing. * 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 * Returns the output with the maximum intersecting area.
* be many), we just return true or false for convenience.
* *
*/ */
bool contained_by_output(Rect rect); Output *output_containing_rect(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.

View File

@ -867,7 +867,7 @@ drag_result_t drag_pointer(Con *con, const xcb_button_press_event_t *event, xcb_
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. */
if (!contained_by_output(newrect)) { if (!output_containing_rect(newrect)) {
ELOG("No output found at destination coordinates. Not repositioning.\n"); ELOG("No output found at destination coordinates. Not repositioning.\n");
return; return;
} }

View File

@ -136,27 +136,37 @@ Output *get_output_with_dimensions(Rect rect) {
} }
/* /*
* In contained_by_output, we check if any active output contains part of the container. * In output_containing_rect, 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. * We do this by checking if the output rect is intersected by the Rect.
* This is the 2-dimensional counterpart of get_output_containing. * 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 * Returns the output with the maximum intersecting area.
* be many), we just return true or false for convenience.
* *
*/ */
bool contained_by_output(Rect rect) { Output *output_containing_rect(Rect rect) {
Output *output; Output *output;
int lx = rect.x, uy = rect.y; int lx = rect.x, uy = rect.y;
int rx = rect.x + rect.width, by = rect.y + rect.height; int rx = rect.x + rect.width, by = rect.y + rect.height;
long max_area = 0;
Output *result = NULL;
TAILQ_FOREACH(output, &outputs, outputs) { TAILQ_FOREACH(output, &outputs, outputs) {
if (!output->active) if (!output->active)
continue; continue;
int lx_o = (int)output->rect.x, uy_o = (int)output->rect.y;
int rx_o = (int)(output->rect.x + output->rect.width), by_o = (int)(output->rect.y + output->rect.height);
DLOG("comparing x=%d y=%d with x=%d and y=%d width %d height %d\n", 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); 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) && int left = max(lx, lx_o);
by >= (int)output->rect.y && uy <= (int)(output->rect.y + output->rect.height)) int right = min(rx, rx_o);
return true; int bottom = min(by, by_o);
int top = max(uy, uy_o);
if (left < right && bottom > top) {
long area = (right - left) * (bottom - top);
if (area > max_area) {
result = output;
}
}
} }
return false; return result;
} }
/* /*