Initial revision
[chise/xemacs-chise.git.1] / src / console.h
1 /* Define console object for XEmacs.
2    Copyright (C) 1996 Ben Wing
3
4 This file is part of XEmacs.
5
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING.  If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 /* Synched up with: Not in FSF. */
22
23 /* Written by Ben Wing. */
24
25 #ifndef _XEMACS_CONSOLE_H_
26 #define _XEMACS_CONSOLE_H_
27
28 /* Devices and consoles are similar entities.  The idea is that
29    a console represents a physical keyboard/mouse/other-input-source
30    while a device represents a display where frames appear on.
31    In the X world, a console is a "Display" while a device is a
32    "Screen".  Implementationally, it can sometimes get confusing:
33    under X, multiple devices on a single console are different
34    "Display" connections to what is in reality the same Display on
35    the same server.  Because of this, input comes from the device
36    and not from the console.  This is OK because events are basically
37    always tagged to a particular X window (i.e. frame),
38    which exists on only one screen; therefore the event won't be
39    reported multiple times even if there are multiple devices on
40    the same physical display.  This is an implementational detail
41    specific to X consoles (e.g. under NeXTstep or Windows, this
42    could be different, and input would come directly from the console).
43 */
44
45
46 /* GCC does not like forward enum declaration. This needs to be
47    defined here. What a disgust! */
48
49 enum device_metrics
50 {
51   DM_color_default, DM_color_select, DM_color_balloon, DM_color_3d_face,
52   DM_color_3d_light, DM_color_3d_dark, DM_color_menu, DM_color_menu_highlight,
53   DM_color_menu_button, DM_color_menu_disabled, DM_color_toolbar,
54   DM_color_scrollbar, DM_color_desktop, DM_color_workspace, DM_font_default,
55   DM_font_menubar, DM_font_dialog, DM_size_cursor, DM_size_scrollbar,
56   DM_size_menu, DM_size_toolbar, DM_size_toolbar_button,
57   DM_size_toolbar_border, DM_size_icon, DM_size_icon_small, DM_size_device,
58   DM_size_workspace, DM_size_device_mm, DM_device_dpi, DM_num_bit_planes,
59   DM_num_color_cells, DM_mouse_buttons, DM_swap_buttons, DM_show_sounds,
60   DM_slow_device, DM_security
61 };
62
63 struct console_methods
64 {
65   CONST char *name;     /* Used by print_console, print_device, print_frame */
66   Lisp_Object symbol;
67   Lisp_Object predicate_symbol;
68
69   /* console methods */
70   void (*init_console_method) (struct console *, Lisp_Object props);
71   void (*mark_console_method) (struct console *, void (*)(Lisp_Object));
72   int (*initially_selected_for_input_method) (struct console *);
73   void (*delete_console_method) (struct console *);
74   Lisp_Object (*semi_canonicalize_console_connection_method)
75     (Lisp_Object connection, Error_behavior errb);
76   Lisp_Object (*semi_canonicalize_device_connection_method)
77     (Lisp_Object connection, Error_behavior errb);
78   Lisp_Object (*canonicalize_console_connection_method)
79     (Lisp_Object connection, Error_behavior errb);
80   Lisp_Object (*canonicalize_device_connection_method)
81     (Lisp_Object connection, Error_behavior errb);
82   Lisp_Object (*device_to_console_connection_method)
83     (Lisp_Object connection, Error_behavior errb);
84
85   /* device methods */
86   void (*init_device_method) (struct device *, Lisp_Object props);
87   void (*finish_init_device_method) (struct device *, Lisp_Object props);
88   void (*delete_device_method) (struct device *);
89   void (*mark_device_method) (struct device *, void (*)(Lisp_Object));
90   void (*asynch_device_change_method) (void);
91   Lisp_Object (*device_system_metrics_method) (struct device *, enum device_metrics);
92   unsigned int (*device_implementation_flags_method) ();
93
94   /* frame methods */
95   Lisp_Object *device_specific_frame_props;
96   void (*init_frame_1_method) (struct frame *, Lisp_Object properties);
97   void (*init_frame_2_method) (struct frame *, Lisp_Object properties);
98   void (*init_frame_3_method) (struct frame *);
99   void (*after_init_frame_method) (struct frame *, int first_on_device,
100                                    int first_on_console);
101   void (*mark_frame_method) (struct frame *, void (*)(Lisp_Object));
102   void (*delete_frame_method) (struct frame *);
103   void (*focus_on_frame_method) (struct frame *);
104   void (*raise_frame_method) (struct frame *);
105   void (*lower_frame_method) (struct frame *);
106   int (*get_mouse_position_method) (struct device *d, Lisp_Object *frame,
107                                     int *x, int *y);
108   void (*set_mouse_position_method) (struct window *w, int x, int y);
109   void (*make_frame_visible_method) (struct frame *f);
110   void (*make_frame_invisible_method) (struct frame *f);
111   void (*iconify_frame_method) (struct frame *f);
112   Lisp_Object (*frame_property_method) (struct frame *f, Lisp_Object prop);
113   int (*internal_frame_property_p_method) (struct frame *f,
114                                            Lisp_Object prop);
115   Lisp_Object (*frame_properties_method) (struct frame *f);
116   void (*set_frame_properties_method) (struct frame *f, Lisp_Object plist);
117   void (*set_frame_size_method) (struct frame *f, int width, int height);
118   void (*set_frame_position_method) (struct frame *f, int xoff, int yoff);
119   int (*frame_visible_p_method) (struct frame *f);
120   int (*frame_totally_visible_p_method) (struct frame *f);
121   int (*frame_iconified_p_method) (struct frame *f);
122   void (*set_title_from_bufbyte_method) (struct frame *f, Bufbyte *title);
123   void (*set_icon_name_from_bufbyte_method) (struct frame *f, Bufbyte *title);
124   void (*set_frame_pointer_method) (struct frame *f);
125   void (*set_frame_icon_method) (struct frame *f);
126   void (*popup_menu_method) (Lisp_Object menu, Lisp_Object event);
127   Lisp_Object (*get_frame_parent_method) (struct frame *f);
128   void (*update_frame_external_traits_method) (struct frame *f, Lisp_Object name);
129   int (*frame_size_fixed_p_method) (struct frame *f);
130
131   /* redisplay methods */
132   int (*left_margin_width_method) (struct window *);
133   int (*right_margin_width_method) (struct window *);
134   int (*text_width_method) (struct frame *f, struct face_cachel *cachel,
135                             CONST Emchar *str, Charcount len);
136   void (*output_display_block_method) (struct window *, struct display_line *,
137                                        int, int, int, int, int, int, int);
138   int (*divider_height_method) (void);
139   int (*eol_cursor_width_method) (void);
140   void (*output_vertical_divider_method) (struct window *, int);
141   void (*clear_to_window_end_method) (struct window *, int, int);
142   void (*clear_region_method) (Lisp_Object, face_index, int, int, int, int);
143   void (*clear_frame_method) (struct frame *);
144   void (*output_begin_method) (struct device *);
145   void (*output_end_method) (struct device *);
146   int (*flash_method) (struct device *);
147   void (*ring_bell_method) (struct device *, int volume, int pitch,
148                             int duration);
149   void (*frame_redraw_cursor_method) (struct frame *f);
150   void (*set_final_cursor_coords_method) (struct frame *, int, int);
151
152   /* color methods */
153   int (*initialize_color_instance_method) (struct Lisp_Color_Instance *,
154                                            Lisp_Object name,
155                                            Lisp_Object device,
156                                            Error_behavior errb);
157   void (*mark_color_instance_method) (struct Lisp_Color_Instance *,
158                                       void (*)(Lisp_Object));
159   void (*print_color_instance_method) (struct Lisp_Color_Instance *,
160                                        Lisp_Object printcharfun,
161                                        int escapeflag);
162   void (*finalize_color_instance_method) (struct Lisp_Color_Instance *);
163   int (*color_instance_equal_method) (struct Lisp_Color_Instance *,
164                                       struct Lisp_Color_Instance *,
165                                       int depth);
166   unsigned long (*color_instance_hash_method) (struct Lisp_Color_Instance *,
167                                                int depth);
168   Lisp_Object (*color_instance_rgb_components_method)
169     (struct Lisp_Color_Instance *);
170   int (*valid_color_name_p_method) (struct device *, Lisp_Object color);
171
172   /* font methods */
173   int (*initialize_font_instance_method) (struct Lisp_Font_Instance *,
174                                           Lisp_Object name,
175                                           Lisp_Object device,
176                                           Error_behavior errb);
177   void (*mark_font_instance_method) (struct Lisp_Font_Instance *,
178                                      void (*)(Lisp_Object));
179   void (*print_font_instance_method) (struct Lisp_Font_Instance *,
180                                       Lisp_Object printcharfun,
181                                       int escapeflag);
182   void (*finalize_font_instance_method) (struct Lisp_Font_Instance *);
183   Lisp_Object (*font_instance_truename_method) (struct Lisp_Font_Instance *,
184                                                 Error_behavior errb);
185   Lisp_Object (*font_instance_properties_method) (struct Lisp_Font_Instance *);
186   Lisp_Object (*list_fonts_method) (Lisp_Object pattern,
187                                     Lisp_Object device);
188   Lisp_Object (*find_charset_font_method) (Lisp_Object device,
189                                            Lisp_Object font,
190                                            Lisp_Object charset);
191   int (*font_spec_matches_charset_method) (struct device *d,
192                                            Lisp_Object charset,
193                                            CONST Bufbyte *nonreloc,
194                                            Lisp_Object reloc,
195                                            Bytecount offset,
196                                            Bytecount length);
197
198   /* image methods */
199   void (*mark_image_instance_method) (struct Lisp_Image_Instance *,
200                                       void (*)(Lisp_Object));
201   void (*print_image_instance_method) (struct Lisp_Image_Instance *,
202                                        Lisp_Object printcharfun,
203                                        int escapeflag);
204   void (*finalize_image_instance_method) (struct Lisp_Image_Instance *);
205   int (*image_instance_equal_method) (struct Lisp_Image_Instance *,
206                                       struct Lisp_Image_Instance *,
207                                       int depth);
208   unsigned long (*image_instance_hash_method) (struct Lisp_Image_Instance *,
209                                                int depth);
210   void (*init_image_instance_from_eimage_method) (struct Lisp_Image_Instance *ii,
211                                                   int width, int height,
212                                                   unsigned char *eimage, 
213                                                   int dest_mask,
214                                                   Lisp_Object instantiator,
215                                                   Lisp_Object domain);
216   Lisp_Object (*locate_pixmap_file_method) (Lisp_Object file_method);
217   int (*colorize_image_instance_method) (Lisp_Object image_instance,
218                                          Lisp_Object fg, Lisp_Object bg);
219 #ifdef HAVE_XPM
220     /* which is more tacky - this or #defines in glyphs.c? */
221   void (*xpm_instantiate_method)(Lisp_Object image_instance, 
222                                  Lisp_Object instantiator,
223                                  Lisp_Object pointer_fg, 
224                                  Lisp_Object pointer_bg,
225                                  int dest_mask, Lisp_Object domain);
226 #endif
227 #ifdef HAVE_WINDOW_SYSTEM
228     /* which is more tacky - this or #defines in glyphs.c? */
229   void (*xbm_instantiate_method)(Lisp_Object image_instance, 
230                                  Lisp_Object instantiator,
231                                  Lisp_Object pointer_fg, 
232                                  Lisp_Object pointer_bg,
233                                  int dest_mask, Lisp_Object domain);
234 #endif
235   Lisp_Object image_conversion_list;
236
237 #ifdef HAVE_TOOLBARS
238   /* toolbar methods */
239   void (*output_frame_toolbars_method) (struct frame *);
240   void (*initialize_frame_toolbars_method) (struct frame *);
241   void (*free_frame_toolbars_method) (struct frame *);
242   void (*output_toolbar_button_method) (struct frame *, Lisp_Object);
243   void (*redraw_frame_toolbars_method) (struct frame *);
244   void (*redraw_exposed_toolbars_method) (struct frame *f, int x, int y,
245                                           int width, int height);
246 #endif
247
248 #ifdef HAVE_SCROLLBARS
249   /* scrollbar methods */
250   int (*inhibit_scrollbar_slider_size_change_method) (void);
251   void (*free_scrollbar_instance_method) (struct scrollbar_instance *);
252   void (*release_scrollbar_instance_method) (struct scrollbar_instance *);
253   void (*create_scrollbar_instance_method) (struct frame *, int,
254                                             struct scrollbar_instance *);
255   void (*update_scrollbar_instance_values_method) (struct window *,
256                                                    struct scrollbar_instance *,
257                                                    int, int, int, int, int,
258                                                    int, int, int, int, int);
259   void (*update_scrollbar_instance_status_method) (struct window *, int, int,
260                                                    struct
261                                                    scrollbar_instance *);
262   void (*scrollbar_pointer_changed_in_window_method) (struct window *w);
263 #ifdef MEMORY_USAGE_STATS
264   int (*compute_scrollbar_instance_usage_method) (struct device *,
265                                                   struct scrollbar_instance *,
266                                                   struct overhead_stats *);
267 #endif
268 #endif /* HAVE_SCROLLBARS */
269
270 #ifdef HAVE_MENUBARS
271   /* menubar methods */
272   void (*update_frame_menubars_method) (struct frame *);
273   void (*free_frame_menubars_method) (struct frame *);
274 #endif
275
276 #ifdef HAVE_DIALOGS
277   /* dialog methods */
278   void (*popup_dialog_box_method) (struct frame *, Lisp_Object dbox_desc);
279 #endif
280 };
281
282 /*
283  * Constants returned by device_implementation_flags_method
284  */
285 /* Set when device uses pixel-based geometry */
286 #define XDEVIMPF_PIXEL_GEOMETRY   0x00000001L
287
288
289 #define CONSOLE_TYPE_NAME(c) ((c)->conmeths->name)
290 #define CONSOLE_TYPE(c) ((c)->conmeths->symbol)
291 #define CONMETH_TYPE(meths) ((meths)->symbol)
292
293 /******** Accessing / calling a console method *********/
294
295 #define HAS_CONTYPE_METH_P(meth, m) ((meth)->m##_method)
296 #define CONTYPE_METH(meth, m, args) (((meth)->m##_method) args)
297
298 /* Call a void-returning console method, if it exists */
299 #define MAYBE_CONTYPE_METH(meth, m, args) do {                  \
300   struct console_methods *_maybe_contype_meth_meth = (meth);    \
301   if (HAS_CONTYPE_METH_P (_maybe_contype_meth_meth, m))         \
302     CONTYPE_METH (_maybe_contype_meth_meth, m, args);           \
303 } while (0)
304
305 /* Call a console method, if it exists; otherwise return
306    the specified value - meth is multiply evaluated.  */
307 #define CONTYPE_METH_OR_GIVEN(meth, m, args, given)     \
308   (HAS_CONTYPE_METH_P (meth, m) ?                       \
309    CONTYPE_METH (meth, m, args) : (given))
310
311 /* Call an int-returning console method, if it exists; otherwise
312    return 0 */
313 #define MAYBE_INT_CONTYPE_METH(meth, m, args) \
314   CONTYPE_METH_OR_GIVEN (meth, m, args, 0)
315
316 /* Call an Lisp-Object-returning console method, if it exists;
317    otherwise return Qnil */
318 #define MAYBE_LISP_CONTYPE_METH(meth, m, args) \
319   CONTYPE_METH_OR_GIVEN (meth, m, args, Qnil)
320
321 /******** Same functions, operating on a console instead of a
322           struct console_methods ********/
323
324 #define HAS_CONMETH_P(c, m) HAS_CONTYPE_METH_P ((c)->conmeths, m)
325 #define CONMETH(c, m, args) CONTYPE_METH ((c)->conmeths, m, args)
326 #define MAYBE_CONMETH(c, m, args) MAYBE_CONTYPE_METH ((c)->conmeths, m, args)
327 #define CONMETH_OR_GIVEN(c, m, args, given) \
328   CONTYPE_METH_OR_GIVEN((c)->conmeths, m, args, given)
329 #define MAYBE_INT_CONMETH(c, m, args) \
330   MAYBE_INT_CONTYPE_METH ((c)->conmeths, m, args)
331 #define MAYBE_LISP_CONMETH(c, m, args) \
332   MAYBE_LISP_CONTYPE_METH ((c)->conmeths, m, args)
333
334 /******** Defining new console types ********/
335
336 typedef struct console_type_entry console_type_entry;
337 struct console_type_entry
338 {
339   Lisp_Object symbol;
340   struct console_methods *meths;
341 };
342
343 #define DECLARE_CONSOLE_TYPE(type) \
344 extern struct console_methods * type##_console_methods
345
346 #define DEFINE_CONSOLE_TYPE(type) \
347 struct console_methods * type##_console_methods
348
349 #define INITIALIZE_CONSOLE_TYPE(type, obj_name, pred_sym) do {          \
350     type##_console_methods = xnew_and_zero (struct console_methods);    \
351     type##_console_methods->name = obj_name;                            \
352     type##_console_methods->symbol = Q##type;                           \
353     defsymbol (&type##_console_methods->predicate_symbol, pred_sym);    \
354     add_entry_to_console_type_list (Q##type, type##_console_methods);   \
355     type##_console_methods->image_conversion_list = Qnil;               \
356     staticpro (&type##_console_methods->image_conversion_list);         \
357 } while (0)
358
359 /* Declare that console-type TYPE has method M; used in
360    initialization routines */
361 #define CONSOLE_HAS_METHOD(type, m) \
362   (type##_console_methods->m##_method = type##_##m)
363
364 struct console
365 {
366   struct lcrecord_header header;
367
368   /* Description of this console's methods.  */
369   struct console_methods *conmeths;
370
371   /* A structure of auxiliary data specific to the console type.
372      struct x_console is used for X window frames; defined in console-x.h
373      struct tty_console is used to TTY's; defined in console-tty.h */
374   void *console_data;
375
376   /* Character that causes a quit.  Normally C-g.
377      #### Should be possible for this not to be ASCII. */
378   int quit_char;
379
380   /* ----- begin partially-completed console localization of
381            event loop ---- */
382
383   int local_var_flags;
384
385 #define MARKED_SLOT(x) Lisp_Object x
386 #include "conslots.h"
387 #undef MARKED_SLOT
388
389   /* Where to store the next keystroke of the macro.
390      Index into con->kbd_macro_builder. */
391   int kbd_macro_ptr;
392
393   /* The finalized section of the macro starts at kbd_macro_buffer and
394      ends before this.  This is not the same as kbd_macro_pointer, because
395      we advance this to kbd_macro_pointer when a key's command is complete.
396      This way, the keystrokes for "end-kbd-macro" are not included in the
397      macro.  */
398   int kbd_macro_end;
399
400   /* ----- end partially-completed console localization of event loop ---- */
401
402   unsigned int input_enabled :1;
403 };
404
405 DECLARE_LRECORD (console, struct console);
406 #define XCONSOLE(x) XRECORD (x, console, struct console)
407 #define XSETCONSOLE(x, p) XSETRECORD (x, p, console)
408 #define CONSOLEP(x) RECORDP (x, console)
409 #define GC_CONSOLEP(x) GC_RECORDP (x, console)
410 #define CHECK_CONSOLE(x) CHECK_RECORD (x, console)
411 #define CONCHECK_CONSOLE(x) CONCHECK_RECORD (x, console)
412
413 #define CHECK_LIVE_CONSOLE(x) do {                      \
414   CHECK_CONSOLE (x);                                    \
415   if (! CONSOLE_LIVE_P (XCONSOLE (x)))                  \
416     dead_wrong_type_argument (Qconsole_live_p, (x));    \
417 } while (0)
418 #define CONCHECK_LIVE_CONSOLE(x) do {                   \
419   CONCHECK_CONSOLE (x);                                 \
420   if (! CONSOLE_LIVE_P (XCONSOLE (x)))                  \
421     x = wrong_type_argument (Qconsole_live_p, (x));     \
422 } while (0)
423
424 #define CONSOLE_TYPE_P(con, type) EQ (CONSOLE_TYPE (con), Q##type)
425
426 #ifdef ERROR_CHECK_TYPECHECK
427 INLINE struct console *
428 error_check_console_type (struct console *con, Lisp_Object sym);
429 INLINE struct console *
430 error_check_console_type (struct console *con, Lisp_Object sym)
431 {
432   assert (EQ (CONSOLE_TYPE (con), sym));
433   return con;
434 }
435 # define CONSOLE_TYPE_DATA(con, type)                   \
436   (*(struct type##_console **)                          \
437    &(error_check_console_type (con, Q##type))->console_data)
438 #else
439 # define CONSOLE_TYPE_DATA(con, type)                   \
440   (*(struct type##_console **) &((con)->console_data))
441 #endif
442
443 #define CHECK_CONSOLE_TYPE(x, type) do {                \
444   CHECK_CONSOLE (x);                                    \
445   if (! CONSOLE_TYPE_P (XCONSOLE (x), type))            \
446     dead_wrong_type_argument                            \
447       (type##_console_methods->predicate_symbol, x);    \
448 } while (0)
449 #define CONCHECK_CONSOLE_TYPE(x, type) do {             \
450   CONCHECK_CONSOLE (x);                                 \
451   if (!(CONSOLEP (x) &&                                 \
452         CONSOLE_TYPE_P (XCONSOLE (x), type)))           \
453     x = wrong_type_argument                             \
454       (type##_console_methods->predicate_symbol, x);    \
455 } while (0)
456
457 /* #### These should be in the console-*.h files but there are
458    too many places where the abstraction is broken.  Need to
459    fix. */
460
461 #ifdef HAVE_X_WINDOWS
462 #define CONSOLE_TYPESYM_X_P(typesym) EQ (typesym, Qx)
463 #else
464 #define CONSOLE_TYPESYM_X_P(typesym) 0
465 #endif
466 #ifdef HAVE_TTY
467 #define CONSOLE_TYPESYM_TTY_P(typesym) EQ (typesym, Qtty)
468 #else
469 #define CONSOLE_TYPESYM_TTY_P(typesym) 0
470 #endif
471 #ifdef HAVE_MS_WINDOWS
472 #define CONSOLE_TYPESYM_MSWINDOWS_P(typesym) EQ (typesym, Qmswindows)
473 #else
474 #define CONSOLE_TYPESYM_MSWINDOWS_P(typesym) 0
475 #endif
476 #define CONSOLE_TYPESYM_STREAM_P(typesym) EQ (typesym, Qstream)
477
478 #define CONSOLE_TYPESYM_WIN_P(typesym) \
479   (CONSOLE_TYPESYM_X_P (typesym) || CONSOLE_TYPESYM_MSWINDOWS_P (typesym))
480
481 #define CONSOLE_X_P(con) CONSOLE_TYPESYM_X_P (CONSOLE_TYPE (con))
482 #define CHECK_X_CONSOLE(z) CHECK_CONSOLE_TYPE (z, x)
483 #define CONCHECK_X_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, x)
484
485 #define CONSOLE_TTY_P(con) CONSOLE_TYPESYM_TTY_P (CONSOLE_TYPE (con))
486 #define CHECK_TTY_CONSOLE(z) CHECK_CONSOLE_TYPE (z, tty)
487 #define CONCHECK_TTY_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, tty)
488
489 #define CONSOLE_MSWINDOWS_P(con) CONSOLE_TYPESYM_MSWINDOWS_P (CONSOLE_TYPE (con))
490 #define CHECK_MSWINDOWS_CONSOLE(z) CHECK_CONSOLE_TYPE (z, mswindows)
491 #define CONCHECK_MSWINDOWS_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, mswindows)
492
493 #define CONSOLE_STREAM_P(con) CONSOLE_TYPESYM_STREAM_P (CONSOLE_TYPE (con))
494 #define CHECK_STREAM_CONSOLE(z) CHECK_CONSOLE_TYPE (z, stream)
495 #define CONCHECK_STREAM_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, stream)
496
497 #define CONSOLE_WIN_P(con) CONSOLE_TYPESYM_WIN_P (CONSOLE_TYPE (con))
498
499 EXFUN (Fconsole_disable_input, 1);
500 EXFUN (Fdelete_console, 2);
501 EXFUN (Fselect_console, 1);
502 EXFUN (Fselected_console, 0);
503
504 extern Lisp_Object Qcreate_console_hook, Qdelete_console_hook;
505 extern Lisp_Object Vconsole_defaults, Vconsole_type_list, Vselected_console;
506
507 /* This structure marks which slots in a console have corresponding
508    default values in console_defaults.
509    Each such slot has a nonzero value in this structure.
510    The value has only one nonzero bit.
511
512    When a console has its own local value for a slot,
513    the bit for that slot (found in the same slot in this structure)
514    is turned on in the console's local_var_flags slot.
515
516    If a slot in this structure is zero, then even though there may
517    be a DEFVAR_CONSOLE_LOCAL for the slot, there is no default value for it;
518    and the corresponding slot in console_defaults is not used.  */
519
520 extern struct console console_local_flags;
521
522 int valid_console_type_p (Lisp_Object type);
523
524 #define CONSOLE_LIVE_P(con) (!EQ (CONSOLE_TYPE (con), Qdead))
525
526 #define CONSOLE_NAME(con) ((con)->name)
527 #define CONSOLE_CONNECTION(con) ((con)->connection)
528 #define CONSOLE_CANON_CONNECTION(con) ((con)->canon_connection)
529 #define CONSOLE_FUNCTION_KEY_MAP(con) ((con)->function_key_map)
530 #define CONSOLE_DEVICE_LIST(con) ((con)->device_list)
531 #define CONSOLE_SELECTED_DEVICE(con) ((con)->selected_device)
532 #define CONSOLE_SELECTED_FRAME(con) \
533   DEVICE_SELECTED_FRAME (XDEVICE ((con)->selected_device))
534 #define CONSOLE_LAST_NONMINIBUF_FRAME(con) NON_LVALUE ((con)->_last_nonminibuf_frame)
535 #define CONSOLE_QUIT_CHAR(con) ((con)->quit_char)
536
537 #define CDFW_CONSOLE(obj)                               \
538    (WINDOWP  (obj) ? WINDOW_CONSOLE (XWINDOW (obj))     \
539  : (FRAMEP   (obj) ?  FRAME_CONSOLE (XFRAME  (obj))     \
540  : (DEVICEP  (obj) ? DEVICE_CONSOLE (XDEVICE (obj))     \
541  : (CONSOLEP (obj) ? obj                                \
542  : Qnil))))
543
544 #define CONSOLE_LOOP(concons) LIST_LOOP (concons, Vconsole_list)
545 #define CONSOLE_DEVICE_LOOP(devcons, con) \
546   LIST_LOOP (devcons, CONSOLE_DEVICE_LIST (con))
547
548 DECLARE_CONSOLE_TYPE (dead);
549 extern console_type_entry_dynarr *the_console_type_entry_dynarr;
550
551 Lisp_Object create_console (Lisp_Object name, Lisp_Object type,
552                             Lisp_Object connection, Lisp_Object props);
553 void select_console_1 (Lisp_Object);
554 struct console *decode_console (Lisp_Object);
555 Lisp_Object make_console (struct console *c);
556 void add_entry_to_console_type_list (Lisp_Object symbol,
557                                      struct console_methods *type);
558 struct console_methods *decode_console_type (Lisp_Object type,
559                                              Error_behavior errb);
560 void delete_console_internal (struct console *con, int force,
561                               int from_kill_emacs, int from_io_error);
562 void io_error_delete_console (Lisp_Object console);
563 void set_console_last_nonminibuf_frame (struct console *con,
564                                         Lisp_Object frame);
565
566 #endif /* _XEMACS_CONSOLE_H_ */