XEmacs 21.2.28 "Hermes".
[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 INCLUDED_console_h_
26 #define INCLUDED_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_offset_workspace, DM_size_device_mm, DM_device_dpi,
59   DM_num_bit_planes, DM_num_color_cells, DM_mouse_buttons, DM_swap_buttons,
60   DM_show_sounds, DM_slow_device, DM_security
61 };
62
63 extern const struct struct_description cted_description;
64 extern const struct struct_description console_methods_description;
65
66 struct console_methods
67 {
68   CONST char *name;     /* Used by print_console, print_device, print_frame */
69   Lisp_Object symbol;
70   Lisp_Object predicate_symbol;
71
72   /* console methods */
73   void (*init_console_method) (struct console *, Lisp_Object props);
74   void (*mark_console_method) (struct console *);
75   int (*initially_selected_for_input_method) (struct console *);
76   void (*delete_console_method) (struct console *);
77   Lisp_Object (*semi_canonicalize_console_connection_method)
78     (Lisp_Object connection, Error_behavior errb);
79   Lisp_Object (*semi_canonicalize_device_connection_method)
80     (Lisp_Object connection, Error_behavior errb);
81   Lisp_Object (*canonicalize_console_connection_method)
82     (Lisp_Object connection, Error_behavior errb);
83   Lisp_Object (*canonicalize_device_connection_method)
84     (Lisp_Object connection, Error_behavior errb);
85   Lisp_Object (*device_to_console_connection_method)
86     (Lisp_Object connection, Error_behavior errb);
87
88   /* device methods */
89   void (*init_device_method) (struct device *, Lisp_Object props);
90   void (*finish_init_device_method) (struct device *, Lisp_Object props);
91   void (*delete_device_method) (struct device *);
92   void (*mark_device_method) (struct device *);
93   void (*asynch_device_change_method) (void);
94   Lisp_Object (*device_system_metrics_method) (struct device *, enum device_metrics);
95   unsigned int (*device_implementation_flags_method) (void);
96   Lisp_Object (*own_selection_method)(Lisp_Object selection_name, Lisp_Object selection_value);
97   void (*disown_selection_method)(Lisp_Object selection_name, Lisp_Object timeval);
98     Lisp_Object (*get_foreign_selection_method) (Lisp_Object selection_symbol,
99                                                  Lisp_Object target_type);
100   Lisp_Object (*selection_exists_p_method)(Lisp_Object selection_name);
101
102   /* frame methods */
103   Lisp_Object *device_specific_frame_props;
104   void (*init_frame_1_method) (struct frame *, Lisp_Object properties);
105   void (*init_frame_2_method) (struct frame *, Lisp_Object properties);
106   void (*init_frame_3_method) (struct frame *);
107   void (*after_init_frame_method) (struct frame *, int first_on_device,
108                                    int first_on_console);
109   void (*mark_frame_method) (struct frame *);
110   void (*delete_frame_method) (struct frame *);
111   void (*focus_on_frame_method) (struct frame *);
112   void (*raise_frame_method) (struct frame *);
113   void (*lower_frame_method) (struct frame *);
114   int (*get_mouse_position_method) (struct device *d, Lisp_Object *frame,
115                                     int *x, int *y);
116   void (*set_mouse_position_method) (struct window *w, int x, int y);
117   void (*make_frame_visible_method) (struct frame *f);
118   void (*make_frame_invisible_method) (struct frame *f);
119   void (*iconify_frame_method) (struct frame *f);
120   Lisp_Object (*frame_property_method) (struct frame *f, Lisp_Object prop);
121   int (*internal_frame_property_p_method) (struct frame *f,
122                                            Lisp_Object prop);
123   Lisp_Object (*frame_properties_method) (struct frame *f);
124   void (*set_frame_properties_method) (struct frame *f, Lisp_Object plist);
125   void (*set_frame_size_method) (struct frame *f, int width, int height);
126   void (*set_frame_position_method) (struct frame *f, int xoff, int yoff);
127   int (*frame_visible_p_method) (struct frame *f);
128   int (*frame_totally_visible_p_method) (struct frame *f);
129   int (*frame_iconified_p_method) (struct frame *f);
130   void (*set_title_from_bufbyte_method) (struct frame *f, Bufbyte *title);
131   void (*set_icon_name_from_bufbyte_method) (struct frame *f, Bufbyte *title);
132   void (*set_frame_pointer_method) (struct frame *f);
133   void (*set_frame_icon_method) (struct frame *f);
134   void (*popup_menu_method) (Lisp_Object menu, Lisp_Object event);
135   Lisp_Object (*get_frame_parent_method) (struct frame *f);
136   void (*update_frame_external_traits_method) (struct frame *f, Lisp_Object name);
137   int (*frame_size_fixed_p_method) (struct frame *f);
138
139   /* redisplay methods */
140   int (*left_margin_width_method) (struct window *);
141   int (*right_margin_width_method) (struct window *);
142   int (*text_width_method) (struct frame *f, struct face_cachel *cachel,
143                             CONST Emchar *str, Charcount len);
144   void (*output_display_block_method) (struct window *, struct display_line *,
145                                        int, int, int, int, int, int, int);
146   int (*divider_height_method) (void);
147   int (*eol_cursor_width_method) (void);
148   void (*output_vertical_divider_method) (struct window *, int);
149   void (*clear_to_window_end_method) (struct window *, int, int);
150   void (*clear_region_method) (Lisp_Object, struct device*, struct frame*, face_index,
151                                int, int, int, int,
152                                Lisp_Object, Lisp_Object, Lisp_Object);
153   void (*clear_frame_method) (struct frame *);
154   void (*output_begin_method) (struct device *);
155   void (*output_end_method) (struct device *);
156   int (*flash_method) (struct device *);
157   void (*ring_bell_method) (struct device *, int volume, int pitch,
158                             int duration);
159   void (*frame_redraw_cursor_method) (struct frame *f);
160   void (*set_final_cursor_coords_method) (struct frame *, int, int);
161   void (*bevel_area_method) (struct window *, face_index, int, int, int, int, int,
162                              int, enum edge_style);
163   void (*output_pixmap_method) (struct window *w, Lisp_Object image_instance,
164                                 struct display_box *db, struct display_glyph_area *dga,
165                                 face_index findex, int cursor_start, int cursor_width,
166                                 int cursor_height, int offset_bitmap);
167   void (*output_string_method) (struct window *w, struct display_line *dl,
168                                 Emchar_dynarr *buf, int xpos, int xoffset,
169                                 int start_pixpos, int width, face_index findex,
170                                 int cursor, int cursor_start, int cursor_width,
171                                 int cursor_height);
172   /* color methods */
173   int (*initialize_color_instance_method) (Lisp_Color_Instance *,
174                                            Lisp_Object name,
175                                            Lisp_Object device,
176                                            Error_behavior errb);
177   void (*mark_color_instance_method) (Lisp_Color_Instance *);
178   void (*print_color_instance_method) (Lisp_Color_Instance *,
179                                        Lisp_Object printcharfun,
180                                        int escapeflag);
181   void (*finalize_color_instance_method) (Lisp_Color_Instance *);
182   int (*color_instance_equal_method) (Lisp_Color_Instance *,
183                                       Lisp_Color_Instance *,
184                                       int depth);
185   unsigned long (*color_instance_hash_method) (Lisp_Color_Instance *,
186                                                int depth);
187   Lisp_Object (*color_instance_rgb_components_method) (Lisp_Color_Instance *);
188   int (*valid_color_name_p_method) (struct device *, Lisp_Object color);
189
190   /* font methods */
191   int (*initialize_font_instance_method) (Lisp_Font_Instance *,
192                                           Lisp_Object name,
193                                           Lisp_Object device,
194                                           Error_behavior errb);
195   void (*mark_font_instance_method) (Lisp_Font_Instance *);
196   void (*print_font_instance_method) (Lisp_Font_Instance *,
197                                       Lisp_Object printcharfun,
198                                       int escapeflag);
199   void (*finalize_font_instance_method) (Lisp_Font_Instance *);
200   Lisp_Object (*font_instance_truename_method) (Lisp_Font_Instance *,
201                                                 Error_behavior errb);
202   Lisp_Object (*font_instance_properties_method) (Lisp_Font_Instance *);
203   Lisp_Object (*list_fonts_method) (Lisp_Object pattern,
204                                     Lisp_Object device);
205   Lisp_Object (*find_charset_font_method) (Lisp_Object device,
206                                            Lisp_Object font,
207                                            Lisp_Object charset);
208   int (*font_spec_matches_charset_method) (struct device *d,
209                                            Lisp_Object charset,
210                                            CONST Bufbyte *nonreloc,
211                                            Lisp_Object reloc,
212                                            Bytecount offset,
213                                            Bytecount length);
214
215   /* image methods */
216   void (*mark_image_instance_method) (Lisp_Image_Instance *);
217   void (*print_image_instance_method) (Lisp_Image_Instance *,
218                                        Lisp_Object printcharfun,
219                                        int escapeflag);
220   void (*finalize_image_instance_method) (Lisp_Image_Instance *);
221   void (*unmap_subwindow_method) (Lisp_Image_Instance *);
222   void (*map_subwindow_method) (Lisp_Image_Instance *, int x, int y,
223                                 struct display_glyph_area* dga);
224   void (*resize_subwindow_method) (Lisp_Image_Instance *, int w, int h);
225   void (*update_subwindow_method) (Lisp_Image_Instance *);
226   int (*image_instance_equal_method) (Lisp_Image_Instance *,
227                                       Lisp_Image_Instance *,
228                                       int depth);
229   unsigned long (*image_instance_hash_method) (Lisp_Image_Instance *,
230                                                int depth);
231   void (*init_image_instance_from_eimage_method) (Lisp_Image_Instance *ii,
232                                                   int width, int height,
233                                                   int slices,
234                                                   unsigned char *eimage,
235                                                   int dest_mask,
236                                                   Lisp_Object instantiator,
237                                                   Lisp_Object domain);
238   Lisp_Object (*locate_pixmap_file_method) (Lisp_Object file_method);
239   int (*colorize_image_instance_method) (Lisp_Object image_instance,
240                                          Lisp_Object fg, Lisp_Object bg);
241   Lisp_Object image_conversion_list;
242
243 #ifdef HAVE_TOOLBARS
244   /* toolbar methods */
245   void (*output_frame_toolbars_method) (struct frame *);
246   void (*initialize_frame_toolbars_method) (struct frame *);
247   void (*free_frame_toolbars_method) (struct frame *);
248   void (*output_toolbar_button_method) (struct frame *, Lisp_Object);
249   void (*redraw_frame_toolbars_method) (struct frame *);
250   void (*redraw_exposed_toolbars_method) (struct frame *f, int x, int y,
251                                           int width, int height);
252 #endif
253
254 #ifdef HAVE_SCROLLBARS
255   /* scrollbar methods */
256   int (*inhibit_scrollbar_slider_size_change_method) (void);
257   void (*free_scrollbar_instance_method) (struct scrollbar_instance *);
258   void (*release_scrollbar_instance_method) (struct scrollbar_instance *);
259   void (*create_scrollbar_instance_method) (struct frame *, int,
260                                             struct scrollbar_instance *);
261   void (*update_scrollbar_instance_values_method) (struct window *,
262                                                    struct scrollbar_instance *,
263                                                    int, int, int, int, int,
264                                                    int, int, int, int, int);
265   void (*update_scrollbar_instance_status_method) (struct window *, int, int,
266                                                    struct
267                                                    scrollbar_instance *);
268   void (*scrollbar_pointer_changed_in_window_method) (struct window *w);
269 #ifdef MEMORY_USAGE_STATS
270   int (*compute_scrollbar_instance_usage_method) (struct device *,
271                                                   struct scrollbar_instance *,
272                                                   struct overhead_stats *);
273 #endif
274 #endif /* HAVE_SCROLLBARS */
275
276 #ifdef HAVE_MENUBARS
277   /* menubar methods */
278   void (*update_frame_menubars_method) (struct frame *);
279   void (*free_frame_menubars_method) (struct frame *);
280 #endif
281
282 #ifdef HAVE_DIALOGS
283   /* dialog methods */
284   void (*popup_dialog_box_method) (struct frame *, Lisp_Object dbox_desc);
285 #endif
286 };
287
288 /*
289  * Constants returned by device_implementation_flags_method
290  */
291
292 /* Set when device uses pixel-based geometry */
293 #define XDEVIMPF_PIXEL_GEOMETRY     0x00000001L
294
295 /* Indicates that the device is a printer */
296 #define XDEVIMPF_IS_A_PRINTER       0x00000002L
297
298 /* Do not automatically redisplay this device */
299 #define XDEVIMPF_NO_AUTO_REDISPLAY  0x00000004L
300
301 /* Do not delete the device when last frame's gone */
302 #define XDEVIMPF_FRAMELESS_OK       0x00000008L
303
304
305 #define CONSOLE_TYPE_NAME(c) ((c)->conmeths->name)
306 #define CONSOLE_TYPE(c) ((c)->conmeths->symbol)
307 #define CONMETH_TYPE(meths) ((meths)->symbol)
308
309 /******** Accessing / calling a console method *********/
310
311 #define HAS_CONTYPE_METH_P(meth, m) ((meth)->m##_method)
312 #define CONTYPE_METH(meth, m, args) (((meth)->m##_method) args)
313
314 /* Call a void-returning console method, if it exists */
315 #define MAYBE_CONTYPE_METH(meth, m, args) do {                  \
316   struct console_methods *maybe_contype_meth_meth = (meth);     \
317   if (HAS_CONTYPE_METH_P (maybe_contype_meth_meth, m))          \
318     CONTYPE_METH (maybe_contype_meth_meth, m, args);            \
319 } while (0)
320
321 /* Call a console method, if it exists; otherwise return
322    the specified value - meth is multiply evaluated.  */
323 #define CONTYPE_METH_OR_GIVEN(meth, m, args, given)     \
324   (HAS_CONTYPE_METH_P (meth, m) ?                       \
325    CONTYPE_METH (meth, m, args) : (given))
326
327 /* Call an int-returning console method, if it exists; otherwise
328    return 0 */
329 #define MAYBE_INT_CONTYPE_METH(meth, m, args) \
330   CONTYPE_METH_OR_GIVEN (meth, m, args, 0)
331
332 /* Call an Lisp-Object-returning console method, if it exists;
333    otherwise return Qnil */
334 #define MAYBE_LISP_CONTYPE_METH(meth, m, args) \
335   CONTYPE_METH_OR_GIVEN (meth, m, args, Qnil)
336
337 /******** Same functions, operating on a console instead of a
338           struct console_methods ********/
339
340 #define HAS_CONMETH_P(c, m) HAS_CONTYPE_METH_P ((c)->conmeths, m)
341 #define CONMETH(c, m, args) CONTYPE_METH ((c)->conmeths, m, args)
342 #define MAYBE_CONMETH(c, m, args) MAYBE_CONTYPE_METH ((c)->conmeths, m, args)
343 #define CONMETH_OR_GIVEN(c, m, args, given) \
344   CONTYPE_METH_OR_GIVEN((c)->conmeths, m, args, given)
345 #define MAYBE_INT_CONMETH(c, m, args) \
346   MAYBE_INT_CONTYPE_METH ((c)->conmeths, m, args)
347 #define MAYBE_LISP_CONMETH(c, m, args) \
348   MAYBE_LISP_CONTYPE_METH ((c)->conmeths, m, args)
349
350 /******** Defining new console types ********/
351
352 typedef struct console_type_entry console_type_entry;
353 struct console_type_entry
354 {
355   Lisp_Object symbol;
356   struct console_methods *meths;
357 };
358
359 #define DECLARE_CONSOLE_TYPE(type) \
360 extern struct console_methods * type##_console_methods
361
362 #define DEFINE_CONSOLE_TYPE(type) \
363 struct console_methods * type##_console_methods
364
365 #define INITIALIZE_CONSOLE_TYPE(type, obj_name, pred_sym) do {          \
366     type##_console_methods = xnew_and_zero (struct console_methods);    \
367     type##_console_methods->name = obj_name;                            \
368     type##_console_methods->symbol = Q##type;                           \
369     defsymbol_nodump (&type##_console_methods->predicate_symbol, pred_sym);     \
370     add_entry_to_console_type_list (Q##type, type##_console_methods);   \
371     type##_console_methods->image_conversion_list = Qnil;               \
372     staticpro_nodump (&type##_console_methods->image_conversion_list);  \
373     dumpstruct (&type##_console_methods, &console_methods_description); \
374 } while (0)
375
376 #define REINITIALIZE_CONSOLE_TYPE(type) do {    \
377     staticpro_nodump (&type##_console_methods->predicate_symbol);       \
378     staticpro_nodump (&type##_console_methods->image_conversion_list);  \
379 } while (0)
380
381
382 /* Declare that console-type TYPE has method M; used in
383    initialization routines */
384 #define CONSOLE_HAS_METHOD(type, m) \
385   (type##_console_methods->m##_method = type##_##m)
386
387 /* Declare that console-type TYPE inherits method M
388    implementation from console-type FROMTYPE */
389 #define CONSOLE_INHERITS_METHOD(type, fromtype, m) \
390   (type##_console_methods->m##_method = fromtype##_##m)
391
392 struct console
393 {
394   struct lcrecord_header header;
395
396   /* Description of this console's methods.  */
397   struct console_methods *conmeths;
398
399   /* A structure of auxiliary data specific to the console type.
400      struct x_console is used for X window frames; defined in console-x.h
401      struct tty_console is used to TTY's; defined in console-tty.h */
402   void *console_data;
403
404   /* Character that causes a quit.  Normally C-g.
405      #### Should be possible for this not to be ASCII. */
406   int quit_char;
407
408   /* ----- begin partially-completed console localization of
409            event loop ---- */
410
411   int local_var_flags;
412
413 #define MARKED_SLOT(x) Lisp_Object x
414 #include "conslots.h"
415 #undef MARKED_SLOT
416
417   /* Where to store the next keystroke of the macro.
418      Index into con->kbd_macro_builder. */
419   int kbd_macro_ptr;
420
421   /* The finalized section of the macro starts at kbd_macro_buffer and
422      ends before this.  This is not the same as kbd_macro_pointer, because
423      we advance this to kbd_macro_pointer when a key's command is complete.
424      This way, the keystrokes for "end-kbd-macro" are not included in the
425      macro.  */
426   int kbd_macro_end;
427
428   /* ----- end partially-completed console localization of event loop ---- */
429
430   unsigned int input_enabled :1;
431 };
432
433 DECLARE_LRECORD (console, struct console);
434 #define XCONSOLE(x) XRECORD (x, console, struct console)
435 #define XSETCONSOLE(x, p) XSETRECORD (x, p, console)
436 #define CONSOLEP(x) RECORDP (x, console)
437 #define CHECK_CONSOLE(x) CHECK_RECORD (x, console)
438 #define CONCHECK_CONSOLE(x) CONCHECK_RECORD (x, console)
439
440 #define CHECK_LIVE_CONSOLE(x) do {                      \
441   CHECK_CONSOLE (x);                                    \
442   if (! CONSOLE_LIVE_P (XCONSOLE (x)))                  \
443     dead_wrong_type_argument (Qconsole_live_p, (x));    \
444 } while (0)
445 #define CONCHECK_LIVE_CONSOLE(x) do {                   \
446   CONCHECK_CONSOLE (x);                                 \
447   if (! CONSOLE_LIVE_P (XCONSOLE (x)))                  \
448     x = wrong_type_argument (Qconsole_live_p, (x));     \
449 } while (0)
450
451 #define CONSOLE_TYPE_P(con, type) EQ (CONSOLE_TYPE (con), Q##type)
452
453 #ifdef ERROR_CHECK_TYPECHECK
454 INLINE struct console *
455 error_check_console_type (struct console *con, Lisp_Object sym);
456 INLINE struct console *
457 error_check_console_type (struct console *con, Lisp_Object sym)
458 {
459   assert (EQ (CONSOLE_TYPE (con), sym));
460   return con;
461 }
462 # define CONSOLE_TYPE_DATA(con, type)                   \
463   (*(struct type##_console **)                          \
464    &(error_check_console_type (con, Q##type))->console_data)
465 #else
466 # define CONSOLE_TYPE_DATA(con, type)                   \
467   (*(struct type##_console **) &((con)->console_data))
468 #endif
469
470 #define CHECK_CONSOLE_TYPE(x, type) do {                \
471   CHECK_CONSOLE (x);                                    \
472   if (! CONSOLE_TYPE_P (XCONSOLE (x), type))            \
473     dead_wrong_type_argument                            \
474       (type##_console_methods->predicate_symbol, x);    \
475 } while (0)
476 #define CONCHECK_CONSOLE_TYPE(x, type) do {             \
477   CONCHECK_CONSOLE (x);                                 \
478   if (!(CONSOLEP (x) &&                                 \
479         CONSOLE_TYPE_P (XCONSOLE (x), type)))           \
480     x = wrong_type_argument                             \
481       (type##_console_methods->predicate_symbol, x);    \
482 } while (0)
483
484 /* #### These should be in the console-*.h files but there are
485    too many places where the abstraction is broken.  Need to
486    fix. */
487
488 #ifdef HAVE_X_WINDOWS
489 #define CONSOLE_TYPESYM_X_P(typesym) EQ (typesym, Qx)
490 #else
491 #define CONSOLE_TYPESYM_X_P(typesym) 0
492 #endif
493 #ifdef HAVE_TTY
494 #define CONSOLE_TYPESYM_TTY_P(typesym) EQ (typesym, Qtty)
495 #else
496 #define CONSOLE_TYPESYM_TTY_P(typesym) 0
497 #endif
498 #ifdef HAVE_MS_WINDOWS
499 #define CONSOLE_TYPESYM_MSWINDOWS_P(typesym) EQ (typesym, Qmswindows)
500 #else
501 #define CONSOLE_TYPESYM_MSWINDOWS_P(typesym) 0
502 #endif
503 #define CONSOLE_TYPESYM_STREAM_P(typesym) EQ (typesym, Qstream)
504
505 #define CONSOLE_TYPESYM_WIN_P(typesym) \
506   (CONSOLE_TYPESYM_X_P (typesym) || CONSOLE_TYPESYM_MSWINDOWS_P (typesym))
507
508 #define CONSOLE_X_P(con) CONSOLE_TYPESYM_X_P (CONSOLE_TYPE (con))
509 #define CHECK_X_CONSOLE(z) CHECK_CONSOLE_TYPE (z, x)
510 #define CONCHECK_X_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, x)
511
512 #define CONSOLE_TTY_P(con) CONSOLE_TYPESYM_TTY_P (CONSOLE_TYPE (con))
513 #define CHECK_TTY_CONSOLE(z) CHECK_CONSOLE_TYPE (z, tty)
514 #define CONCHECK_TTY_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, tty)
515
516 #define CONSOLE_MSWINDOWS_P(con) CONSOLE_TYPESYM_MSWINDOWS_P (CONSOLE_TYPE (con))
517 #define CHECK_MSWINDOWS_CONSOLE(z) CHECK_CONSOLE_TYPE (z, mswindows)
518 #define CONCHECK_MSWINDOWS_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, mswindows)
519
520 #define CONSOLE_STREAM_P(con) CONSOLE_TYPESYM_STREAM_P (CONSOLE_TYPE (con))
521 #define CHECK_STREAM_CONSOLE(z) CHECK_CONSOLE_TYPE (z, stream)
522 #define CONCHECK_STREAM_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, stream)
523
524 #define CONSOLE_WIN_P(con) CONSOLE_TYPESYM_WIN_P (CONSOLE_TYPE (con))
525
526 EXFUN (Fconsole_disable_input, 1);
527 EXFUN (Fdelete_console, 2);
528 EXFUN (Fselect_console, 1);
529 EXFUN (Fselected_console, 0);
530
531 extern Lisp_Object Qcreate_console_hook, Qdelete_console_hook;
532 extern Lisp_Object Vconsole_defaults, Vconsole_type_list, Vselected_console;
533
534 /* This structure marks which slots in a console have corresponding
535    default values in console_defaults.
536    Each such slot has a nonzero value in this structure.
537    The value has only one nonzero bit.
538
539    When a console has its own local value for a slot,
540    the bit for that slot (found in the same slot in this structure)
541    is turned on in the console's local_var_flags slot.
542
543    If a slot in this structure is zero, then even though there may
544    be a DEFVAR_CONSOLE_LOCAL for the slot, there is no default value for it;
545    and the corresponding slot in console_defaults is not used.  */
546
547 extern struct console console_local_flags;
548
549 int valid_console_type_p (Lisp_Object type);
550
551 #define CONSOLE_LIVE_P(con) (!EQ (CONSOLE_TYPE (con), Qdead))
552
553 #define CONSOLE_NAME(con) ((con)->name)
554 #define CONSOLE_CONNECTION(con) ((con)->connection)
555 #define CONSOLE_CANON_CONNECTION(con) ((con)->canon_connection)
556 #define CONSOLE_FUNCTION_KEY_MAP(con) ((con)->function_key_map)
557 #define CONSOLE_DEVICE_LIST(con) ((con)->device_list)
558 #define CONSOLE_SELECTED_DEVICE(con) ((con)->selected_device)
559 #define CONSOLE_SELECTED_FRAME(con) \
560   DEVICE_SELECTED_FRAME (XDEVICE ((con)->selected_device))
561 #define CONSOLE_LAST_NONMINIBUF_FRAME(con) NON_LVALUE ((con)->last_nonminibuf_frame)
562 #define CONSOLE_QUIT_CHAR(con) ((con)->quit_char)
563
564 #define CDFW_CONSOLE(obj)                               \
565    (WINDOWP  (obj) ? WINDOW_CONSOLE (XWINDOW (obj))     \
566  : (FRAMEP   (obj) ?  FRAME_CONSOLE (XFRAME  (obj))     \
567  : (DEVICEP  (obj) ? DEVICE_CONSOLE (XDEVICE (obj))     \
568  : (CONSOLEP (obj) ? obj                                \
569  : Qnil))))
570
571 #define CONSOLE_LOOP(concons) LIST_LOOP (concons, Vconsole_list)
572 #define CONSOLE_DEVICE_LOOP(devcons, con) \
573   LIST_LOOP (devcons, CONSOLE_DEVICE_LIST (con))
574
575 DECLARE_CONSOLE_TYPE (dead);
576 extern console_type_entry_dynarr *the_console_type_entry_dynarr;
577
578 Lisp_Object create_console (Lisp_Object name, Lisp_Object type,
579                             Lisp_Object connection, Lisp_Object props);
580 void select_console_1 (Lisp_Object);
581 struct console *decode_console (Lisp_Object);
582 Lisp_Object make_console (struct console *c);
583 void add_entry_to_console_type_list (Lisp_Object symbol,
584                                      struct console_methods *type);
585 struct console_methods *decode_console_type (Lisp_Object type,
586                                              Error_behavior errb);
587 void delete_console_internal (struct console *con, int force,
588                               int from_kill_emacs, int from_io_error);
589 void io_error_delete_console (Lisp_Object console);
590 void set_console_last_nonminibuf_frame (struct console *con,
591                                         Lisp_Object frame);
592
593 #endif /* INCLUDED_console_h_ */