XEmacs 21.2.7
[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 implementation 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, struct device*, struct frame*, face_index,
143                                int, int, int, int,
144                                Lisp_Object, Lisp_Object, Lisp_Object);
145   void (*clear_frame_method) (struct frame *);
146   void (*output_begin_method) (struct device *);
147   void (*output_end_method) (struct device *);
148   int (*flash_method) (struct device *);
149   void (*ring_bell_method) (struct device *, int volume, int pitch,
150                             int duration);
151   void (*frame_redraw_cursor_method) (struct frame *f);
152   void (*set_final_cursor_coords_method) (struct frame *, int, int);
153
154   /* color methods */
155   int (*initialize_color_instance_method) (struct Lisp_Color_Instance *,
156                                            Lisp_Object name,
157                                            Lisp_Object device,
158                                            Error_behavior errb);
159   void (*mark_color_instance_method) (struct Lisp_Color_Instance *,
160                                       void (*)(Lisp_Object));
161   void (*print_color_instance_method) (struct Lisp_Color_Instance *,
162                                        Lisp_Object printcharfun,
163                                        int escapeflag);
164   void (*finalize_color_instance_method) (struct Lisp_Color_Instance *);
165   int (*color_instance_equal_method) (struct Lisp_Color_Instance *,
166                                       struct Lisp_Color_Instance *,
167                                       int depth);
168   unsigned long (*color_instance_hash_method) (struct Lisp_Color_Instance *,
169                                                int depth);
170   Lisp_Object (*color_instance_rgb_components_method)
171     (struct Lisp_Color_Instance *);
172   int (*valid_color_name_p_method) (struct device *, Lisp_Object color);
173
174   /* font methods */
175   int (*initialize_font_instance_method) (struct Lisp_Font_Instance *,
176                                           Lisp_Object name,
177                                           Lisp_Object device,
178                                           Error_behavior errb);
179   void (*mark_font_instance_method) (struct Lisp_Font_Instance *,
180                                      void (*)(Lisp_Object));
181   void (*print_font_instance_method) (struct Lisp_Font_Instance *,
182                                       Lisp_Object printcharfun,
183                                       int escapeflag);
184   void (*finalize_font_instance_method) (struct Lisp_Font_Instance *);
185   Lisp_Object (*font_instance_truename_method) (struct Lisp_Font_Instance *,
186                                                 Error_behavior errb);
187   Lisp_Object (*font_instance_properties_method) (struct Lisp_Font_Instance *);
188   Lisp_Object (*list_fonts_method) (Lisp_Object pattern,
189                                     Lisp_Object device);
190   Lisp_Object (*find_charset_font_method) (Lisp_Object device,
191                                            Lisp_Object font,
192                                            Lisp_Object charset);
193   int (*font_spec_matches_charset_method) (struct device *d,
194                                            Lisp_Object charset,
195                                            CONST Bufbyte *nonreloc,
196                                            Lisp_Object reloc,
197                                            Bytecount offset,
198                                            Bytecount length);
199
200   /* image methods */
201   void (*mark_image_instance_method) (struct Lisp_Image_Instance *,
202                                       void (*)(Lisp_Object));
203   void (*print_image_instance_method) (struct Lisp_Image_Instance *,
204                                        Lisp_Object printcharfun,
205                                        int escapeflag);
206   void (*finalize_image_instance_method) (struct Lisp_Image_Instance *);
207   void (*unmap_subwindow_method) (struct Lisp_Image_Instance *);
208   void (*map_subwindow_method) (struct Lisp_Image_Instance *, int x, int y);
209   void (*resize_subwindow_method) (struct Lisp_Image_Instance *, int w, int h);
210   void (*update_subwindow_method) (struct Lisp_Image_Instance *);
211   int (*image_instance_equal_method) (struct Lisp_Image_Instance *,
212                                       struct Lisp_Image_Instance *,
213                                       int depth);
214   unsigned long (*image_instance_hash_method) (struct Lisp_Image_Instance *,
215                                                int depth);
216   void (*init_image_instance_from_eimage_method) (struct Lisp_Image_Instance *ii,
217                                                   int width, int height,
218                                                   unsigned char *eimage,
219                                                   int dest_mask,
220                                                   Lisp_Object instantiator,
221                                                   Lisp_Object domain);
222   Lisp_Object (*locate_pixmap_file_method) (Lisp_Object file_method);
223   int (*colorize_image_instance_method) (Lisp_Object image_instance,
224                                          Lisp_Object fg, Lisp_Object bg);
225   Lisp_Object image_conversion_list;
226
227 #ifdef HAVE_TOOLBARS
228   /* toolbar methods */
229   void (*output_frame_toolbars_method) (struct frame *);
230   void (*initialize_frame_toolbars_method) (struct frame *);
231   void (*free_frame_toolbars_method) (struct frame *);
232   void (*output_toolbar_button_method) (struct frame *, Lisp_Object);
233   void (*redraw_frame_toolbars_method) (struct frame *);
234   void (*redraw_exposed_toolbars_method) (struct frame *f, int x, int y,
235                                           int width, int height);
236 #endif
237
238 #ifdef HAVE_SCROLLBARS
239   /* scrollbar methods */
240   int (*inhibit_scrollbar_slider_size_change_method) (void);
241   void (*free_scrollbar_instance_method) (struct scrollbar_instance *);
242   void (*release_scrollbar_instance_method) (struct scrollbar_instance *);
243   void (*create_scrollbar_instance_method) (struct frame *, int,
244                                             struct scrollbar_instance *);
245   void (*update_scrollbar_instance_values_method) (struct window *,
246                                                    struct scrollbar_instance *,
247                                                    int, int, int, int, int,
248                                                    int, int, int, int, int);
249   void (*update_scrollbar_instance_status_method) (struct window *, int, int,
250                                                    struct
251                                                    scrollbar_instance *);
252   void (*scrollbar_pointer_changed_in_window_method) (struct window *w);
253 #ifdef MEMORY_USAGE_STATS
254   int (*compute_scrollbar_instance_usage_method) (struct device *,
255                                                   struct scrollbar_instance *,
256                                                   struct overhead_stats *);
257 #endif
258 #endif /* HAVE_SCROLLBARS */
259
260 #ifdef HAVE_MENUBARS
261   /* menubar methods */
262   void (*update_frame_menubars_method) (struct frame *);
263   void (*free_frame_menubars_method) (struct frame *);
264 #endif
265
266 #ifdef HAVE_DIALOGS
267   /* dialog methods */
268   void (*popup_dialog_box_method) (struct frame *, Lisp_Object dbox_desc);
269 #endif
270 };
271
272 /*
273  * Constants returned by device_implementation_flags_method
274  */
275 /* Set when device uses pixel-based geometry */
276 #define XDEVIMPF_PIXEL_GEOMETRY   0x00000001L
277
278
279 #define CONSOLE_TYPE_NAME(c) ((c)->conmeths->name)
280 #define CONSOLE_TYPE(c) ((c)->conmeths->symbol)
281 #define CONMETH_TYPE(meths) ((meths)->symbol)
282
283 /******** Accessing / calling a console method *********/
284
285 #define HAS_CONTYPE_METH_P(meth, m) ((meth)->m##_method)
286 #define CONTYPE_METH(meth, m, args) (((meth)->m##_method) args)
287
288 /* Call a void-returning console method, if it exists */
289 #define MAYBE_CONTYPE_METH(meth, m, args) do {                  \
290   struct console_methods *maybe_contype_meth_meth = (meth);     \
291   if (HAS_CONTYPE_METH_P (maybe_contype_meth_meth, m))          \
292     CONTYPE_METH (maybe_contype_meth_meth, m, args);            \
293 } while (0)
294
295 /* Call a console method, if it exists; otherwise return
296    the specified value - meth is multiply evaluated.  */
297 #define CONTYPE_METH_OR_GIVEN(meth, m, args, given)     \
298   (HAS_CONTYPE_METH_P (meth, m) ?                       \
299    CONTYPE_METH (meth, m, args) : (given))
300
301 /* Call an int-returning console method, if it exists; otherwise
302    return 0 */
303 #define MAYBE_INT_CONTYPE_METH(meth, m, args) \
304   CONTYPE_METH_OR_GIVEN (meth, m, args, 0)
305
306 /* Call an Lisp-Object-returning console method, if it exists;
307    otherwise return Qnil */
308 #define MAYBE_LISP_CONTYPE_METH(meth, m, args) \
309   CONTYPE_METH_OR_GIVEN (meth, m, args, Qnil)
310
311 /******** Same functions, operating on a console instead of a
312           struct console_methods ********/
313
314 #define HAS_CONMETH_P(c, m) HAS_CONTYPE_METH_P ((c)->conmeths, m)
315 #define CONMETH(c, m, args) CONTYPE_METH ((c)->conmeths, m, args)
316 #define MAYBE_CONMETH(c, m, args) MAYBE_CONTYPE_METH ((c)->conmeths, m, args)
317 #define CONMETH_OR_GIVEN(c, m, args, given) \
318   CONTYPE_METH_OR_GIVEN((c)->conmeths, m, args, given)
319 #define MAYBE_INT_CONMETH(c, m, args) \
320   MAYBE_INT_CONTYPE_METH ((c)->conmeths, m, args)
321 #define MAYBE_LISP_CONMETH(c, m, args) \
322   MAYBE_LISP_CONTYPE_METH ((c)->conmeths, m, args)
323
324 /******** Defining new console types ********/
325
326 typedef struct console_type_entry console_type_entry;
327 struct console_type_entry
328 {
329   Lisp_Object symbol;
330   struct console_methods *meths;
331 };
332
333 #define DECLARE_CONSOLE_TYPE(type) \
334 extern struct console_methods * type##_console_methods
335
336 #define DEFINE_CONSOLE_TYPE(type) \
337 struct console_methods * type##_console_methods
338
339 #define INITIALIZE_CONSOLE_TYPE(type, obj_name, pred_sym) do {          \
340     type##_console_methods = xnew_and_zero (struct console_methods);    \
341     type##_console_methods->name = obj_name;                            \
342     type##_console_methods->symbol = Q##type;                           \
343     defsymbol (&type##_console_methods->predicate_symbol, pred_sym);    \
344     add_entry_to_console_type_list (Q##type, type##_console_methods);   \
345     type##_console_methods->image_conversion_list = Qnil;               \
346     staticpro (&type##_console_methods->image_conversion_list);         \
347 } while (0)
348
349 /* Declare that console-type TYPE has method M; used in
350    initialization routines */
351 #define CONSOLE_HAS_METHOD(type, m) \
352   (type##_console_methods->m##_method = type##_##m)
353
354 struct console
355 {
356   struct lcrecord_header header;
357
358   /* Description of this console's methods.  */
359   struct console_methods *conmeths;
360
361   /* A structure of auxiliary data specific to the console type.
362      struct x_console is used for X window frames; defined in console-x.h
363      struct tty_console is used to TTY's; defined in console-tty.h */
364   void *console_data;
365
366   /* Character that causes a quit.  Normally C-g.
367      #### Should be possible for this not to be ASCII. */
368   int quit_char;
369
370   /* ----- begin partially-completed console localization of
371            event loop ---- */
372
373   int local_var_flags;
374
375 #define MARKED_SLOT(x) Lisp_Object x
376 #include "conslots.h"
377 #undef MARKED_SLOT
378
379   /* Where to store the next keystroke of the macro.
380      Index into con->kbd_macro_builder. */
381   int kbd_macro_ptr;
382
383   /* The finalized section of the macro starts at kbd_macro_buffer and
384      ends before this.  This is not the same as kbd_macro_pointer, because
385      we advance this to kbd_macro_pointer when a key's command is complete.
386      This way, the keystrokes for "end-kbd-macro" are not included in the
387      macro.  */
388   int kbd_macro_end;
389
390   /* ----- end partially-completed console localization of event loop ---- */
391
392   unsigned int input_enabled :1;
393 };
394
395 DECLARE_LRECORD (console, struct console);
396 #define XCONSOLE(x) XRECORD (x, console, struct console)
397 #define XSETCONSOLE(x, p) XSETRECORD (x, p, console)
398 #define CONSOLEP(x) RECORDP (x, console)
399 #define GC_CONSOLEP(x) GC_RECORDP (x, console)
400 #define CHECK_CONSOLE(x) CHECK_RECORD (x, console)
401 #define CONCHECK_CONSOLE(x) CONCHECK_RECORD (x, console)
402
403 #define CHECK_LIVE_CONSOLE(x) do {                      \
404   CHECK_CONSOLE (x);                                    \
405   if (! CONSOLE_LIVE_P (XCONSOLE (x)))                  \
406     dead_wrong_type_argument (Qconsole_live_p, (x));    \
407 } while (0)
408 #define CONCHECK_LIVE_CONSOLE(x) do {                   \
409   CONCHECK_CONSOLE (x);                                 \
410   if (! CONSOLE_LIVE_P (XCONSOLE (x)))                  \
411     x = wrong_type_argument (Qconsole_live_p, (x));     \
412 } while (0)
413
414 #define CONSOLE_TYPE_P(con, type) EQ (CONSOLE_TYPE (con), Q##type)
415
416 #ifdef ERROR_CHECK_TYPECHECK
417 INLINE struct console *
418 error_check_console_type (struct console *con, Lisp_Object sym);
419 INLINE struct console *
420 error_check_console_type (struct console *con, Lisp_Object sym)
421 {
422   assert (EQ (CONSOLE_TYPE (con), sym));
423   return con;
424 }
425 # define CONSOLE_TYPE_DATA(con, type)                   \
426   (*(struct type##_console **)                          \
427    &(error_check_console_type (con, Q##type))->console_data)
428 #else
429 # define CONSOLE_TYPE_DATA(con, type)                   \
430   (*(struct type##_console **) &((con)->console_data))
431 #endif
432
433 #define CHECK_CONSOLE_TYPE(x, type) do {                \
434   CHECK_CONSOLE (x);                                    \
435   if (! CONSOLE_TYPE_P (XCONSOLE (x), type))            \
436     dead_wrong_type_argument                            \
437       (type##_console_methods->predicate_symbol, x);    \
438 } while (0)
439 #define CONCHECK_CONSOLE_TYPE(x, type) do {             \
440   CONCHECK_CONSOLE (x);                                 \
441   if (!(CONSOLEP (x) &&                                 \
442         CONSOLE_TYPE_P (XCONSOLE (x), type)))           \
443     x = wrong_type_argument                             \
444       (type##_console_methods->predicate_symbol, x);    \
445 } while (0)
446
447 /* #### These should be in the console-*.h files but there are
448    too many places where the abstraction is broken.  Need to
449    fix. */
450
451 #ifdef HAVE_X_WINDOWS
452 #define CONSOLE_TYPESYM_X_P(typesym) EQ (typesym, Qx)
453 #else
454 #define CONSOLE_TYPESYM_X_P(typesym) 0
455 #endif
456 #ifdef HAVE_TTY
457 #define CONSOLE_TYPESYM_TTY_P(typesym) EQ (typesym, Qtty)
458 #else
459 #define CONSOLE_TYPESYM_TTY_P(typesym) 0
460 #endif
461 #ifdef HAVE_MS_WINDOWS
462 #define CONSOLE_TYPESYM_MSWINDOWS_P(typesym) EQ (typesym, Qmswindows)
463 #else
464 #define CONSOLE_TYPESYM_MSWINDOWS_P(typesym) 0
465 #endif
466 #define CONSOLE_TYPESYM_STREAM_P(typesym) EQ (typesym, Qstream)
467
468 #define CONSOLE_TYPESYM_WIN_P(typesym) \
469   (CONSOLE_TYPESYM_X_P (typesym) || CONSOLE_TYPESYM_MSWINDOWS_P (typesym))
470
471 #define CONSOLE_X_P(con) CONSOLE_TYPESYM_X_P (CONSOLE_TYPE (con))
472 #define CHECK_X_CONSOLE(z) CHECK_CONSOLE_TYPE (z, x)
473 #define CONCHECK_X_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, x)
474
475 #define CONSOLE_TTY_P(con) CONSOLE_TYPESYM_TTY_P (CONSOLE_TYPE (con))
476 #define CHECK_TTY_CONSOLE(z) CHECK_CONSOLE_TYPE (z, tty)
477 #define CONCHECK_TTY_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, tty)
478
479 #define CONSOLE_MSWINDOWS_P(con) CONSOLE_TYPESYM_MSWINDOWS_P (CONSOLE_TYPE (con))
480 #define CHECK_MSWINDOWS_CONSOLE(z) CHECK_CONSOLE_TYPE (z, mswindows)
481 #define CONCHECK_MSWINDOWS_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, mswindows)
482
483 #define CONSOLE_STREAM_P(con) CONSOLE_TYPESYM_STREAM_P (CONSOLE_TYPE (con))
484 #define CHECK_STREAM_CONSOLE(z) CHECK_CONSOLE_TYPE (z, stream)
485 #define CONCHECK_STREAM_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, stream)
486
487 #define CONSOLE_WIN_P(con) CONSOLE_TYPESYM_WIN_P (CONSOLE_TYPE (con))
488
489 EXFUN (Fconsole_disable_input, 1);
490 EXFUN (Fdelete_console, 2);
491 EXFUN (Fselect_console, 1);
492 EXFUN (Fselected_console, 0);
493
494 extern Lisp_Object Qcreate_console_hook, Qdelete_console_hook;
495 extern Lisp_Object Vconsole_defaults, Vconsole_type_list, Vselected_console;
496
497 /* This structure marks which slots in a console have corresponding
498    default values in console_defaults.
499    Each such slot has a nonzero value in this structure.
500    The value has only one nonzero bit.
501
502    When a console has its own local value for a slot,
503    the bit for that slot (found in the same slot in this structure)
504    is turned on in the console's local_var_flags slot.
505
506    If a slot in this structure is zero, then even though there may
507    be a DEFVAR_CONSOLE_LOCAL for the slot, there is no default value for it;
508    and the corresponding slot in console_defaults is not used.  */
509
510 extern struct console console_local_flags;
511
512 int valid_console_type_p (Lisp_Object type);
513
514 #define CONSOLE_LIVE_P(con) (!EQ (CONSOLE_TYPE (con), Qdead))
515
516 #define CONSOLE_NAME(con) ((con)->name)
517 #define CONSOLE_CONNECTION(con) ((con)->connection)
518 #define CONSOLE_CANON_CONNECTION(con) ((con)->canon_connection)
519 #define CONSOLE_FUNCTION_KEY_MAP(con) ((con)->function_key_map)
520 #define CONSOLE_DEVICE_LIST(con) ((con)->device_list)
521 #define CONSOLE_SELECTED_DEVICE(con) ((con)->selected_device)
522 #define CONSOLE_SELECTED_FRAME(con) \
523   DEVICE_SELECTED_FRAME (XDEVICE ((con)->selected_device))
524 #define CONSOLE_LAST_NONMINIBUF_FRAME(con) NON_LVALUE ((con)->last_nonminibuf_frame)
525 #define CONSOLE_QUIT_CHAR(con) ((con)->quit_char)
526
527 #define CDFW_CONSOLE(obj)                               \
528    (WINDOWP  (obj) ? WINDOW_CONSOLE (XWINDOW (obj))     \
529  : (FRAMEP   (obj) ?  FRAME_CONSOLE (XFRAME  (obj))     \
530  : (DEVICEP  (obj) ? DEVICE_CONSOLE (XDEVICE (obj))     \
531  : (CONSOLEP (obj) ? obj                                \
532  : Qnil))))
533
534 #define CONSOLE_LOOP(concons) LIST_LOOP (concons, Vconsole_list)
535 #define CONSOLE_DEVICE_LOOP(devcons, con) \
536   LIST_LOOP (devcons, CONSOLE_DEVICE_LIST (con))
537
538 DECLARE_CONSOLE_TYPE (dead);
539 extern console_type_entry_dynarr *the_console_type_entry_dynarr;
540
541 Lisp_Object create_console (Lisp_Object name, Lisp_Object type,
542                             Lisp_Object connection, Lisp_Object props);
543 void select_console_1 (Lisp_Object);
544 struct console *decode_console (Lisp_Object);
545 Lisp_Object make_console (struct console *c);
546 void add_entry_to_console_type_list (Lisp_Object symbol,
547                                      struct console_methods *type);
548 struct console_methods *decode_console_type (Lisp_Object type,
549                                              Error_behavior errb);
550 void delete_console_internal (struct console *con, int force,
551                               int from_kill_emacs, int from_io_error);
552 void io_error_delete_console (Lisp_Object console);
553 void set_console_last_nonminibuf_frame (struct console *con,
554                                         Lisp_Object frame);
555
556 #endif /* _XEMACS_CONSOLE_H_ */