From: Pasi Kallinen Date: Thu, 18 Oct 2018 15:39:27 +0000 (+0300) Subject: X11: Obey menu movement keys X-Git-Tag: NetHack-3.6.2_Released~185^2~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fa5e5ac4b4f9252f988b43a2b6360569a178673e;p=nethack X11: Obey menu movement keys --- diff --git a/doc/fixes36.2 b/doc/fixes36.2 index 2eb1453ea..527c68ab9 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -241,6 +241,7 @@ X11: remember perm_invent window geometry X11: handle X errors via panic X11: don't reuse perm_invent window for picking an object X11: obey mouse_support and allow toggling it in game +X11: obey menu movement keys General New Features diff --git a/include/winX.h b/include/winX.h index 6bb771a9b..32af1364b 100644 --- a/include/winX.h +++ b/include/winX.h @@ -307,6 +307,7 @@ E void FDECL(highlight_yn, (BOOLEAN_P)); E void FDECL(nh_XtPopup, (Widget, int, Widget)); E void FDECL(nh_XtPopdown, (Widget)); E void FDECL(win_X11_init, (int)); +E void FDECL(find_scrollbars, (Widget, Widget *, Widget *)); E void FDECL(nh_keyscroll, (Widget, XEvent *, String *, Cardinal *)); /* ### winmesg.c ### */ diff --git a/win/X11/winX.c b/win/X11/winX.c index 10462c978..009f4e6ab 100644 --- a/win/X11/winX.c +++ b/win/X11/winX.c @@ -2548,6 +2548,20 @@ int dir; return; } +void +find_scrollbars(w, horiz, vert) +Widget w; +Widget *horiz, *vert; +{ + if (w) { + do { + *horiz = XtNameToWidget(w, "*horizontal"); + *vert = XtNameToWidget(w, "*vertical"); + w = XtParent(w); + } while (!*horiz && !*vert && w); + } +} + /* Callback * Scroll a viewport, using standard NH 1,2,3,4,6,7,8,9 directions. */ @@ -2560,7 +2574,7 @@ String *params; Cardinal *num_params; { Arg arg[2]; - Widget horiz_sb, vert_sb, scrollw; + Widget horiz_sb = (Widget) 0, vert_sb = (Widget) 0; float top, shown; Boolean do_call; int direction; @@ -2573,12 +2587,7 @@ Cardinal *num_params; direction = atoi(params[0]); - scrollw = viewport; - do { - horiz_sb = XtNameToWidget(scrollw, "*horizontal"); - vert_sb = XtNameToWidget(scrollw, "*vertical"); - scrollw = XtParent(scrollw); - } while (!horiz_sb && !vert_sb && scrollw); + find_scrollbars(viewport, &horiz_sb, &vert_sb); #define H_DELTA 0.25 /* distance of horiz shift */ /* vert shift is half of curr distance */ diff --git a/win/X11/winmenu.c b/win/X11/winmenu.c index e44b31eda..49cd79162 100644 --- a/win/X11/winmenu.c +++ b/win/X11/winmenu.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -324,6 +325,27 @@ Cardinal *num_params; else X11_nhbell(); return; + } else if (ch == MENU_FIRST_PAGE || ch == MENU_LAST_PAGE) { + Widget hbar = (Widget) 0, vbar = (Widget) 0; + float top = (ch == MENU_FIRST_PAGE) ? 0.0 : 1.0; + find_scrollbars(wp->w, &hbar, &vbar); + if (vbar) + XtCallCallbacks(vbar, XtNjumpProc, &top); + return; + } else if (ch == MENU_NEXT_PAGE || ch == MENU_PREVIOUS_PAGE) { + Widget hbar = (Widget) 0, vbar = (Widget) 0; + find_scrollbars(wp->w, &hbar, &vbar); + if (vbar) { + float shown, top; + Arg arg[2]; + XtSetArg(arg[0], nhStr(XtNshown), &shown); + XtSetArg(arg[1], nhStr(XtNtopOfThumb), &top); + XtGetValues(vbar, arg, TWO); + top += ((ch == MENU_NEXT_PAGE) ? shown : -shown); + if (vbar) + XtCallCallbacks(vbar, XtNjumpProc, &top); + } + return; } else if (index(menu_info->curr_menu.gacc, ch)) { group_accel: /* matched a group accelerator */