Mercurial > hg > xemacs-beta
annotate src/console-impl.h @ 5080:5502045ec510
The background-placement face property.
-------------------- ChangeLog entries follow: --------------------
lisp/ChangeLog addition:
2010-02-25 Didier Verna <didier@xemacs.org>
The background-placement face property.
* cl-macs.el (face-background-placement): New defsetf.
* cus-face.el (custom-face-attributes):
* faces.el (face-interactive):
* faces.el (set-face-property):
* faces.el (face-equal):
* faces.el (init-other-random-faces): Update.
* faces.el (face-background-placement):
* faces.el (set-face-background-placement):
* faces.el (face-background-placement-instance):
* faces.el (face-background-placement-instance-p):
* frame.el (set-frame-background-placement):
* frame.el (frame-background-placement):
* frame.el (frame-background-placement-instance):
* objects.el (make-face-background-placement-specifier): New.
man/ChangeLog addition:
2010-02-25 Didier Verna <didier@xemacs.org>
The background-placement face property.
* xemacs/custom.texi (Faces): Document it.
src/ChangeLog addition:
2010-02-25 Didier Verna <didier@xemacs.org>
The background-placement face property.
* console-x-impl.h (struct x_frame): Add new slots x and y.
* console-x-impl.h (FRAME_X_X, FRAME_X_Y): New slot accessors.
* console-gtk-impl.h: Fake something similar for potential port.
* frame-x.c (x_get_frame_text_position): New function.
* frame-x.c (x_init_frame_3): Use it.
* event-Xt.c (emacs_Xt_handle_magic_event): Eat spurious
ConfigureNotify events, get the frame position and mark frame
faces changed.
* objects-impl.h: The face_background_placement_specifier
structure and its accessors.
* objects.c: New symbols Qabsolute and Qrelative.
* objects.c (face_background_placement_create):
* objects.c (face_background_placement_mark):
* objects.c (face_background_placement_instantiate):
* objects.c (face_background_placement_validate):
* objects.c (face_background_placement_after_change):
* objects.c (set_face_background_placement_attached_to): New.
* objects.h (set_face_background_palcement_attached_to): Declare
the one above.
* objects.c (syms_of_objects):
* objects.c (specifier_type_create_objects):
* objects.c (reinit_specifier_type_create_objects):
* objects.c (reinit_vars_of_objects): Update for the modifications
above.
* console-xlike-inc.h (XLIKE_GC_TS_X_ORIGIN, XLIKE_GC_TS_X_ORIGIN):
New X11/Gtk compatibility macros.
* redisplay-xlike-inc.c (XLIKE_get_gc): Add a background placement
argument and handle it.
* gtk-glue.c (face_to_gc):
* redisplay-xlike-inc.c (XLIKE_output_string):
* redisplay-xlike-inc.c (XLIKE_output_pixmap):
* redisplay-xlike-inc.c (XLIKE_output_blank):
* redisplay-xlike-inc.c (XLIKE_output_horizontal_line):
* redisplay-xlike-inc.c (XLIKE_output_eol_cursor): Update
accordingly.
* console-impl.h (struct console_methods): Add a background
placement (Lisp_Object) argument to the clear_region method.
* console-stream.c (stream_clear_region):
* redisplay-tty.c (tty_clear_region):
* redisplay-msw.c (mswindows_clear_region):
* redisplay-xlike-inc.c (XLIKE_clear_region): Update accordingly.
* redisplay-output.c (redisplay_clear_region): Handle the
background placement property and update the call to the
clear_region method.
* faces.h (struct Lisp_Face):
* faces.h (struct face_cachel): Add a background placement slot.
* faces.h (WINDOW_FACE_CACHEL_BACKGROUND_PLACEMENT): New accessor.
* faces.c (mark_face):
* faces.c (face_equal):
* faces.c (face_getprop):
* faces.c (face_putprop):
* faces.c (face_remprop):
* faces.c (face_plist):
* faces.c (reset_face):
* faces.c (mark_face_cachels):
* faces.c (update_face_cachel_data):
* faces.c (merge_face_cachel_data):
* faces.c (reset_face_cachel):
* faces.c (Fmake_face):
* faces.c (Fcopy_face): Handle the background placement property.
* faces.c (syms_of_faces):
* faces.c (vars_of_faces):
* faces.c (complex_vars_of_faces): Update accordingly.
author | Didier Verna <didier@lrde.epita.fr> |
---|---|
date | Thu, 25 Feb 2010 16:19:01 +0100 |
parents | ea701c23ed84 |
children | 7be849cb8828 |
rev | line source |
---|---|
872 | 1 /* Define console object for XEmacs. |
2959 | 2 Copyright (C) 1996, 2002, 2003, 2005 Ben Wing |
872 | 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_impl_h_ | |
26 #define INCLUDED_console_impl_h_ | |
27 | |
28 #include "console.h" | |
3659 | 29 #include "specifier.h" |
872 | 30 |
1204 | 31 extern const struct sized_memory_description cted_description; |
32 extern const struct sized_memory_description console_methods_description; | |
872 | 33 |
34 | |
35 /* | |
36 * Constants returned by device_implementation_flags_method | |
37 */ | |
38 | |
39 /* Set when device uses pixel-based geometry */ | |
40 #define XDEVIMPF_PIXEL_GEOMETRY 0x00000001L | |
41 | |
42 /* Indicates that the device is a printer */ | |
43 #define XDEVIMPF_IS_A_PRINTER 0x00000002L | |
44 | |
45 /* Do not automatically redisplay this device */ | |
46 #define XDEVIMPF_NO_AUTO_REDISPLAY 0x00000004L | |
47 | |
48 /* Do not delete the device when last frame's gone */ | |
49 #define XDEVIMPF_FRAMELESS_OK 0x00000008L | |
50 | |
51 /* Do not preempt resiaply of frame or device once it starts */ | |
52 #define XDEVIMPF_DONT_PREEMPT_REDISPLAY 0x00000010L | |
53 | |
54 struct console_methods | |
55 { | |
56 const char *name; /* Used by print_console, print_device, print_frame */ | |
57 Lisp_Object symbol; | |
58 Lisp_Object predicate_symbol; | |
59 unsigned int flags; /* Read-only implementation flags, set once upon | |
60 console type creation. INITIALIZE_CONSOLE_TYPE sets | |
61 this member to 0. */ | |
62 | |
63 /* console methods */ | |
64 void (*init_console_method) (struct console *, Lisp_Object props); | |
65 void (*mark_console_method) (struct console *); | |
66 int (*initially_selected_for_input_method) (struct console *); | |
67 void (*delete_console_method) (struct console *); | |
68 Lisp_Object (*semi_canonicalize_console_connection_method) | |
69 (Lisp_Object connection, Error_Behavior errb); | |
70 Lisp_Object (*semi_canonicalize_device_connection_method) | |
71 (Lisp_Object connection, Error_Behavior errb); | |
72 Lisp_Object (*canonicalize_console_connection_method) | |
73 (Lisp_Object connection, Error_Behavior errb); | |
74 Lisp_Object (*canonicalize_device_connection_method) | |
75 (Lisp_Object connection, Error_Behavior errb); | |
76 Lisp_Object (*device_to_console_connection_method) | |
77 (Lisp_Object connection, Error_Behavior errb); | |
2828 | 78 Lisp_Object (*perhaps_init_unseen_key_defaults_method) |
79 (struct console *, Lisp_Object keysym); | |
872 | 80 |
81 /* device methods */ | |
82 void (*init_device_method) (struct device *, Lisp_Object props); | |
83 void (*finish_init_device_method) (struct device *, Lisp_Object props); | |
84 void (*delete_device_method) (struct device *); | |
85 void (*mark_device_method) (struct device *); | |
86 void (*asynch_device_change_method) (void); | |
87 Lisp_Object (*device_system_metrics_method) (struct device *, | |
88 enum device_metrics); | |
89 Lisp_Object (*own_selection_method)(Lisp_Object selection_name, | |
90 Lisp_Object selection_value, | |
91 Lisp_Object how_to_add, | |
92 Lisp_Object selection_type, | |
93 int owned_p); | |
94 void (*disown_selection_method)(Lisp_Object selection_name, | |
95 Lisp_Object timeval); | |
96 Lisp_Object (*get_foreign_selection_method) (Lisp_Object selection_symbol, | |
97 Lisp_Object target_type); | |
98 Lisp_Object (*selection_exists_p_method)(Lisp_Object selection_name, | |
99 Lisp_Object selection_type); | |
100 Lisp_Object (*available_selection_types_method)(Lisp_Object selection_name); | |
101 Lisp_Object (*register_selection_data_type_method)(Lisp_Object type_name); | |
102 Lisp_Object (*selection_data_type_name_method)(Lisp_Object type); | |
103 | |
104 /* frame methods */ | |
105 Lisp_Object *device_specific_frame_props; | |
106 void (*init_frame_1_method) (struct frame *, Lisp_Object properties, | |
107 int frame_name_is_defaulted); | |
108 void (*init_frame_2_method) (struct frame *, Lisp_Object properties); | |
109 void (*init_frame_3_method) (struct frame *); | |
110 void (*after_init_frame_method) (struct frame *, int first_on_device, | |
111 int first_on_console); | |
112 void (*mark_frame_method) (struct frame *); | |
113 void (*delete_frame_method) (struct frame *); | |
114 void (*focus_on_frame_method) (struct frame *); | |
115 void (*raise_frame_method) (struct frame *); | |
116 void (*lower_frame_method) (struct frame *); | |
117 void (*enable_frame_method) (struct frame *); | |
118 void (*disable_frame_method) (struct frame *); | |
119 int (*get_mouse_position_method) (struct device *d, Lisp_Object *frame, | |
120 int *x, int *y); | |
121 void (*set_mouse_position_method) (struct window *w, int x, int y); | |
122 void (*make_frame_visible_method) (struct frame *f); | |
123 void (*make_frame_invisible_method) (struct frame *f); | |
124 void (*iconify_frame_method) (struct frame *f); | |
125 Lisp_Object (*frame_property_method) (struct frame *f, Lisp_Object prop); | |
126 int (*internal_frame_property_p_method) (struct frame *f, | |
127 Lisp_Object prop); | |
128 Lisp_Object (*frame_properties_method) (struct frame *f); | |
129 void (*set_frame_properties_method) (struct frame *f, Lisp_Object plist); | |
130 void (*set_frame_size_method) (struct frame *f, int width, int height); | |
131 void (*set_frame_position_method) (struct frame *f, int xoff, int yoff); | |
132 int (*frame_visible_p_method) (struct frame *f); | |
133 int (*frame_totally_visible_p_method) (struct frame *f); | |
134 int (*frame_iconified_p_method) (struct frame *f); | |
135 void (*set_title_from_ibyte_method) (struct frame *f, Ibyte *title); | |
136 void (*set_icon_name_from_ibyte_method) (struct frame *f, Ibyte *title); | |
137 void (*set_frame_pointer_method) (struct frame *f); | |
138 void (*set_frame_icon_method) (struct frame *f); | |
139 void (*popup_menu_method) (Lisp_Object menu, Lisp_Object event); | |
140 Lisp_Object (*get_frame_parent_method) (struct frame *f); | |
141 void (*update_frame_external_traits_method) (struct frame *f, Lisp_Object name); | |
142 int (*frame_size_fixed_p_method) (struct frame *f); | |
143 void (*eject_page_method) (struct frame *f); | |
144 | |
145 /* redisplay methods */ | |
146 int (*left_margin_width_method) (struct window *); | |
147 int (*right_margin_width_method) (struct window *); | |
4928
ea701c23ed84
change text_width method to take a window, in preparation for unicode-internal changes
Ben Wing <ben@xemacs.org>
parents:
3659
diff
changeset
|
148 int (*text_width_method) (struct window *w, struct face_cachel *cachel, |
872 | 149 const Ichar *str, Charcount len); |
150 void (*output_display_block_method) (struct window *, struct display_line *, | |
151 int, int, int, int, int, int, int); | |
152 int (*divider_height_method) (void); | |
153 int (*eol_cursor_width_method) (void); | |
154 void (*output_vertical_divider_method) (struct window *, int); | |
155 void (*clear_to_window_end_method) (struct window *, int, int); | |
5080
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
4928
diff
changeset
|
156 void (*clear_region_method) (Lisp_Object, struct device*, struct frame*, |
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
4928
diff
changeset
|
157 face_index, int, int, int, int, |
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
4928
diff
changeset
|
158 Lisp_Object, Lisp_Object, |
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
4928
diff
changeset
|
159 Lisp_Object, Lisp_Object); |
872 | 160 void (*clear_frame_method) (struct frame *); |
161 void (*window_output_begin_method) (struct window *); | |
162 void (*frame_output_begin_method) (struct frame *); | |
163 void (*window_output_end_method) (struct window *); | |
164 void (*frame_output_end_method) (struct frame *); | |
165 int (*flash_method) (struct device *); | |
166 void (*ring_bell_method) (struct device *, int volume, int pitch, | |
167 int duration); | |
168 void (*frame_redraw_cursor_method) (struct frame *f); | |
169 void (*set_final_cursor_coords_method) (struct frame *, int, int); | |
170 void (*bevel_area_method) (struct window *, face_index, int, int, int, int, int, | |
171 int, enum edge_style); | |
172 void (*output_pixmap_method) (struct window *w, Lisp_Object image_instance, | |
173 struct display_box *db, struct display_glyph_area *dga, | |
174 face_index findex, int cursor_start, int cursor_width, | |
175 int cursor_height, int offset_bitmap); | |
176 void (*output_string_method) (struct window *w, struct display_line *dl, | |
177 Ichar_dynarr *buf, int xpos, int xoffset, | |
178 int start_pixpos, int width, face_index findex, | |
179 int cursor, int cursor_start, int cursor_width, | |
180 int cursor_height); | |
181 | |
182 /* color methods */ | |
183 int (*initialize_color_instance_method) (Lisp_Color_Instance *, | |
184 Lisp_Object name, | |
185 Lisp_Object device, | |
186 Error_Behavior errb); | |
187 void (*mark_color_instance_method) (Lisp_Color_Instance *); | |
188 void (*print_color_instance_method) (Lisp_Color_Instance *, | |
189 Lisp_Object printcharfun, | |
190 int escapeflag); | |
191 void (*finalize_color_instance_method) (Lisp_Color_Instance *); | |
192 int (*color_instance_equal_method) (Lisp_Color_Instance *, | |
193 Lisp_Color_Instance *, | |
194 int depth); | |
195 Hashcode (*color_instance_hash_method) (Lisp_Color_Instance *, | |
196 int depth); | |
197 Lisp_Object (*color_instance_rgb_components_method) (Lisp_Color_Instance *); | |
198 int (*valid_color_name_p_method) (struct device *, Lisp_Object color); | |
2527 | 199 Lisp_Object (*color_list_method) (void); |
872 | 200 |
201 /* font methods */ | |
202 int (*initialize_font_instance_method) (Lisp_Font_Instance *, | |
203 Lisp_Object name, | |
204 Lisp_Object device, | |
205 Error_Behavior errb); | |
206 void (*mark_font_instance_method) (Lisp_Font_Instance *); | |
207 void (*print_font_instance_method) (Lisp_Font_Instance *, | |
208 Lisp_Object printcharfun, | |
209 int escapeflag); | |
210 void (*finalize_font_instance_method) (Lisp_Font_Instance *); | |
211 Lisp_Object (*font_instance_truename_method) (Lisp_Font_Instance *, | |
212 Error_Behavior errb); | |
213 Lisp_Object (*font_instance_properties_method) (Lisp_Font_Instance *); | |
2527 | 214 Lisp_Object (*font_list_method) (Lisp_Object pattern, |
1701 | 215 Lisp_Object device, |
216 Lisp_Object maxnumber); | |
3659 | 217 Lisp_Object (*find_charset_font_method) |
218 (Lisp_Object device, Lisp_Object font, Lisp_Object charset, | |
219 enum font_specifier_matchspec_stages stage); | |
220 int (*font_spec_matches_charset_method) | |
221 (struct device *d, Lisp_Object charset, const Ibyte *nonreloc, | |
222 Lisp_Object reloc, Bytecount offset, Bytecount length, | |
223 enum font_specifier_matchspec_stages stage); | |
872 | 224 |
225 /* image methods */ | |
226 void (*mark_image_instance_method) (Lisp_Image_Instance *); | |
227 void (*print_image_instance_method) (Lisp_Image_Instance *, | |
228 Lisp_Object printcharfun, | |
229 int escapeflag); | |
230 void (*finalize_image_instance_method) (Lisp_Image_Instance *); | |
231 void (*unmap_subwindow_method) (Lisp_Image_Instance *); | |
232 void (*map_subwindow_method) (Lisp_Image_Instance *, int x, int y, | |
233 struct display_glyph_area* dga); | |
234 void (*resize_subwindow_method) (Lisp_Image_Instance *, int w, int h); | |
235 void (*redisplay_subwindow_method) (Lisp_Image_Instance *); | |
236 void (*redisplay_widget_method) (Lisp_Image_Instance *); | |
237 /* Maybe this should be a specifier. Unfortunately specifiers don't | |
238 allow us to represent things at the toolkit level, which is what | |
239 is required here. */ | |
240 int (*widget_border_width_method) (void); | |
241 int (*widget_spacing_method) (Lisp_Image_Instance *); | |
242 int (*image_instance_equal_method) (Lisp_Image_Instance *, | |
243 Lisp_Image_Instance *, | |
244 int depth); | |
245 Hashcode (*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, | |
2959 | 253 Lisp_Object pointer_fg, |
254 Lisp_Object pointer_bg, | |
872 | 255 Lisp_Object domain); |
256 Lisp_Object (*locate_pixmap_file_method) (Lisp_Object file_method); | |
257 int (*colorize_image_instance_method) (Lisp_Object image_instance, | |
258 Lisp_Object fg, Lisp_Object bg); | |
259 void (*widget_query_string_geometry_method) (Lisp_Object string, | |
260 Lisp_Object face, | |
261 int* width, int* height, | |
262 Lisp_Object domain); | |
263 Lisp_Object image_conversion_list; | |
264 | |
265 #ifdef HAVE_TOOLBARS | |
266 /* toolbar methods */ | |
267 void (*output_frame_toolbars_method) (struct frame *); | |
905 | 268 void (*clear_frame_toolbars_method) (struct frame *); |
872 | 269 void (*initialize_frame_toolbars_method) (struct frame *); |
270 void (*free_frame_toolbars_method) (struct frame *); | |
271 void (*output_toolbar_button_method) (struct frame *, Lisp_Object); | |
272 void (*redraw_frame_toolbars_method) (struct frame *); | |
273 void (*redraw_exposed_toolbars_method) (struct frame *f, int x, int y, | |
274 int width, int height); | |
275 #endif | |
276 | |
277 #ifdef HAVE_SCROLLBARS | |
278 /* scrollbar methods */ | |
279 int (*inhibit_scrollbar_slider_size_change_method) (void); | |
280 void (*free_scrollbar_instance_method) (struct scrollbar_instance *); | |
281 void (*release_scrollbar_instance_method) (struct scrollbar_instance *); | |
282 void (*create_scrollbar_instance_method) (struct frame *, int, | |
283 struct scrollbar_instance *); | |
284 void (*update_scrollbar_instance_values_method) (struct window *, | |
285 struct scrollbar_instance *, | |
286 int, int, int, int, int, | |
287 int, int, int, int, int); | |
288 void (*update_scrollbar_instance_status_method) (struct window *, int, int, | |
289 struct | |
290 scrollbar_instance *); | |
291 void (*scrollbar_pointer_changed_in_window_method) (struct window *w); | |
292 #ifdef MEMORY_USAGE_STATS | |
293 int (*compute_scrollbar_instance_usage_method) (struct device *, | |
294 struct scrollbar_instance *, | |
295 struct overhead_stats *); | |
296 #endif | |
1318 | 297 /* Paint the window's deadbox, a rectangle between window |
298 borders and two short edges of both scrollbars. */ | |
299 void (*redisplay_deadbox_method) (struct window *w, int x, int y, int width, | |
300 int height); | |
872 | 301 #endif /* HAVE_SCROLLBARS */ |
302 | |
303 #ifdef HAVE_MENUBARS | |
304 /* menubar methods */ | |
305 void (*update_frame_menubars_method) (struct frame *); | |
306 void (*free_frame_menubars_method) (struct frame *); | |
307 #endif | |
308 | |
309 #ifdef HAVE_DIALOGS | |
310 /* dialog methods */ | |
311 Lisp_Object (*make_dialog_box_internal_method) (struct frame *, | |
312 Lisp_Object type, | |
313 Lisp_Object keys); | |
314 #endif | |
315 }; | |
316 | |
317 #define CONMETH_TYPE(meths) ((meths)->symbol) | |
318 #define CONMETH_IMPL_FLAG(meths, f) ((meths)->flags & (f)) | |
319 | |
320 #define CONSOLE_TYPE_NAME(c) ((c)->conmeths->name) | |
321 #define CONSOLE_TYPE(c) ((c)->conmeths->symbol) | |
322 #define CONSOLE_IMPL_FLAG(c, f) CONMETH_IMPL_FLAG ((c)->conmeths, (f)) | |
323 | |
324 /******** Accessing / calling a console method *********/ | |
325 | |
326 #define HAS_CONTYPE_METH_P(meth, m) ((meth)->m##_method) | |
327 #define CONTYPE_METH(meth, m, args) (((meth)->m##_method) args) | |
328 | |
329 /* Call a void-returning console method, if it exists */ | |
330 #define MAYBE_CONTYPE_METH(meth, m, args) do { \ | |
331 struct console_methods *maybe_contype_meth_meth = (meth); \ | |
332 if (HAS_CONTYPE_METH_P (maybe_contype_meth_meth, m)) \ | |
333 CONTYPE_METH (maybe_contype_meth_meth, m, args); \ | |
334 } while (0) | |
335 | |
336 /* Call a console method, if it exists; otherwise return | |
337 the specified value - meth is multiply evaluated. */ | |
338 #define CONTYPE_METH_OR_GIVEN(meth, m, args, given) \ | |
339 (HAS_CONTYPE_METH_P (meth, m) ? \ | |
340 CONTYPE_METH (meth, m, args) : (given)) | |
341 | |
342 /* Call an int-returning console method, if it exists; otherwise | |
343 return 0 */ | |
344 #define MAYBE_INT_CONTYPE_METH(meth, m, args) \ | |
345 CONTYPE_METH_OR_GIVEN (meth, m, args, 0) | |
346 | |
347 /* Call an Lisp-Object-returning console method, if it exists; | |
348 otherwise return Qnil */ | |
349 #define MAYBE_LISP_CONTYPE_METH(meth, m, args) \ | |
350 CONTYPE_METH_OR_GIVEN (meth, m, args, Qnil) | |
351 | |
352 /******** Same functions, operating on a console instead of a | |
353 struct console_methods ********/ | |
354 | |
355 #define HAS_CONMETH_P(c, m) HAS_CONTYPE_METH_P ((c)->conmeths, m) | |
356 #define CONMETH(c, m, args) CONTYPE_METH ((c)->conmeths, m, args) | |
357 #define MAYBE_CONMETH(c, m, args) MAYBE_CONTYPE_METH ((c)->conmeths, m, args) | |
358 #define CONMETH_OR_GIVEN(c, m, args, given) \ | |
359 CONTYPE_METH_OR_GIVEN((c)->conmeths, m, args, given) | |
360 #define MAYBE_INT_CONMETH(c, m, args) \ | |
361 MAYBE_INT_CONTYPE_METH ((c)->conmeths, m, args) | |
362 #define MAYBE_LISP_CONMETH(c, m, args) \ | |
363 MAYBE_LISP_CONTYPE_METH ((c)->conmeths, m, args) | |
364 | |
365 /******** Defining new console types ********/ | |
366 | |
367 typedef struct console_type_entry console_type_entry; | |
368 struct console_type_entry | |
369 { | |
370 Lisp_Object symbol; | |
371 struct console_methods *meths; | |
372 }; | |
373 | |
374 #define DECLARE_CONSOLE_TYPE(type) \ | |
375 extern struct console_methods * type##_console_methods | |
376 | |
377 #define DEFINE_CONSOLE_TYPE(type) \ | |
378 struct console_methods * type##_console_methods | |
379 | |
380 #define INITIALIZE_CONSOLE_TYPE(type, obj_name, pred_sym) do { \ | |
381 type##_console_methods = xnew_and_zero (struct console_methods); \ | |
382 type##_console_methods->name = obj_name; \ | |
383 type##_console_methods->symbol = Q##type; \ | |
384 defsymbol_nodump (&type##_console_methods->predicate_symbol, pred_sym); \ | |
385 add_entry_to_console_type_list (Q##type, type##_console_methods); \ | |
386 type##_console_methods->image_conversion_list = Qnil; \ | |
387 staticpro_nodump (&type##_console_methods->image_conversion_list); \ | |
2367 | 388 dump_add_root_block_ptr (&type##_console_methods, &console_methods_description); \ |
872 | 389 } while (0) |
390 | |
391 #define REINITIALIZE_CONSOLE_TYPE(type) do { \ | |
392 staticpro_nodump (&type##_console_methods->predicate_symbol); \ | |
393 staticpro_nodump (&type##_console_methods->image_conversion_list); \ | |
394 } while (0) | |
395 | |
396 | |
397 /* Declare that console-type TYPE has method M; used in | |
398 initialization routines */ | |
399 #define CONSOLE_HAS_METHOD(type, m) \ | |
400 (type##_console_methods->m##_method = type##_##m) | |
401 | |
402 /* Declare that console-type TYPE inherits method M | |
403 implementation from console-type FROMTYPE */ | |
404 #define CONSOLE_INHERITS_METHOD(type, fromtype, m) \ | |
405 (type##_console_methods->m##_method = fromtype##_##m) | |
406 | |
407 /* Define console type implementation flags */ | |
408 #define CONSOLE_IMPLEMENTATION_FLAGS(type, flg) \ | |
409 (type##_console_methods->flags = flg) | |
410 | |
411 struct console | |
412 { | |
3017 | 413 struct LCRECORD_HEADER header; |
872 | 414 |
415 /* Description of this console's methods. */ | |
416 struct console_methods *conmeths; | |
417 | |
1204 | 418 /* Enumerated constant listing which type of console this is (TTY, X, |
419 MS-Windows, etc.). This duplicates the symbol in conmeths->symbol, | |
420 which formerly was the only way to determine the console type. | |
421 We need this constant now for KKCC, so that it can be used in | |
422 an XD_UNION clause to determine the Lisp objects in console_data. */ | |
934 | 423 enum console_variant contype; |
424 | |
872 | 425 /* A structure of auxiliary data specific to the console type. |
426 struct x_console is used for X window frames; defined in console-x.h | |
427 struct tty_console is used to TTY's; defined in console-tty.h */ | |
428 void *console_data; | |
429 | |
430 /* ----- begin partially-completed console localization of | |
431 event loop ---- */ | |
432 | |
433 int local_var_flags; | |
434 | |
1204 | 435 #define MARKED_SLOT(x) Lisp_Object x; |
872 | 436 #include "conslots.h" |
437 | |
438 /* Where to store the next keystroke of the macro. | |
439 Index into con->kbd_macro_builder. */ | |
440 int kbd_macro_ptr; | |
441 | |
442 /* The finalized section of the macro starts at kbd_macro_buffer and | |
443 ends before this. This is not the same as kbd_macro_pointer, because | |
444 we advance this to kbd_macro_pointer when a key's command is complete. | |
445 This way, the keystrokes for "end-kbd-macro" are not included in the | |
446 macro. */ | |
447 int kbd_macro_end; | |
448 | |
449 /* ----- end partially-completed console localization of event loop ---- */ | |
450 | |
451 unsigned int input_enabled :1; | |
452 }; | |
453 | |
454 /* Redefine basic properties more efficiently */ | |
455 | |
456 #undef CONSOLE_LIVE_P | |
457 #define CONSOLE_LIVE_P(con) (!EQ (CONSOLE_TYPE (con), Qdead)) | |
458 #undef CONSOLE_DEVICE_LIST | |
459 #define CONSOLE_DEVICE_LIST(con) ((con)->device_list) | |
460 | |
461 #define CONSOLE_TYPE_P(con, type) EQ (CONSOLE_TYPE (con), Q##type) | |
462 | |
463 #ifdef ERROR_CHECK_TYPES | |
464 DECLARE_INLINE_HEADER ( | |
465 struct console * | |
466 error_check_console_type (struct console *con, Lisp_Object sym) | |
467 ) | |
468 { | |
469 assert (EQ (CONSOLE_TYPE (con), sym)); | |
470 return con; | |
471 } | |
472 # define CONSOLE_TYPE_DATA(con, type) \ | |
473 (*(struct type##_console **) \ | |
474 &(error_check_console_type (con, Q##type))->console_data) | |
475 #else | |
476 # define CONSOLE_TYPE_DATA(con, type) \ | |
477 (*(struct type##_console **) &((con)->console_data)) | |
478 #endif | |
479 | |
480 #define CHECK_CONSOLE_TYPE(x, type) do { \ | |
481 CHECK_CONSOLE (x); \ | |
482 if (! CONSOLE_TYPE_P (XCONSOLE (x), type)) \ | |
483 dead_wrong_type_argument \ | |
484 (type##_console_methods->predicate_symbol, x); \ | |
485 } while (0) | |
486 #define CONCHECK_CONSOLE_TYPE(x, type) do { \ | |
487 CONCHECK_CONSOLE (x); \ | |
488 if (!(CONSOLEP (x) && \ | |
489 CONSOLE_TYPE_P (XCONSOLE (x), type))) \ | |
490 x = wrong_type_argument \ | |
491 (type##_console_methods->predicate_symbol, x); \ | |
492 } while (0) | |
493 | |
494 /* #### These should be in the console-*.h files but there are | |
495 too many places where the abstraction is broken. Need to | |
496 fix. */ | |
497 | |
498 #ifdef HAVE_GTK | |
499 #define CONSOLE_TYPESYM_GTK_P(typesym) EQ (typesym, Qgtk) | |
500 #else | |
501 #define CONSOLE_TYPESYM_GTK_P(typesym) 0 | |
502 #endif | |
503 | |
504 #ifdef HAVE_X_WINDOWS | |
505 #define CONSOLE_TYPESYM_X_P(typesym) EQ (typesym, Qx) | |
506 #else | |
507 #define CONSOLE_TYPESYM_X_P(typesym) 0 | |
508 #endif | |
509 #ifdef HAVE_TTY | |
510 #define CONSOLE_TYPESYM_TTY_P(typesym) EQ (typesym, Qtty) | |
511 #else | |
512 #define CONSOLE_TYPESYM_TTY_P(typesym) 0 | |
513 #endif | |
514 #ifdef HAVE_MS_WINDOWS | |
515 #define CONSOLE_TYPESYM_MSWINDOWS_P(typesym) EQ (typesym, Qmswindows) | |
516 #else | |
517 #define CONSOLE_TYPESYM_MSWINDOWS_P(typesym) 0 | |
518 #endif | |
519 #define CONSOLE_TYPESYM_STREAM_P(typesym) EQ (typesym, Qstream) | |
520 | |
521 #define CONSOLE_TYPESYM_WIN_P(typesym) \ | |
522 (CONSOLE_TYPESYM_GTK_P (typesym) || CONSOLE_TYPESYM_X_P (typesym) || CONSOLE_TYPESYM_MSWINDOWS_P (typesym)) | |
523 | |
524 #define CONSOLE_X_P(con) CONSOLE_TYPESYM_X_P (CONSOLE_TYPE (con)) | |
525 #define CHECK_X_CONSOLE(z) CHECK_CONSOLE_TYPE (z, x) | |
526 #define CONCHECK_X_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, x) | |
527 | |
528 #define CONSOLE_GTK_P(con) CONSOLE_TYPESYM_GTK_P (CONSOLE_TYPE (con)) | |
529 #define CHECK_GTK_CONSOLE(z) CHECK_CONSOLE_TYPE (z, gtk) | |
530 #define CONCHECK_GTK_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, gtk) | |
531 | |
532 #define CONSOLE_TTY_P(con) CONSOLE_TYPESYM_TTY_P (CONSOLE_TYPE (con)) | |
533 #define CHECK_TTY_CONSOLE(z) CHECK_CONSOLE_TYPE (z, tty) | |
534 #define CONCHECK_TTY_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, tty) | |
535 | |
536 #define CONSOLE_MSWINDOWS_P(con) CONSOLE_TYPESYM_MSWINDOWS_P (CONSOLE_TYPE (con)) | |
537 #define CHECK_MSWINDOWS_CONSOLE(z) CHECK_CONSOLE_TYPE (z, mswindows) | |
538 #define CONCHECK_MSWINDOWS_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, mswindows) | |
539 | |
540 #define CONSOLE_STREAM_P(con) CONSOLE_TYPESYM_STREAM_P (CONSOLE_TYPE (con)) | |
541 #define CHECK_STREAM_CONSOLE(z) CHECK_CONSOLE_TYPE (z, stream) | |
542 #define CONCHECK_STREAM_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, stream) | |
543 | |
544 #define CONSOLE_WIN_P(con) CONSOLE_TYPESYM_WIN_P (CONSOLE_TYPE (con)) | |
545 | |
546 /* This structure marks which slots in a console have corresponding | |
547 default values in console_defaults. | |
548 Each such slot has a nonzero value in this structure. | |
549 The value has only one nonzero bit. | |
550 | |
551 When a console has its own local value for a slot, | |
552 the bit for that slot (found in the same slot in this structure) | |
553 is turned on in the console's local_var_flags slot. | |
554 | |
555 If a slot in this structure is zero, then even though there may | |
556 be a DEFVAR_CONSOLE_LOCAL for the slot, there is no default value for it; | |
557 and the corresponding slot in console_defaults is not used. */ | |
558 | |
559 extern struct console console_local_flags; | |
560 | |
561 #define CONSOLE_NAME(con) ((con)->name) | |
562 #define CONSOLE_CONNECTION(con) ((con)->connection) | |
563 #define CONSOLE_CANON_CONNECTION(con) ((con)->canon_connection) | |
564 #define CONSOLE_FUNCTION_KEY_MAP(con) ((con)->function_key_map) | |
565 #define CONSOLE_SELECTED_DEVICE(con) ((con)->selected_device) | |
566 #define CONSOLE_SELECTED_FRAME(con) \ | |
567 DEVICE_SELECTED_FRAME (XDEVICE ((con)->selected_device)) | |
568 #define CONSOLE_LAST_NONMINIBUF_FRAME(con) NON_LVALUE ((con)->last_nonminibuf_frame) | |
569 #define CONSOLE_QUIT_CHAR(con) ((con)->quit_char) | |
1204 | 570 #define CONSOLE_QUIT_EVENT(con) ((con)->quit_event) |
571 #define CONSOLE_CRITICAL_QUIT_EVENT(con) ((con)->critical_quit_event) | |
872 | 572 |
573 DECLARE_CONSOLE_TYPE (dead); | |
574 | |
575 extern console_type_entry_dynarr *the_console_type_entry_dynarr; | |
576 | |
577 #endif /* INCLUDED_console_impl_h_ */ |