1/*	SCCS Id: @(#)winX.h	3.4	1996/08/18	*/
2/* Copyright (c) Dean Luick, 1992				  */
3/* NetHack may be freely redistributed.  See license for details. */
4
5/*
6 * Definitions for the X11 window-port.  See doc/window.doc for details on
7 * the window interface.
8 */
9#ifndef WINX_H
10#define WINX_H
11
12#ifndef E
13#define E extern
14#endif
15
16#if defined(BOS) || defined(NHSTDC)
17#define DIMENSION_P int
18#else
19# ifdef WIDENED_PROTOTYPES
20#define DIMENSION_P unsigned int
21# else
22#define DIMENSION_P Dimension
23# endif
24#endif
25
26/*
27 * Generic text buffer.
28 */
29#define START_SIZE 512	/* starting text buffer size */
30struct text_buffer {
31    char *text;
32    int  text_size;
33    int  text_last;
34    int  num_lines;
35};
36
37
38/*
39 * Information specific to a map window.
40 */
41struct text_map_info_t {
42    unsigned char   text[ROWNO][COLNO]; /* Actual displayed screen. */
43#ifdef TEXTCOLOR
44    unsigned char   colors[ROWNO][COLNO];	/* Color of each character. */
45    GC		    color_gcs[CLR_MAX],		/* GC for each color */
46		    inv_color_gcs[CLR_MAX];	/* GC for each inverse color */
47#define copy_gc     color_gcs[NO_COLOR]
48#define inv_copy_gc inv_color_gcs[NO_COLOR]
49#else
50    GC		    copy_gc,			/* Drawing GC */
51		    inv_copy_gc;		/* Inverse drawing GC */
52#endif
53};
54
55struct tile_map_info_t {
56    unsigned short glyphs[ROWNO][COLNO];	/* Saved glyph numbers. */
57    GC	white_gc;
58    GC	black_gc;
59    unsigned long image_width;			/* dimensions of tile image */
60    unsigned long image_height;
61};
62
63struct map_info_t {
64    Dimension	    viewport_width,	/* Saved viewport size, so we can */
65		    viewport_height;	/*   clip to cursor on a resize.  */
66    unsigned char   t_start[ROWNO],	/* Starting column for new info. */
67		    t_stop[ROWNO];	/* Ending column for new info. */
68    int		    square_width,	/* Saved font/tile information so */
69		    square_height,	/*   we can calculate the correct */
70		    square_ascent,	/*   placement of changes.	  */
71		    square_lbearing;
72    boolean	    is_tile;
73    union {
74	struct text_map_info_t *text_map;
75	struct tile_map_info_t *tile_map;
76    } mtype;
77};
78
79
80/*
81 * Information specific to a message window.
82 */
83struct line_element {
84    struct line_element *next;
85    char *line;			/* char buffer */
86    int  buf_length;		/* length of buffer */
87    int  str_length;		/* length of string in buffer */
88};
89
90struct mesg_info_t {
91    XFontStruct *fs;		/* Font for the window. */
92    int		num_lines;	/* line count */
93    struct line_element *head;	/* head of circular line queue */
94    struct line_element *line_here;/* current drawn line position */
95    struct line_element *last_pause;/* point to the line after the prev */
96				/*     bottom of screen			*/
97    struct line_element *last_pause_head;/* pointer to head of previous */
98				/* turn					*/
99    GC		gc;		/* GC for text drawing */
100    int		char_width,	/* Saved font information so we can  */
101		char_height,	/*   calculate the correct placement */
102		char_ascent,	/*   of changes.		     */
103		char_lbearing;
104    Dimension	viewport_width, /* Saved viewport size, so we can adjust */
105		viewport_height;/*   the slider on a resize.		 */
106    Boolean	dirty;		/* Lines have been added to the window. */
107};
108
109/*
110 * Information specific to a "text" status window.
111 */
112struct status_info_t {
113    struct text_buffer text;	/* Just a text buffer. */
114};
115
116/*
117 * Information specific to a menu window.  First a structure for each
118 * menu entry, then the structure for each menu window.
119 */
120typedef struct x11_mi {
121    struct x11_mi *next;
122    anything identifier;	/* Opaque type to identify this selection */
123    long pick_count;		/* specific selection count; -1 if none */
124    char *str;			/* The text of the item. */
125    int  attr;			/* Attribute for the line. */
126    boolean selected;		/* Been selected? */
127    char selector;		/* Char used to select this entry. */
128    char gselector;		/* Group selector. */
129} x11_menu_item;
130
131struct menu {
132    x11_menu_item *base;	/* Starting pointer for item list. */
133    x11_menu_item *last;	/* End pointer for item list. */
134    const char	  *query;	/* Query string. */
135    const char	  *gacc;	/* Group accelerators. */
136    int		  count;	/* Number of strings. */
137    String	  *list_pointer;/* String list. */
138    Boolean	  *sensitive;	/* Active list. */
139    char	  curr_selector;/* Next keyboard accelerator to assign, */
140				/*   if 0, then we're out.		*/
141};
142
143struct menu_info_t {
144    struct menu curr_menu;	/* Menu being displayed. */
145    struct menu new_menu;	/* New menu being built. */
146
147    XFontStruct *fs;		/* Font for the window. */
148    long menu_count;		/* number entered by user */
149    Dimension line_height;	/* Total height of a line of text. */
150    Dimension internal_height;	/* Internal height between widget & border */
151    Dimension internal_width;	/* Internal width between widget & border */
152    short how;			/* Menu mode PICK_NONE, PICK_ONE, PICK_ANY */
153    boolean valid_widgets;	/* TRUE if widgets have been created. */
154    boolean is_menu;		/* Has been confirmed to being a menu window. */
155    boolean is_active;		/* TRUE when waiting for user input. */
156    boolean is_up;		/* TRUE when window is popped-up. */
157    boolean cancelled;	/* Menu has been explicitly cancelled. */
158    boolean counting;	/* true when menu_count has a valid value */
159};
160
161/*
162 * Information specific to a text window.
163 */
164struct text_info_t {
165    struct text_buffer text;
166    XFontStruct *fs;		/* Font for the text window. */
167    int		max_width;	/* Width of widest line so far. */
168    int		extra_width,	/* Sum of left and right border widths. */
169		extra_height;	/* Sum of top and bottom border widths. */
170    boolean	blocked;	/*  */
171    boolean	destroy_on_ack; /* Destroy this window when acknowleged. */
172#ifdef GRAPHIC_TOMBSTONE
173    boolean	is_rip;		/* This window needs a tombstone. */
174#endif
175};
176
177
178/*
179 * Basic window structure.
180 */
181struct xwindow {
182    int       type;		/* type of nethack window */
183    Widget    popup;		/* direct parent of widget w or viewport */
184    Widget    w;		/* the widget that does things */
185    Dimension pixel_width;	/* window size, in pixels */
186    Dimension pixel_height;
187    int       prevx, cursx;	/* Cursor position, only used by    */
188    int       prevy, cursy;	/*   map and "plain" status windows.*/
189
190    union {
191	struct map_info_t    *Map_info;     /* map window info */
192	struct mesg_info_t   *Mesg_info;    /* message window info */
193	struct status_info_t *Status_info;  /* status window info */
194	struct menu_info_t   *Menu_info;    /* menu window info */
195	struct text_info_t   *Text_info;    /* menu window info */
196    } Win_info;
197    boolean	keep_window;
198};
199
200/* Defines to use for the window information union. */
201#define map_information    Win_info.Map_info
202#define mesg_information   Win_info.Mesg_info
203#define status_information Win_info.Status_info
204#define menu_information   Win_info.Menu_info
205#define text_information   Win_info.Text_info
206
207
208#define MAX_WINDOWS 20		/* max number of open windows */
209
210#define NHW_NONE 0		/* Unallocated window type.  Must be	*/
211				/* different from any other NHW_* type. */
212
213#define NO_CLICK 0		/* No click occured on the map window. Must */
214				/* be different than CLICK_1 and CLICK_2.   */
215
216#define DEFAULT_MESSAGE_WIDTH 60/* width in chars of the message window */
217
218#define DISPLAY_FILE_SIZE 35	/* Max number of lines in the default	*/
219				/* file display window.			*/
220
221#define MAX_KEY_STRING 64	/* String size for converting a keypress */
222				/* event into a character(s)		 */
223
224#define DEFAULT_LINES_DISPLAYED 12 /* # of lines displayed message window */
225#define MAX_HISTORY 60		/* max history saved on message window */
226
227
228/* Window variables (winX.c). */
229E struct xwindow window_list[MAX_WINDOWS];
230E XtAppContext	 app_context;		/* context of application */
231E Widget	 toplevel;		/* toplevel widget */
232E Atom		 wm_delete_window;	/* delete window protocol */
233E boolean	 exit_x_event;		/* exit condition for event loop */
234#define EXIT_ON_KEY_PRESS	    0	/* valid values for exit_x_event */
235#define EXIT_ON_KEY_OR_BUTTON_PRESS 1
236#define EXIT_ON_EXIT		    2
237#define EXIT_ON_SENT_EVENT	    3
238E int click_x, click_y, click_button, updated_inventory;
239
240typedef struct {
241    Boolean slow;
242    Boolean autofocus;
243    Boolean message_line;
244    Boolean double_tile_size;	/* double tile size */
245    String  tile_file;		/* name of file to open for tiles */
246    String  icon;		/* name of desired icon */
247    int     message_lines;	/* number of lines to attempt to show */
248    String  pet_mark_bitmap;	/* X11 bitmap file used to mark pets */
249    Pixel   pet_mark_color;	/* color of pet mark */
250#ifdef GRAPHIC_TOMBSTONE
251    String  tombstone;		/* name of XPM file for tombstone */
252    int     tombtext_x;		/* x-coord of center of first tombstone text */
253    int     tombtext_y;		/* y-coord of center of first tombstone text */
254    int     tombtext_dx;	/* x-displacement between tombstone line */
255    int     tombtext_dy;	/* y-displacement between tombstone line */
256#endif
257} AppResources;
258
259E AppResources appResources;
260E void (*input_func)();
261
262extern struct window_procs X11_procs;
263
264/* Check for an invalid window id. */
265#define check_winid(window)					\
266	if ((window) < 0 || (window) >= MAX_WINDOWS) {		\
267	    panic("illegal windid [%d] in %s at line %d",	\
268		window, __FILE__, __LINE__);			\
269	}
270
271
272/* ### dialogs.c ### */
273E Widget FDECL(CreateDialog, (Widget, String, XtCallbackProc, XtCallbackProc));
274E void FDECL(SetDialogPrompt,(Widget, String));
275E String FDECL(GetDialogResponse,(Widget));
276E void FDECL(SetDialogResponse,(Widget, String));
277E void FDECL(positionpopup,(Widget,BOOLEAN_P));
278
279/* ### winX.c ### */
280E struct xwindow *FDECL(find_widget,(Widget));
281E Boolean FDECL(nhApproxColor,(Screen*, Colormap, char*, XColor*));
282E Dimension FDECL(nhFontHeight,(Widget));
283E char FDECL(key_event_to_char,(XKeyEvent*));
284E void FDECL(msgkey, (Widget, XtPointer, XEvent*));
285E void FDECL(nh_XtPopup, (Widget, int, Widget));
286E void FDECL(nh_XtPopdown, (Widget));
287E void NDECL(win_X11_init);
288E void FDECL(nh_keyscroll, (Widget, XEvent*, String*, Cardinal*));
289
290/* ### winmesg.c ### */
291E void FDECL(set_message_slider, (struct xwindow*));
292E void FDECL(create_message_window,(struct xwindow*, BOOLEAN_P, Widget));
293E void FDECL(destroy_message_window,(struct xwindow*));
294E void FDECL(display_message_window, (struct xwindow*));
295E void FDECL(append_message,(struct xwindow*, const char*));
296E void FDECL(set_last_pause, (struct xwindow*));
297
298/* ### winmap.c ### */
299E void NDECL(post_process_tiles);
300E void FDECL(check_cursor_visibility,(struct xwindow*));
301E void FDECL(display_map_window,(struct xwindow*));
302E void FDECL(clear_map_window,(struct xwindow*));
303E void FDECL(map_input, (Widget, XEvent*, String*, Cardinal*));
304E void FDECL(set_map_size,(struct xwindow*, DIMENSION_P, DIMENSION_P));
305E void FDECL(create_map_window,(struct xwindow*, BOOLEAN_P, Widget));
306E void FDECL(destroy_map_window,(struct xwindow*));
307E int  FDECL(x_event,(int));
308
309/* ### winmenu.c ### */
310E void FDECL(menu_delete, (Widget, XEvent*, String*, Cardinal*));
311E void FDECL(menu_key,(Widget, XEvent*, String*, Cardinal*));
312E void FDECL(create_menu_window,(struct xwindow*));
313E void FDECL(destroy_menu_window,(struct xwindow*));
314
315/* ### winmisc.c ### */
316E void FDECL(ps_key,(Widget, XEvent*, String*, Cardinal*)); /* player selection action */
317E void FDECL(race_key,(Widget, XEvent*, String*, Cardinal*)); /* race selection action */
318E void FDECL(gend_key, (Widget,XEvent *,String *,Cardinal *)); /* gender */
319E void FDECL(algn_key, (Widget,XEvent *,String *,Cardinal *)); /* alignment */
320E void FDECL(ec_delete, (Widget, XEvent*, String*, Cardinal*));
321E void FDECL(ec_key,(Widget, XEvent*, String*, Cardinal*)); /* extended command action */
322
323/* ### winstatus.c ### */
324E void FDECL(create_status_window,(struct xwindow*, BOOLEAN_P, Widget));
325E void FDECL(destroy_status_window,(struct xwindow*));
326E void FDECL(adjust_status,(struct xwindow*, const char*));
327E void NDECL(null_out_status);
328E void NDECL(check_turn_events);
329
330/* ### wintext.c ### */
331E void FDECL(delete_text, (Widget, XEvent*, String*, Cardinal*));
332E void FDECL(dismiss_text,(Widget, XEvent*, String*, Cardinal*));
333E void FDECL(key_dismiss_text,(Widget, XEvent*, String*, Cardinal*));
334#ifdef GRAPHIC_TOMBSTONE
335E void FDECL(rip_dismiss_text,(Widget, XEvent*, String*, Cardinal*));
336#endif
337E void FDECL(add_to_text_window,(struct xwindow*, int, const char*));
338E void FDECL(display_text_window,(struct xwindow*, BOOLEAN_P));
339E void FDECL(create_text_window,(struct xwindow*));
340E void FDECL(destroy_text_window,(struct xwindow*));
341E void FDECL(clear_text_window,(struct xwindow*));
342E void FDECL(append_text_buffer,(struct text_buffer*, const char*, BOOLEAN_P)); /* text buffer routines */
343E void FDECL(init_text_buffer,(struct text_buffer*));
344E void FDECL(clear_text_buffer,(struct text_buffer*));
345E void FDECL(free_text_buffer,(struct text_buffer*));
346#ifdef GRAPHIC_TOMBSTONE
347E void FDECL(calculate_rip_text, (int));
348#endif
349
350
351/* ### winval.c ### */
352E Widget FDECL(create_value,(Widget, const char*));
353E void	 FDECL(set_name,(Widget, char*));
354E void	 FDECL(set_name_width,(Widget, int));
355E int	 FDECL(get_name_width,(Widget));
356E void	 FDECL(set_value,(Widget, const char*));
357E void	 FDECL(set_value_width,(Widget, int));
358E int	 FDECL(get_value_width,(Widget));
359E void	 FDECL(hilight_value,(Widget));
360E void	 FDECL(swap_fg_bg,(Widget));
361
362/* external declarations */
363E void FDECL(X11_init_nhwindows, (int *, char **));
364E void NDECL(X11_player_selection);
365E void NDECL(X11_askname);
366E void NDECL(X11_get_nh_event) ;
367E void FDECL(X11_exit_nhwindows, (const char *));
368E void FDECL(X11_suspend_nhwindows, (const char *));
369E void NDECL(X11_resume_nhwindows);
370E winid FDECL(X11_create_nhwindow, (int));
371E void FDECL(X11_clear_nhwindow, (winid));
372E void FDECL(X11_display_nhwindow, (winid, BOOLEAN_P));
373E void FDECL(X11_destroy_nhwindow, (winid));
374E void FDECL(X11_curs, (winid,int,int));
375E void FDECL(X11_putstr, (winid, int, const char *));
376E void FDECL(X11_display_file, (const char *, BOOLEAN_P));
377E void FDECL(X11_start_menu, (winid));
378E void FDECL(X11_add_menu, (winid,int,const ANY_P *,
379			CHAR_P, CHAR_P, int, const char *, BOOLEAN_P));
380E void FDECL(X11_end_menu, (winid, const char *));
381E int FDECL(X11_select_menu, (winid, int, MENU_ITEM_P **));
382E void NDECL(X11_update_inventory);
383E void NDECL(X11_mark_synch);
384E void NDECL(X11_wait_synch);
385#ifdef CLIPPING
386E void FDECL(X11_cliparound, (int, int));
387#endif
388E void FDECL(X11_print_glyph, (winid,XCHAR_P,XCHAR_P,int));
389E void FDECL(X11_raw_print, (const char *));
390E void FDECL(X11_raw_print_bold, (const char *));
391E int NDECL(X11_nhgetch);
392E int FDECL(X11_nh_poskey, (int *, int *, int *));
393E void NDECL(X11_nhbell);
394E int NDECL(X11_doprev_message);
395E char FDECL(X11_yn_function, (const char *, const char *, CHAR_P));
396E void FDECL(X11_getlin, (const char *,char *));
397E int NDECL(X11_get_ext_cmd);
398E void FDECL(X11_number_pad, (int));
399E void NDECL(X11_delay_output);
400
401/* other defs that really should go away (they're tty specific) */
402E void NDECL(X11_start_screen);
403E void NDECL(X11_end_screen);
404
405#ifdef GRAPHIC_TOMBSTONE
406E void FDECL(X11_outrip, (winid,int));
407#else
408E void FDECL(genl_outrip, (winid,int));
409#endif
410
411#endif /* WINX_H */
412