diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2017-11-28 12:25:17 -0800 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2017-11-28 12:25:17 -0800 |
commit | 9bfd0e3319ec99ca6e89b02c060c4305fddbb610 (patch) | |
tree | 78b48047c5083ef9b593573172971bbb8c44aeab /src | |
parent | ef70d6f8faa1ba04f12d4485d94fd37de3203087 (diff) |
screen: raw rectangle coords for vwm_screen_find()
Adds VWM_SCREEN_REL_RECT so a screen can be located without a
formal xwin, just supply the x,y,width,height.
Diffstat (limited to 'src')
-rw-r--r-- | src/screen.c | 45 | ||||
-rw-r--r-- | src/screen.h | 1 |
2 files changed, 38 insertions, 8 deletions
diff --git a/src/screen.c b/src/screen.c index 3ee9540..36a4389 100644 --- a/src/screen.c +++ b/src/screen.c @@ -29,26 +29,33 @@ /* Xinerama/multihead screen functions */ -/* return what fraction (0.0-1.0) of vwin overlaps with scr */ -static float vwm_screen_overlaps_xwin(vwm_t *vwm, const vwm_screen_t *scr, vwm_xwindow_t *xwin) +/* return what fraction (0.0-1.0) of the rect x,y,width,height overlaps with scr */ +static float vwm_screen_overlaps_rect(vwm_t *vwm, const vwm_screen_t *scr, int x, int y, int width, int height) { float pct = 0, xover = 0, yover = 0; - if (scr->x_org + scr->width < xwin->attrs.x || scr->x_org > xwin->attrs.x + xwin->attrs.width || - scr->y_org + scr->height < xwin->attrs.y || scr->y_org > xwin->attrs.y + xwin->attrs.height) + if (scr->x_org + scr->width < x || scr->x_org > x + width || + scr->y_org + scr->height < y || scr->y_org > y + height) goto _out; /* they overlap, by how much? */ - xover = MIN(scr->x_org + scr->width, xwin->attrs.x + xwin->attrs.width) - MAX(scr->x_org, xwin->attrs.x); - yover = MIN(scr->y_org + scr->height, xwin->attrs.y + xwin->attrs.height) - MAX(scr->y_org, xwin->attrs.y); + xover = MIN(scr->x_org + scr->width, x + width) - MAX(scr->x_org, x); + yover = MIN(scr->y_org + scr->height, y + height) - MAX(scr->y_org, y); - pct = (xover * yover) / (xwin->attrs.width * xwin->attrs.height); + pct = (xover * yover) / (width * height); _out: - VWM_TRACE("xover=%f yover=%f width=%i height=%i pct=%.4f", xover, yover, xwin->attrs.width, xwin->attrs.height, pct); + VWM_TRACE("xover=%f yover=%f width=%i height=%i pct=%.4f", xover, yover, width, height, pct); return pct; } +/* return what fraction (0.0-1.0) of xwin overlaps with scr */ +static float vwm_screen_overlaps_xwin(vwm_t *vwm, const vwm_screen_t *scr, vwm_xwindow_t *xwin) +{ + return vwm_screen_overlaps_rect(vwm, scr, xwin->attrs.x, xwin->attrs.y, xwin->attrs.width, xwin->attrs.height); +} + + const vwm_screen_t * vwm_screen_find(vwm_t *vwm, vwm_screen_rel_t rel, ...) { static vwm_screen_t faux; @@ -68,6 +75,28 @@ const vwm_screen_t * vwm_screen_find(vwm_t *vwm, vwm_screen_rel_t rel, ...) for (i = 0, _tmp = vwm->xinerama_screens; i < vwm->xinerama_screens_cnt; _tmp = &vwm->xinerama_screens[++i]) switch (rel) { + case VWM_SCREEN_REL_RECT: { + va_list ap; + int x, y, width, height; + float best_pct = 0, this_pct; + + va_start(ap, rel); + x = va_arg(ap, int); + y = va_arg(ap, int); + width = va_arg(ap, int); + height = va_arg(ap, int); + va_end(ap); + + for_each_screen(scr) { + this_pct = vwm_screen_overlaps_rect(vwm, scr, x, y, width, height); + if (this_pct > best_pct) { + best = scr; + best_pct = this_pct; + } + } + break; + } + case VWM_SCREEN_REL_XWIN: { va_list ap; vwm_xwindow_t *xwin; diff --git a/src/screen.h b/src/screen.h index 51b4f05..ad8ddce 100644 --- a/src/screen.h +++ b/src/screen.h @@ -9,6 +9,7 @@ typedef struct _vwm_xwindow_t vwm_xwindow_t; typedef XineramaScreenInfo vwm_screen_t; /* conveniently reuse the xinerama type for describing screens */ typedef enum _vwm_screen_rel_t { + VWM_SCREEN_REL_RECT, /* return the screen the supplied rectangle x,y,w,h most resides in */ VWM_SCREEN_REL_XWIN, /* return the screen the supplied window most resides in */ VWM_SCREEN_REL_POINTER, /* return the screen the pointer resides in */ VWM_SCREEN_REL_TOTAL, /* return the bounding rectangle of all screens as one */ |