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