summaryrefslogtreecommitdiff
path: root/app/cwm/menu.c
diff options
context:
space:
mode:
authorOkan Demirmen <okan@cvs.openbsd.org>2011-05-05 15:32:25 +0000
committerOkan Demirmen <okan@cvs.openbsd.org>2011-05-05 15:32:25 +0000
commit5965451ee591486f844f8454ca864ef726005090 (patch)
treece08e35096cba003c7679ff4a3f533a3c4e2290a /app/cwm/menu.c
parent43abb124c40635f4da396cbd96ecfa536c16dfb9 (diff)
make the menu window aware of xinerama info; this makes the menu stay
within the current screen, like other cwm window placements and mutations (vmax/hmax/max) - from Sviatoslav Chagaev. ok oga@
Diffstat (limited to 'app/cwm/menu.c')
-rw-r--r--app/cwm/menu.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/app/cwm/menu.c b/app/cwm/menu.c
index e757665c3..dd858d8a3 100644
--- a/app/cwm/menu.c
+++ b/app/cwm/menu.c
@@ -287,8 +287,10 @@ static void
menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq,
struct menu_q *resultq)
{
- struct menu *mi;
- int n, dy, xsave, ysave;
+ struct menu *mi;
+ XineramaScreenInfo *xine;
+ int xmin, xmax, ymin, ymax;
+ int n, dy, xsave, ysave;
if (mc->list) {
if (TAILQ_EMPTY(resultq) && mc->list) {
@@ -330,18 +332,33 @@ menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq,
mc->num++;
}
+ xine = screen_find_xinerama(sc, mc->x, mc->y);
+ if (xine) {
+ xmin = xine->x_org;
+ xmax = xine->x_org + xine->width;
+ ymin = xine->y_org;
+ ymax = xine->y_org + xine->height;
+ } else {
+ xmin = ymin = 0;
+ xmax = sc->xmax;
+ ymax = sc->ymax;
+ }
+
xsave = mc->x;
ysave = mc->y;
- if (mc->x < 0)
- mc->x = 0;
- else if (mc->x + mc->width >= sc->xmax)
- mc->x = sc->xmax - mc->width;
- if (mc->y + dy >= sc->ymax)
- mc->y = sc->ymax - dy;
+ if (mc->x < xmin)
+ mc->x = xmin;
+ else if (mc->x + mc->width >= xmax)
+ mc->x = xmax - mc->width;
+
+ if (mc->y + dy >= ymax)
+ mc->y = ymax - dy;
/* never hide the top of the menu */
- if (mc->y < 0)
- mc->y = 0;
+ if (mc->y < ymin) {
+ mc->y = ymin;
+ dy = ymax - ymin;
+ }
if (mc->x != xsave || mc->y != ysave)
xu_ptr_setpos(sc->rootwin, mc->x, mc->y);