OSDN Git Service

upgrade to 3.6.1
[jnethack/source.git] / win / chain / wc_chainin.c
1 /* NetHack 3.6  wc_chainin.c    $NHDT-Date: 1433806610 2015/06/08 23:36:50 $  $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
2 /* Copyright (c) Kenneth Lorber, 2012                             */
3 /* NetHack may be freely redistributed.  See license for details. */
4
5 /* -chainin is an internal processor that changes the flow from window_procs
6  * to chain_procs. */
7
8 #include "hack.h"
9
10 struct chainin_data {
11     struct chain_procs *nprocs;
12     void *ndata;
13
14     int linknum;
15 };
16
17 /* Normally, a processor gets this information from the first parm of each
18  * call, but here we are keeping the original API, so that parm doesn't exist,
19  * so we use this instead. */
20 static struct chainin_data *cibase;
21
22 void *
23 chainin_procs_chain(cmd, n, me, nextprocs, nextdata)
24 int cmd;
25 int n;
26 void *me;
27 void *nextprocs;
28 void *nextdata;
29 {
30     switch (cmd) {
31     case WINCHAIN_ALLOC: {
32         struct chainin_data *tdp = calloc(1, sizeof(struct chainin_data));
33         tdp->linknum = n;
34         cibase = tdp;
35         return tdp;
36     }
37     case WINCHAIN_INIT: {
38         struct chainin_data *tdp = me;
39         tdp->nprocs = nextprocs;
40         tdp->ndata = nextdata;
41         return tdp;
42     }
43     default:
44         raw_printf("chainin_procs_chain: bad cmd\n");
45         exit(EXIT_FAILURE);
46     }
47 }
48
49 /* XXX if we don't need this, take it out of the table */
50 void
51 chainin_procs_init(dir)
52 int dir UNUSED;
53 {
54 }
55
56 /***
57  *** winprocs
58  ***/
59
60 void
61 chainin_init_nhwindows(argcp, argv)
62 int *argcp;
63 char **argv;
64 {
65     (*cibase->nprocs->win_init_nhwindows)(cibase->ndata, argcp, argv);
66 }
67
68 void
69 chainin_player_selection()
70 {
71     (*cibase->nprocs->win_player_selection)(cibase->ndata);
72 }
73
74 void
75 chainin_askname()
76 {
77     (*cibase->nprocs->win_askname)(cibase->ndata);
78 }
79
80 void
81 chainin_get_nh_event()
82 {
83     (*cibase->nprocs->win_get_nh_event)(cibase->ndata);
84 }
85
86 void
87 chainin_exit_nhwindows(str)
88 const char *str;
89 {
90     (*cibase->nprocs->win_exit_nhwindows)(cibase->ndata, str);
91 }
92
93 void
94 chainin_suspend_nhwindows(str)
95 const char *str;
96 {
97     (*cibase->nprocs->win_suspend_nhwindows)(cibase->ndata, str);
98 }
99
100 void
101 chainin_resume_nhwindows()
102 {
103     (*cibase->nprocs->win_resume_nhwindows)(cibase->ndata);
104 }
105
106 winid
107 chainin_create_nhwindow(type)
108 int type;
109 {
110     winid rv;
111
112     rv = (*cibase->nprocs->win_create_nhwindow)(cibase->ndata, type);
113
114     return rv;
115 }
116
117 void
118 chainin_clear_nhwindow(window)
119 winid window;
120 {
121     (*cibase->nprocs->win_clear_nhwindow)(cibase->ndata, window);
122 }
123
124 void
125 chainin_display_nhwindow(window, blocking)
126 winid window;
127 BOOLEAN_P blocking;
128 {
129     (*cibase->nprocs->win_display_nhwindow)(cibase->ndata, window, blocking);
130 }
131
132 void
133 chainin_destroy_nhwindow(window)
134 winid window;
135 {
136     (*cibase->nprocs->win_destroy_nhwindow)(cibase->ndata, window);
137 }
138
139 void
140 chainin_curs(window, x, y)
141 winid window;
142 int x;
143 int y;
144 {
145     (*cibase->nprocs->win_curs)(cibase->ndata, window, x, y);
146 }
147
148 void
149 chainin_putstr(window, attr, str)
150 winid window;
151 int attr;
152 const char *str;
153 {
154     (*cibase->nprocs->win_putstr)(cibase->ndata, window, attr, str);
155 }
156
157 void
158 chainin_putmixed(window, attr, str)
159 winid window;
160 int attr;
161 const char *str;
162 {
163     (*cibase->nprocs->win_putmixed)(cibase->ndata, window, attr, str);
164 }
165
166 void
167 chainin_display_file(fname, complain)
168 const char *fname;
169 boolean complain;
170 {
171     (*cibase->nprocs->win_display_file)(cibase->ndata, fname, complain);
172 }
173
174 void
175 chainin_start_menu(window)
176 winid window;
177 {
178     (*cibase->nprocs->win_start_menu)(cibase->ndata, window);
179 }
180
181 void
182 chainin_add_menu(window, glyph, identifier, ch, gch, attr, str, preselected)
183 winid window;               /* window to use, must be of type NHW_MENU */
184 int glyph;                  /* glyph to display with item (unused) */
185 const anything *identifier; /* what to return if selected */
186 char ch;                    /* keyboard accelerator (0 = pick our own) */
187 char gch;                   /* group accelerator (0 = no group) */
188 int attr;                   /* attribute for string (like tty_putstr()) */
189 const char *str;            /* menu string */
190 boolean preselected;        /* item is marked as selected */
191 {
192     (*cibase->nprocs->win_add_menu)(cibase->ndata, window, glyph, identifier,
193                                     ch, gch, attr, str, preselected);
194 }
195
196 void
197 chainin_end_menu(window, prompt)
198 winid window;
199 const char *prompt;
200 {
201     (*cibase->nprocs->win_end_menu)(cibase->ndata, window, prompt);
202 }
203
204 int
205 chainin_select_menu(window, how, menu_list)
206 winid window;
207 int how;
208 menu_item **menu_list;
209 {
210     int rv;
211
212     rv = (*cibase->nprocs->win_select_menu)(cibase->ndata, window, how,
213                                             (void *) menu_list);
214
215     return rv;
216 }
217
218 char
219 chainin_message_menu(let, how, mesg)
220 char let;
221 int how;
222 const char *mesg;
223 {
224     char rv;
225
226     rv = (*cibase->nprocs->win_message_menu)(cibase->ndata, let, how, mesg);
227
228     return rv;
229 }
230
231 void
232 chainin_update_inventory()
233 {
234     (*cibase->nprocs->win_update_inventory)(cibase->ndata);
235 }
236
237 void
238 chainin_mark_synch()
239 {
240     (*cibase->nprocs->win_mark_synch)(cibase->ndata);
241 }
242
243 void
244 chainin_wait_synch()
245 {
246     (*cibase->nprocs->win_wait_synch)(cibase->ndata);
247 }
248
249 #ifdef CLIPPING
250 void
251 chainin_cliparound(x, y)
252 int x;
253 int y;
254 {
255     (*cibase->nprocs->win_cliparound)(cibase->ndata, x, y);
256 }
257 #endif
258
259 #ifdef POSITIONBAR
260 void
261 chainin_update_positionbar(posbar)
262 char *posbar;
263 {
264     (*cibase->nprocs->win_update_positionbar)(cibase->ndata, posbar);
265 }
266 #endif
267
268 /* XXX can we decode the glyph in a meaningful way? */
269 void
270 chainin_print_glyph(window, x, y, glyph, bkglyph)
271 winid window;
272 xchar x, y;
273 int glyph, bkglyph;
274 {
275     (*cibase->nprocs->win_print_glyph)(cibase->ndata, window, x, y, glyph, bkglyph);
276 }
277
278 void
279 chainin_raw_print(str)
280 const char *str;
281 {
282     (*cibase->nprocs->win_raw_print)(cibase->ndata, str);
283 }
284
285 void
286 chainin_raw_print_bold(str)
287 const char *str;
288 {
289     (*cibase->nprocs->win_raw_print_bold)(cibase->ndata, str);
290 }
291
292 int
293 chainin_nhgetch()
294 {
295     int rv;
296
297     rv = (*cibase->nprocs->win_nhgetch)(cibase->ndata);
298
299     return rv;
300 }
301
302 int
303 chainin_nh_poskey(x, y, mod)
304 int *x;
305 int *y;
306 int *mod;
307 {
308     int rv;
309
310     rv = (*cibase->nprocs->win_nh_poskey)(cibase->ndata, x, y, mod);
311
312     return rv;
313 }
314
315 void
316 chainin_nhbell()
317 {
318     (*cibase->nprocs->win_nhbell)(cibase->ndata);
319 }
320
321 int
322 chainin_doprev_message()
323 {
324     int rv;
325
326     rv = (*cibase->nprocs->win_doprev_message)(cibase->ndata);
327
328     return rv;
329 }
330
331 char
332 chainin_yn_function(query, resp, def)
333 const char *query, *resp;
334 char def;
335 {
336     int rv;
337
338     rv = (*cibase->nprocs->win_yn_function)(cibase->ndata, query, resp, def);
339
340     return rv;
341 }
342
343 void
344 chainin_getlin(query, bufp)
345 const char *query;
346 char *bufp;
347 {
348     (*cibase->nprocs->win_getlin)(cibase->ndata, query, bufp);
349 }
350
351 int
352 chainin_get_ext_cmd()
353 {
354     int rv;
355
356     rv = (*cibase->nprocs->win_get_ext_cmd)(cibase->ndata);
357
358     return rv;
359 }
360
361 void
362 chainin_number_pad(state)
363 int state;
364 {
365     (*cibase->nprocs->win_number_pad)(cibase->ndata, state);
366 }
367
368 void
369 chainin_delay_output()
370 {
371     (*cibase->nprocs->win_delay_output)(cibase->ndata);
372 }
373
374 #ifdef CHANGE_COLOR
375 void
376 chainin_change_color(color, value, reverse)
377 int color;
378 long value;
379 int reverse;
380 {
381     (*cibase->nprocs->win_change_color)(cibase->ndata, color, value, reverse);
382 }
383
384 #ifdef MAC
385 void
386 chainin_change_background(bw)
387 int bw;
388 {
389     (*cibase->nprocs->win_change_background)(cibase->ndata, bw);
390 }
391
392 short
393 chainin_set_font_name(window, font)
394 winid window;
395 char *font;
396 {
397     short rv;
398
399     rv = (*cibase->nprocs->win_set_font_name)(cibase->ndata, window, font);
400
401     return rv;
402 }
403 #endif
404
405 char *
406 trace_get_color_string()
407 {
408     char *rv;
409
410     rv = (*cibase->nprocs->win_get_color_string)(cibase->ndata);
411
412     return rv;
413 }
414
415 #endif
416
417 /* other defs that really should go away (they're tty specific) */
418 void
419 chainin_start_screen()
420 {
421     (*cibase->nprocs->win_start_screen)(cibase->ndata);
422 }
423
424 void
425 chainin_end_screen()
426 {
427     (*cibase->nprocs->win_end_screen)(cibase->ndata);
428 }
429
430 void
431 chainin_outrip(tmpwin, how, when)
432 winid tmpwin;
433 int how;
434 time_t when;
435 {
436     (*cibase->nprocs->win_outrip)(cibase->ndata, tmpwin, how, when);
437 }
438
439 void
440 chainin_preference_update(pref)
441 const char *pref;
442 {
443     (*cibase->nprocs->win_preference_update)(cibase->ndata, pref);
444 }
445
446 char *
447 chainin_getmsghistory(init)
448 boolean init;
449 {
450     char *rv;
451
452     rv = (*cibase->nprocs->win_getmsghistory)(cibase->ndata, init);
453
454     return rv;
455 }
456
457 void
458 chainin_putmsghistory(msg, is_restoring)
459 const char *msg;
460 boolean is_restoring;
461 {
462     (*cibase->nprocs->win_putmsghistory)(cibase->ndata, msg, is_restoring);
463 }
464
465 void
466 chainin_status_init()
467 {
468     (*cibase->nprocs->win_status_init)(cibase->ndata);
469 }
470
471 void
472 chainin_status_finish()
473 {
474     (*cibase->nprocs->win_status_finish)(cibase->ndata);
475 }
476
477 void
478 chainin_status_enablefield(fieldidx, nm, fmt, enable)
479 int fieldidx;
480 const char *nm;
481 const char *fmt;
482 boolean enable;
483 {
484     (*cibase->nprocs->win_status_enablefield)(cibase->ndata, fieldidx, nm,
485                                               fmt, enable);
486 }
487
488 void
489 chainin_status_update(idx, ptr, chg, percent, color, colormasks)
490 int idx, chg, percent, color;
491 genericptr_t ptr;
492 unsigned long *colormasks;
493 {
494     (*cibase->nprocs->win_status_update)(cibase->ndata, idx, ptr, chg,
495                                          percent, color, colormasks);
496 }
497
498 boolean
499 chainin_can_suspend()
500 {
501     boolean rv;
502
503     rv = (*cibase->nprocs->win_can_suspend)(cibase->ndata);
504
505     return rv;
506 }
507
508 struct window_procs chainin_procs = {
509     "-chainin", 0, /* wincap */
510     0,             /* wincap2 */
511     /*
512     XXX problem - the above need to come from the real window port, possibly
513     modified.  May need to do something to call an additional init fn later
514     or if this is the only place like this the choose_windows fn can do the
515     fixup
516     (but not if the value can be modified by the stack?)  TBD
517     */
518     chainin_init_nhwindows,
519     chainin_player_selection, chainin_askname, chainin_get_nh_event,
520     chainin_exit_nhwindows, chainin_suspend_nhwindows,
521     chainin_resume_nhwindows, chainin_create_nhwindow, chainin_clear_nhwindow,
522     chainin_display_nhwindow, chainin_destroy_nhwindow, chainin_curs,
523     chainin_putstr, chainin_putmixed, chainin_display_file,
524     chainin_start_menu, chainin_add_menu, chainin_end_menu,
525     chainin_select_menu, chainin_message_menu, chainin_update_inventory,
526     chainin_mark_synch, chainin_wait_synch,
527 #ifdef CLIPPING
528     chainin_cliparound,
529 #endif
530 #ifdef POSITIONBAR
531     chainin_update_positionbar,
532 #endif
533     chainin_print_glyph, chainin_raw_print, chainin_raw_print_bold,
534     chainin_nhgetch, chainin_nh_poskey, chainin_nhbell,
535     chainin_doprev_message, chainin_yn_function, chainin_getlin,
536     chainin_get_ext_cmd, chainin_number_pad, chainin_delay_output,
537 #ifdef CHANGE_COLOR
538     chainin_change_color,
539 #ifdef MAC
540     chainin_change_background, chainin_set_font_name,
541 #endif
542     chainin_get_color_string,
543 #endif
544
545     chainin_start_screen, chainin_end_screen,
546
547     chainin_outrip, chainin_preference_update, chainin_getmsghistory,
548     chainin_putmsghistory,
549     chainin_status_init, chainin_status_finish, chainin_status_enablefield,
550     chainin_status_update,
551     chainin_can_suspend,
552 };