summaryrefslogtreecommitdiff
path: root/lwlib
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2021-12-28 17:53:20 +0800
committerPo Lu <luangruo@yahoo.com>2021-12-28 17:53:20 +0800
commitd257d92d17c5bfe5317973c5fadd8b5295174a1b (patch)
tree359212f18a5981804dc283372369afd15ebe5b70 /lwlib
parenta17a11df04fcc5e48330e92d6f33f0a40655e5af (diff)
downloademacs-d257d92d17c5bfe5317973c5fadd8b5295174a1b.tar.gz
* lwlib/xlwmenu.c (fit_to_screen): Adjust correctly for child menus.
Diffstat (limited to 'lwlib')
-rw-r--r--lwlib/xlwmenu.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index a065c53310d..68b0a2f5fe4 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -1392,23 +1392,28 @@ fit_to_screen (XlwMenuWidget mw,
{
int screen_width, screen_height;
int screen_x, screen_y;
+ int prev_screen_x, prev_screen_y;
#ifdef emacs
xlw_monitor_dimensions_at_pos (XtDisplay (mw), XtScreen (mw),
+ previous_ws->x, previous_ws->y,
+ &prev_screen_x, &prev_screen_y,
+ &screen_width, &screen_height);
+ xlw_monitor_dimensions_at_pos (XtDisplay (mw), XtScreen (mw),
ws->x, ws->y, &screen_x, &screen_y,
&screen_width, &screen_height);
#else
screen_width = WidthOfScreen (XtScreen (mw));
screen_height = HeightOfScreen (XtScreen (mw));
- screen_x = 0;
- screen_y = 0;
+ prev_screen_x = screen_x = 0;
+ prev_screen_y = screen_y = 0;
#endif
/* 1 if we are unable to avoid an overlap between
this menu and the parent menu in the X dimension. */
int horizontal_overlap = 0;
if (ws->x < screen_x)
- ws->x = 0;
+ ws->x = screen_x;
else if (ws->x + ws->width > screen_x + screen_width)
{
if (!horizontal_p)
@@ -1417,6 +1422,7 @@ fit_to_screen (XlwMenuWidget mw,
the right of the invoking menu-item; it makes the sub-menu
look more `attached' to the menu-item. */
ws->x = screen_x + (previous_ws->x
+ - prev_screen_x
- ws->width
+ mw->menu.shadow_thickness);
else
@@ -1445,7 +1451,9 @@ fit_to_screen (XlwMenuWidget mw,
else if (ws->y + ws->height > screen_y + screen_height)
{
if (horizontal_p)
- ws->y = screen_y + (previous_ws->y - ws->height);
+ ws->y = screen_y + (previous_ws->y
+ - prev_screen_y
+ - ws->height);
else
ws->y = screen_y + (screen_height - ws->height);
if (ws->y < screen_y)