From c62c0ee9dbc3603558da76d48379edc1c29688dc Mon Sep 17 00:00:00 2001 From: okan Date: Thu, 5 May 2011 15:32:24 +0000 Subject: [PATCH] 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@ --- menu.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/menu.c b/menu.c index e757665..dd858d8 100644 --- a/menu.c +++ b/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);