X11 default resources
If the user hasn't explicitly loaded application defaults (which I haven't been doing), the X11 interface behaves differently if invoked via the shell script than if the executable is run directly, because the script sets up a path so that X can find $HACKDIR/NetHack.ad. This hides the difference by reading in that file during initialization and feeding its contents to XtAppInitialize as fallback resources.
This commit is contained in:
+106
-37
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.6 winX.c $NHDT-Date: 1454810422 2016/02/07 02:00:22 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.37 $ */
|
/* NetHack 3.6 winX.c $NHDT-Date: 1454834200 2016/02/07 08:36:40 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.38 $ */
|
||||||
/* Copyright (c) Dean Luick, 1992 */
|
/* Copyright (c) Dean Luick, 1992 */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -138,22 +138,31 @@ struct window_procs X11_procs = {
|
|||||||
/*
|
/*
|
||||||
* Local functions.
|
* Local functions.
|
||||||
*/
|
*/
|
||||||
static void FDECL(dismiss_file, (Widget, XEvent *, String *, Cardinal *));
|
static winid NDECL(find_free_window);
|
||||||
static void FDECL(delete_file, (Widget, XEvent *, String *, Cardinal *));
|
static void FDECL(nhFreePixel, (XtAppContext, XrmValuePtr, XtPointer,
|
||||||
static void FDECL(yn_key, (Widget, XEvent *, String *, Cardinal *));
|
XrmValuePtr, Cardinal *));
|
||||||
static void FDECL(yn_delete, (Widget, XEvent *, String *, Cardinal *));
|
static void NDECL(load_default_resources);
|
||||||
static void FDECL(askname_delete, (Widget, XEvent *, String *, Cardinal *));
|
static void NDECL(release_default_resources);
|
||||||
static void FDECL(getline_delete, (Widget, XEvent *, String *, Cardinal *));
|
|
||||||
static void NDECL(release_getline_widgets);
|
|
||||||
static void FDECL(X11_hangup, (Widget, XEvent *, String *, Cardinal *));
|
|
||||||
static void NDECL(release_yn_widgets);
|
|
||||||
static int FDECL(input_event, (int));
|
|
||||||
static void FDECL(win_visible, (Widget, XtPointer, XEvent *, Boolean *));
|
|
||||||
static void NDECL(init_standard_windows);
|
|
||||||
#ifdef X11_HANGUP_SIGNAL
|
#ifdef X11_HANGUP_SIGNAL
|
||||||
static void FDECL(X11_sig, (int));
|
static void FDECL(X11_sig, (int));
|
||||||
static void FDECL(X11_sig_cb, (XtPointer, XtSignalId *));
|
static void FDECL(X11_sig_cb, (XtPointer, XtSignalId *));
|
||||||
#endif
|
#endif
|
||||||
|
static void FDECL(d_timeout, (XtPointer, XtIntervalId *));
|
||||||
|
static void FDECL(X11_hangup, (Widget, XEvent *, String *, Cardinal *));
|
||||||
|
static void FDECL(askname_delete, (Widget, XEvent *, String *, Cardinal *));
|
||||||
|
static void FDECL(askname_done, (Widget, XtPointer, XtPointer));
|
||||||
|
static void FDECL(done_button, (Widget, XtPointer, XtPointer));
|
||||||
|
static void FDECL(getline_delete, (Widget, XEvent *, String *, Cardinal *));
|
||||||
|
static void FDECL(abort_button, (Widget, XtPointer, XtPointer));
|
||||||
|
static void NDECL(release_getline_widgets);
|
||||||
|
static void FDECL(delete_file, (Widget, XEvent *, String *, Cardinal *));
|
||||||
|
static void FDECL(dismiss_file, (Widget, XEvent *, String *, Cardinal *));
|
||||||
|
static void FDECL(yn_delete, (Widget, XEvent *, String *, Cardinal *));
|
||||||
|
static void FDECL(yn_key, (Widget, XEvent *, String *, Cardinal *));
|
||||||
|
static void NDECL(release_yn_widgets);
|
||||||
|
static int FDECL(input_event, (int));
|
||||||
|
static void FDECL(win_visible, (Widget, XtPointer, XEvent *, Boolean *));
|
||||||
|
static void NDECL(init_standard_windows);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables.
|
* Local variables.
|
||||||
@@ -474,8 +483,77 @@ Widget w;
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Global Functions ========================================================
|
static String *default_resource_data = 0; /* NULL-terminated array */
|
||||||
*/
|
|
||||||
|
/* read the template NetHack.ad into default_resource_data[] to supply
|
||||||
|
fallback resources to XtAppInitialize() */
|
||||||
|
static void
|
||||||
|
load_default_resources()
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
String inbuf;
|
||||||
|
unsigned insiz, linelen, longlen, numlines;
|
||||||
|
boolean comment = FALSE; /* lint suppression */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Running nethack via the shell script adds $HACKDIR to the path used
|
||||||
|
* by X to find resources, but running it directly doesn't. So, if we
|
||||||
|
* can find the template file for NetHack.ad in the current directory,
|
||||||
|
* load its contents into memory so that the application startup call
|
||||||
|
* in X11_init_nhwindows() can use them as fallback resources.
|
||||||
|
*/
|
||||||
|
fp = fopen("./NetHack.ad", "r");
|
||||||
|
if (!fp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* measure the file without retaining its contents */
|
||||||
|
insiz = BUFSIZ; /* stdio BUFSIZ, not nethack BUFSZ */
|
||||||
|
inbuf = (String) alloc(insiz);
|
||||||
|
linelen = longlen = 0;
|
||||||
|
numlines = 0;
|
||||||
|
while (fgets(inbuf, insiz, fp)) {
|
||||||
|
if (!linelen) /* inbuf has start of record; treat empty as comment */
|
||||||
|
comment = (*inbuf == '!' || *inbuf == '\n');
|
||||||
|
linelen += strlen(inbuf);
|
||||||
|
if (!index(inbuf, '\n'))
|
||||||
|
continue;
|
||||||
|
if (linelen > longlen)
|
||||||
|
longlen = linelen;
|
||||||
|
linelen = 0;
|
||||||
|
if (!comment)
|
||||||
|
++numlines;
|
||||||
|
}
|
||||||
|
free((genericptr_t) inbuf);
|
||||||
|
insiz = longlen + 1;
|
||||||
|
inbuf = (String) alloc(insiz);
|
||||||
|
++numlines; /* room for terminator */
|
||||||
|
default_resource_data = (String *) alloc(numlines * sizeof (String));
|
||||||
|
|
||||||
|
/* now read the file into the array */
|
||||||
|
(void) rewind(fp);
|
||||||
|
numlines = 0;
|
||||||
|
while (fgets(inbuf, insiz, fp)) {
|
||||||
|
if (*inbuf != '!' && *inbuf != '\n')
|
||||||
|
default_resource_data[numlines++] = dupstr(inbuf);
|
||||||
|
}
|
||||||
|
default_resource_data[numlines] = (String) 0;
|
||||||
|
(void) fclose(fp);
|
||||||
|
free((genericptr_t) inbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
release_default_resources()
|
||||||
|
{
|
||||||
|
if (default_resource_data) {
|
||||||
|
unsigned idx;
|
||||||
|
|
||||||
|
for (idx = 0; default_resource_data[idx]; idx++)
|
||||||
|
free((genericptr_t) default_resource_data[idx]);
|
||||||
|
free((genericptr_t) default_resource_data), default_resource_data = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Global Functions ======================================================= */
|
||||||
void
|
void
|
||||||
X11_raw_print(str)
|
X11_raw_print(str)
|
||||||
const char *str;
|
const char *str;
|
||||||
@@ -930,8 +1008,7 @@ time_t when;
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* init and exit nhwindows -------------------------------------------------
|
/* init and exit nhwindows ------------------------------------------------ */
|
||||||
*/
|
|
||||||
|
|
||||||
XtAppContext app_context; /* context of application */
|
XtAppContext app_context; /* context of application */
|
||||||
Widget toplevel = (Widget) 0; /* toplevel widget */
|
Widget toplevel = (Widget) 0; /* toplevel widget */
|
||||||
@@ -1023,6 +1100,8 @@ char **argv;
|
|||||||
/* add another option that can be set */
|
/* add another option that can be set */
|
||||||
set_wc_option_mod_status(WC_TILED_MAP, SET_IN_GAME);
|
set_wc_option_mod_status(WC_TILED_MAP, SET_IN_GAME);
|
||||||
|
|
||||||
|
load_default_resources(); /* create default_resource_data[] */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* setuid hack: make sure that if nethack is setuid, to use real uid
|
* setuid hack: make sure that if nethack is setuid, to use real uid
|
||||||
* when opening X11 connections, in case the user is using xauth, since
|
* when opening X11 connections, in case the user is using xauth, since
|
||||||
@@ -1038,15 +1117,10 @@ char **argv;
|
|||||||
num_args = 0;
|
num_args = 0;
|
||||||
XtSetArg(args[num_args], XtNallowShellResize, True); num_args++;
|
XtSetArg(args[num_args], XtNallowShellResize, True); num_args++;
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO? Find and load NetHack.ad (installation puts a template copy
|
|
||||||
* in the playground directory) if the server doesn't already have it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
toplevel = XtAppInitialize(&app_context, "NetHack", /* application */
|
toplevel = XtAppInitialize(&app_context, "NetHack", /* application */
|
||||||
(XrmOptionDescList) 0, 0, /* options list */
|
(XrmOptionDescList) 0, 0, /* options list */
|
||||||
argcp, (String *) argv, /* command line */
|
argcp, (String *) argv, /* command line */
|
||||||
(String *) 0, /* fallback resources */
|
default_resource_data, /* fallback resources */
|
||||||
(ArgList) args, num_args);
|
(ArgList) args, num_args);
|
||||||
XtOverrideTranslations(toplevel,
|
XtOverrideTranslations(toplevel,
|
||||||
XtParseTranslationTable("<Message>WM_PROTOCOLS: X11_hangup()"));
|
XtParseTranslationTable("<Message>WM_PROTOCOLS: X11_hangup()"));
|
||||||
@@ -1098,6 +1172,8 @@ char **argv;
|
|||||||
|
|
||||||
x_inited = TRUE; /* X is now initialized */
|
x_inited = TRUE; /* X is now initialized */
|
||||||
|
|
||||||
|
release_default_resources();
|
||||||
|
|
||||||
/* Display the startup banner in the message window. */
|
/* Display the startup banner in the message window. */
|
||||||
for (i = 1; i <= 4 + 2; ++i) /* (values beyond 4 yield blank lines) */
|
for (i = 1; i <= 4 + 2; ++i) /* (values beyond 4 yield blank lines) */
|
||||||
X11_putstr(WIN_MESSAGE, 0, copyright_banner_line(i));
|
X11_putstr(WIN_MESSAGE, 0, copyright_banner_line(i));
|
||||||
@@ -1169,8 +1245,7 @@ XtSignalId *id;
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* delay_output ------------------------------------------------------------
|
/* delay_output ----------------------------------------------------------- */
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Timeout callback for delay_output(). Send a fake message to the map
|
* Timeout callback for delay_output(). Send a fake message to the map
|
||||||
@@ -1216,8 +1291,7 @@ X11_delay_output()
|
|||||||
(void) x_event(EXIT_ON_SENT_EVENT);
|
(void) x_event(EXIT_ON_SENT_EVENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* X11_hangup --------------------------------------------------------------
|
/* X11_hangup ------------------------------------------------------------- */
|
||||||
*/
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
static void
|
static void
|
||||||
X11_hangup(w, event, params, num_params)
|
X11_hangup(w, event, params, num_params)
|
||||||
@@ -1235,8 +1309,7 @@ Cardinal *num_params;
|
|||||||
exit_x_event = TRUE;
|
exit_x_event = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* askname -----------------------------------------------------------------
|
/* askname ---------------------------------------------------------------- */
|
||||||
*/
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
static void
|
static void
|
||||||
askname_delete(w, event, params, num_params)
|
askname_delete(w, event, params, num_params)
|
||||||
@@ -1322,8 +1395,7 @@ X11_askname()
|
|||||||
XtDestroyWidget(popup);
|
XtDestroyWidget(popup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* getline -----------------------------------------------------------------
|
/* getline ---------------------------------------------------------------- */
|
||||||
*/
|
|
||||||
/* This uses Tim Theisen's dialog widget set (from GhostView). */
|
/* This uses Tim Theisen's dialog widget set (from GhostView). */
|
||||||
|
|
||||||
static Widget getline_popup, getline_dialog;
|
static Widget getline_popup, getline_dialog;
|
||||||
@@ -1448,8 +1520,7 @@ char *input;
|
|||||||
(void) x_event(EXIT_ON_EXIT);
|
(void) x_event(EXIT_ON_EXIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display file ------------------------------------------------------------
|
/* Display file ----------------------------------------------------------- */
|
||||||
*/
|
|
||||||
static const char display_translations[] = "#override\n\
|
static const char display_translations[] = "#override\n\
|
||||||
<Key>q: dismiss_file()\n\
|
<Key>q: dismiss_file()\n\
|
||||||
<Key>Escape: dismiss_file()\n\
|
<Key>Escape: dismiss_file()\n\
|
||||||
@@ -1606,8 +1677,7 @@ boolean complain;
|
|||||||
free(textlines);
|
free(textlines);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* yn_function -------------------------------------------------------------
|
/* yn_function ------------------------------------------------------------ */
|
||||||
*/
|
|
||||||
/* (not threaded) */
|
/* (not threaded) */
|
||||||
|
|
||||||
static const char *yn_quitchars = " \n\r";
|
static const char *yn_quitchars = " \n\r";
|
||||||
@@ -1908,8 +1978,7 @@ const char *pref;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End global functions ====================================================
|
/* End global functions =================================================== */
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Before we wait for input via nhgetch() and nh_poskey(), we need to
|
* Before we wait for input via nhgetch() and nh_poskey(), we need to
|
||||||
|
|||||||
Reference in New Issue
Block a user