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
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 ### */
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.
*/
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;
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 */
#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>
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 */