]> granicus.if.org Git - nethack/commitdiff
X11: Obey menu movement keys
authorPasi Kallinen <paxed@alt.org>
Thu, 18 Oct 2018 15:39:27 +0000 (18:39 +0300)
committerPasi Kallinen <paxed@alt.org>
Thu, 18 Oct 2018 15:39:27 +0000 (18:39 +0300)
doc/fixes36.2
include/winX.h
win/X11/winX.c
win/X11/winmenu.c

index 2eb1453ea0c94c763b51d67c30e4df2872b141ab..527c68ab9292917ed2b76eef1ad6ebdaa644c366 100644 (file)
@@ -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
index 6bb771a9b0032204a05ffcccc9da18a74cc67b1c..32af1364b9c59e83e60b6bd4c49f754423e2ce9f 100644 (file)
@@ -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 ### */
index 10462c978e33af2f5dc12a6ff1df67f339d979b0..009f4e6ab06ea8c4af08c14b73b5874eff0df677 100644 (file)
@@ -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 */
index e44b31eda5684f8b47a655e37365540be9a9afc5..49cd7916275bed093935818066846e8cd95c6d7b 100644 (file)
@@ -21,6 +21,7 @@
 #include <X11/Xaw/Command.h>
 #include <X11/Xaw/Viewport.h>
 #include <X11/Xaw/Cardinals.h>
+#include <X11/Xaw/Scrollbar.h>
 #include <X11/Xaw/Box.h>
 #include <X11/Xos.h>
 
@@ -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 */