Mercurial > hg > xemacs-beta
annotate src/device-gtk.c @ 4539:061e030e3270
Fix some bugs in load-history construction, built-in symbol file names.
lib-src/ChangeLog addition:
2008-12-27 Aidan Kehoe <kehoea@parhasard.net>
* make-docfile.c (main): Allow more than one -d argument, followed
by a directory to change to.
(put_filename): Don't strip directory information; with previous
change, allows retrieval of Lisp function and variable origin
files from #'built-in-symbol-file relative to lisp-directory.
(scan_lisp_file): Don't add an extraneous newline after the file
name, put_filename has added the newline already.
lisp/ChangeLog addition:
2008-12-27 Aidan Kehoe <kehoea@parhasard.net>
* loadup.el (load-history):
Add the contents of current-load-list to load-history before
clearing it. Move the variable declarations earlier in the file to
a format understood by make-docfile.c.
* custom.el (custom-declare-variable): Add the variable's symbol
to the current file's load history entry correctly, don't use a
cons. Eliminate a comment that we don't need to worry about, we
don't need to check the `initialized' C variable in Lisp.
* bytecomp.el (byte-compile-output-file-form):
Merge Andreas Schwab's pre-GPLv3 GNU change of 19970831 here;
treat #'custom-declare-variable correctly, generating the
docstrings in a format understood by make-docfile.c.
* loadhist.el (symbol-file): Correct behaviour for checking
autoloaded macros and functions when supplied with a TYPE
argument. Accept fully-qualified paths from
#'built-in-symbol-file; if a path is not fully-qualified, return
it relative to lisp-directory if the filename corresponds to a
Lisp file, and relative to (concat source-directory "/src/")
otherwise.
* make-docfile.el (preloaded-file-list):
Rationalise some let bindings a little. Use the "-d" argument to
make-docfile.c to supply Lisp paths relative to lisp-directory,
not absolutely. Add in loadup.el explicitly to the list of files
to be processed by make-docfile.c--it doesn't make sense to add it
to preloaded-file-list, since that is used for purposes of
byte-compilation too.
src/ChangeLog addition:
2008-12-27 Aidan Kehoe <kehoea@parhasard.net>
* doc.c (Fbuilt_in_symbol_file):
Return a subr's filename immediately if we've found it. Check for
compiled function and compiled macro docstrings in DOC too, and
return them if they exist.
The branch of the if statement focused on functions may have
executed, but we may still want to check variable bindings; an
else clause isn't appropriate.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 27 Dec 2008 14:05:50 +0000 |
parents | e34711681f30 |
children | b3ce27ca7647 19a72041c5ed e0db3c197671 |
rev | line source |
---|---|
462 | 1 /* Device functions for X windows. |
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois. | |
3 Copyright (C) 1994, 1995 Free Software Foundation, Inc. | |
872 | 4 Copyright (C) 2002 Ben Wing. |
462 | 5 |
6 This file is part of XEmacs. | |
7 | |
8 XEmacs is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
10 Free Software Foundation; either version 2, or (at your option) any | |
11 later version. | |
12 | |
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with XEmacs; see the file COPYING. If not, write to | |
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
21 Boston, MA 02111-1307, USA. */ | |
22 | |
23 /* Synched up with: Not in FSF. */ | |
24 | |
25 /* Original authors: Jamie Zawinski and the FSF */ | |
26 /* Rewritten by Ben Wing and Chuck Thompson. */ | |
27 /* Gtk flavor written by William Perry */ | |
28 | |
29 #include <config.h> | |
30 #include "lisp.h" | |
31 | |
872 | 32 #include "buffer.h" |
33 #include "device-impl.h" | |
34 #include "elhash.h" | |
35 #include "events.h" | |
36 #include "faces.h" | |
37 #include "frame-impl.h" | |
38 #include "redisplay.h" | |
39 #include "sysdep.h" | |
40 #include "window.h" | |
41 | |
42 #include "console-gtk-impl.h" | |
462 | 43 #include "gccache-gtk.h" |
44 #include "glyphs-gtk.h" | |
45 #include "objects-gtk.h" | |
46 #include "gtk-xemacs.h" | |
47 | |
48 #include "sysfile.h" | |
49 #include "systime.h" | |
50 | |
51 #ifdef HAVE_GNOME | |
52 #include <libgnomeui/libgnomeui.h> | |
53 #endif | |
54 | |
55 #ifdef HAVE_BONOBO | |
56 #include <bonobo.h> | |
57 #endif | |
58 | |
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
59 Lisp_Object Qmake_device_early_gtk_entry_point, |
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
60 Qmake_device_late_gtk_entry_point; |
462 | 61 |
62 /* The application class of Emacs. */ | |
63 Lisp_Object Vgtk_emacs_application_class; | |
64 | |
65 Lisp_Object Vgtk_initial_argv_list; /* #### ugh! */ | |
66 Lisp_Object Vgtk_initial_geometry; | |
67 | |
2828 | 68 Lisp_Object Qgtk_seen_characters; |
69 | |
462 | 70 static void gtk_device_init_x_specific_cruft (struct device *d); |
71 | |
1204 | 72 static const struct memory_description gtk_device_data_description_1 [] = { |
73 { XD_LISP_OBJECT, offsetof (struct gtk_device, x_keysym_map_hashtable) }, | |
74 { XD_LISP_OBJECT, offsetof (struct gtk_device, WM_COMMAND_frame) }, | |
75 { XD_END } | |
76 }; | |
77 | |
3092 | 78 #ifdef NEW_GC |
79 DEFINE_LRECORD_IMPLEMENTATION ("gtk-device", gtk_device, | |
80 1, /*dumpable-flag*/ | |
81 0, 0, 0, 0, 0, | |
82 gtk_device_data_description_1, | |
83 Lisp_Gtk_Device); | |
84 #else /* not NEW_GC */ | |
1204 | 85 extern const struct sized_memory_description gtk_device_data_description; |
86 | |
87 const struct sized_memory_description gtk_device_data_description = { | |
88 sizeof (struct gtk_device), gtk_device_data_description_1 | |
89 }; | |
3092 | 90 #endif /* not NEW_GC */ |
1204 | 91 |
462 | 92 |
93 /************************************************************************/ | |
94 /* helper functions */ | |
95 /************************************************************************/ | |
96 | |
97 struct device * | |
98 decode_gtk_device (Lisp_Object device) | |
99 { | |
793 | 100 device = wrap_device (decode_device (device)); |
462 | 101 CHECK_GTK_DEVICE (device); |
102 return XDEVICE (device); | |
103 } | |
104 | |
105 | |
106 /************************************************************************/ | |
107 /* initializing a GTK connection */ | |
108 /************************************************************************/ | |
109 extern Lisp_Object | |
110 xemacs_gtk_convert_color(GdkColor *c, GtkWidget *w); | |
111 | |
112 extern Lisp_Object __get_gtk_font_truename (GdkFont *gdk_font, int expandp); | |
113 | |
114 #define convert_font(f) __get_gtk_font_truename (f, 0) | |
115 | |
116 static void | |
117 allocate_gtk_device_struct (struct device *d) | |
118 { | |
3092 | 119 #ifdef NEW_GC |
120 d->device_data = alloc_lrecord_type (struct gtk_device, &lrecord_gtk_device); | |
121 #else /* not NEW_GC */ | |
462 | 122 d->device_data = xnew_and_zero (struct gtk_device); |
3092 | 123 #endif /* not NEW_GC */ |
462 | 124 DEVICE_GTK_DATA (d)->x_keysym_map_hashtable = Qnil; |
125 } | |
126 | |
127 static void | |
128 gtk_init_device_class (struct device *d) | |
129 { | |
130 if (DEVICE_GTK_DEPTH(d) > 2) | |
131 { | |
132 switch (DEVICE_GTK_VISUAL(d)->type) | |
133 { | |
134 case GDK_VISUAL_STATIC_GRAY: | |
135 case GDK_VISUAL_GRAYSCALE: | |
136 DEVICE_CLASS (d) = Qgrayscale; | |
137 break; | |
138 default: | |
139 DEVICE_CLASS (d) = Qcolor; | |
140 } | |
141 } | |
142 else | |
143 DEVICE_CLASS (d) = Qmono; | |
144 } | |
145 | |
146 #ifdef HAVE_GDK_IMLIB_INIT | |
147 extern void gdk_imlib_init(void); | |
148 #endif | |
149 | |
863 | 150 extern void emacs_gtk_selection_handle (GtkWidget *, |
151 GtkSelectionData *selection_data, | |
152 guint info, | |
153 guint time_stamp, | |
154 gpointer data); | |
155 extern void emacs_gtk_selection_clear_event_handle (GtkWidget *widget, | |
156 GdkEventSelection *event, | |
157 gpointer data); | |
158 extern void emacs_gtk_selection_received (GtkWidget *widget, | |
159 GtkSelectionData *selection_data, | |
160 gpointer user_data); | |
161 | |
462 | 162 #ifdef HAVE_BONOBO |
163 static CORBA_ORB orb; | |
164 #endif | |
165 | |
166 DEFUN ("gtk-init", Fgtk_init, 1, 1, 0, /* | |
167 Initialize the GTK subsystem. | |
168 ARGS is a standard list of command-line arguments. | |
169 | |
170 No effect if called more than once. Called automatically when | |
171 creating the first GTK device. Must be called manually from batch | |
172 mode. | |
173 */ | |
174 (args)) | |
175 { | |
176 int argc; | |
177 char **argv; | |
178 static int done; | |
179 | |
180 if (done) | |
181 { | |
182 return (Qt); | |
183 } | |
184 | |
185 make_argc_argv (args, &argc, &argv); | |
186 | |
187 slow_down_interrupts (); | |
188 #ifdef HAVE_GNOME | |
189 #ifdef INFODOCK | |
190 gnome_init ("InfoDock", EMACS_VERSION, argc, argv); | |
191 #else | |
192 gnome_init ("XEmacs", EMACS_VERSION, argc, argv); | |
193 #endif /* INFODOCK */ | |
194 #else | |
195 gtk_init (&argc, &argv); | |
196 #endif | |
197 | |
198 #ifdef HAVE_BONOBO | |
199 orb = oaf_init (argc, argv); | |
200 | |
201 if (bonobo_init (orb, NULL, NULL) == FALSE) | |
202 { | |
203 g_warning ("Could not initialize bonobo..."); | |
204 } | |
205 | |
206 bonobo_activate (); | |
207 #endif | |
208 | |
209 speed_up_interrupts (); | |
210 | |
211 free_argc_argv (argv); | |
212 return (Qt); | |
213 } | |
214 | |
215 static void | |
2286 | 216 gtk_init_device (struct device *d, Lisp_Object UNUSED (props)) |
462 | 217 { |
218 Lisp_Object display; | |
219 GtkWidget *app_shell = NULL; | |
220 GdkVisual *visual = NULL; | |
221 GdkColormap *cmap = NULL; | |
222 | |
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
223 /* Run the early elisp side of the GTK device initialization. */ |
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
224 call0 (Qmake_device_early_gtk_entry_point); |
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
225 |
462 | 226 /* gtk_init() and even gtk_check_init() are so brain dead that |
227 getting an empty argv array causes them to abort. */ | |
228 if (NILP (Vgtk_initial_argv_list)) | |
229 { | |
563 | 230 invalid_operation ("gtk-initial-argv-list must be set before creating Gtk devices", Vgtk_initial_argv_list); |
462 | 231 return; |
232 } | |
233 | |
234 allocate_gtk_device_struct (d); | |
235 display = DEVICE_CONNECTION (d); | |
236 | |
237 /* Attempt to load a site-specific gtkrc */ | |
238 { | |
239 Lisp_Object gtkrc = Fexpand_file_name (build_string ("gtkrc"), Vdata_directory); | |
240 gchar **default_files = gtk_rc_get_default_files (); | |
241 gint num_files; | |
242 | |
243 if (STRINGP (gtkrc)) | |
244 { | |
245 /* Found one, load it up! */ | |
246 gchar **new_rc_files = NULL; | |
247 int ctr; | |
248 | |
249 for (num_files = 0; default_files[num_files]; num_files++); | |
250 | |
251 new_rc_files = xnew_array_and_zero (gchar *, num_files + 3); | |
252 | |
2054 | 253 LISP_STRING_TO_EXTERNAL (gtkrc, new_rc_files[0], Qfile_name); |
254 | |
462 | 255 for (ctr = 1; default_files[ctr-1]; ctr++) |
256 new_rc_files[ctr] = g_strdup (default_files[ctr-1]); | |
257 | |
258 gtk_rc_set_default_files (new_rc_files); | |
259 | |
260 for (ctr = 1; new_rc_files[ctr]; ctr++) | |
261 free(new_rc_files[ctr]); | |
262 | |
1726 | 263 xfree (new_rc_files, gchar **); |
462 | 264 } |
265 } | |
266 | |
267 Fgtk_init (Vgtk_initial_argv_list); | |
268 | |
269 #ifdef __FreeBSD__ | |
270 gdk_set_use_xshm (FALSE); | |
271 #endif | |
272 | |
273 #ifdef HAVE_GDK_IMLIB_INIT | |
274 /* Some themes in Gtk are so lame (most notably the Pixmap theme) | |
275 that they rely on gdk_imlib, but don't call its initialization | |
276 routines. This makes them USELESS for non-gnome applications. | |
277 So we bend over backwards to try and make them work. Losers. */ | |
278 gdk_imlib_init (); | |
279 #endif | |
280 | |
281 if (NILP (DEVICE_NAME (d))) | |
282 DEVICE_NAME (d) = display; | |
283 | |
284 /* Always search for the best visual */ | |
285 visual = gdk_visual_get_best(); | |
286 cmap = gdk_colormap_new (visual, TRUE); | |
287 | |
288 DEVICE_GTK_VISUAL (d) = visual; | |
289 DEVICE_GTK_COLORMAP (d) = cmap; | |
290 DEVICE_GTK_DEPTH (d) = visual->depth; | |
291 | |
292 { | |
293 GtkWidget *w = gtk_window_new (GTK_WINDOW_TOPLEVEL); | |
294 | |
295 app_shell = gtk_xemacs_new (NULL); | |
296 gtk_container_add (GTK_CONTAINER (w), app_shell); | |
297 | |
298 gtk_widget_realize (w); | |
299 } | |
300 | |
301 DEVICE_GTK_APP_SHELL (d) = app_shell; | |
302 | |
303 /* Realize the app_shell so that its window exists for GC creation | |
304 purposes */ | |
305 gtk_widget_realize (GTK_WIDGET (app_shell)); | |
306 | |
307 /* Need to set up some selection handlers */ | |
308 gtk_selection_add_target (GTK_WIDGET (app_shell), GDK_SELECTION_PRIMARY, | |
309 GDK_SELECTION_TYPE_STRING, 0); | |
746 | 310 gtk_selection_add_target (GTK_WIDGET (app_shell), |
311 gdk_atom_intern("CLIPBOARD", FALSE), | |
312 GDK_SELECTION_TYPE_STRING, 0); | |
462 | 313 |
314 gtk_signal_connect (GTK_OBJECT (app_shell), "selection_get", | |
315 GTK_SIGNAL_FUNC (emacs_gtk_selection_handle), NULL); | |
746 | 316 gtk_signal_connect (GTK_OBJECT (app_shell), "selection_clear_event", |
317 GTK_SIGNAL_FUNC (emacs_gtk_selection_clear_event_handle), | |
318 NULL); | |
462 | 319 gtk_signal_connect (GTK_OBJECT (app_shell), "selection_received", |
320 GTK_SIGNAL_FUNC (emacs_gtk_selection_received), NULL); | |
321 | |
322 DEVICE_GTK_WM_COMMAND_FRAME (d) = Qnil; | |
323 | |
324 gtk_init_modifier_mapping (d); | |
325 | |
326 gtk_device_init_x_specific_cruft (d); | |
327 | |
328 init_baud_rate (d); | |
329 init_one_device (d); | |
330 | |
331 DEVICE_GTK_GC_CACHE (d) = make_gc_cache (GTK_WIDGET (app_shell)); | |
332 DEVICE_GTK_GRAY_PIXMAP (d) = NULL; | |
333 | |
334 gtk_init_device_class (d); | |
335 } | |
336 | |
337 static void | |
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
338 gtk_finish_init_device (struct device *d, Lisp_Object UNUSED (props)) |
462 | 339 { |
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
340 call1 (Qmake_device_late_gtk_entry_point, wrap_device(d)); |
462 | 341 } |
342 | |
343 static void | |
344 gtk_mark_device (struct device *d) | |
345 { | |
346 mark_object (DEVICE_GTK_WM_COMMAND_FRAME (d)); | |
347 mark_object (DEVICE_GTK_DATA (d)->x_keysym_map_hashtable); | |
348 } | |
349 | |
350 | |
351 /************************************************************************/ | |
352 /* closing an X connection */ | |
353 /************************************************************************/ | |
354 | |
4117 | 355 #ifndef NEW_GC |
462 | 356 static void |
357 free_gtk_device_struct (struct device *d) | |
358 { | |
1726 | 359 xfree (d->device_data, void *); |
4117 | 360 } |
3092 | 361 #endif /* not NEW_GC */ |
462 | 362 |
363 static void | |
364 gtk_delete_device (struct device *d) | |
365 { | |
366 #ifdef FREE_CHECKING | |
367 extern void (*__free_hook)(); | |
368 int checking_free; | |
369 #endif | |
370 | |
371 if (1) | |
372 { | |
373 #ifdef FREE_CHECKING | |
374 checking_free = (__free_hook != 0); | |
375 | |
376 /* Disable strict free checking, to avoid bug in X library */ | |
377 if (checking_free) | |
378 disable_strict_free_check (); | |
379 #endif | |
380 | |
381 free_gc_cache (DEVICE_GTK_GC_CACHE (d)); | |
382 | |
383 #ifdef FREE_CHECKING | |
384 if (checking_free) | |
385 enable_strict_free_check (); | |
386 #endif | |
387 } | |
388 | |
389 free_gtk_device_struct (d); | |
390 } | |
391 | |
392 | |
393 /************************************************************************/ | |
394 /* handle X errors */ | |
395 /************************************************************************/ | |
396 | |
397 const char * | |
398 gtk_event_name (GdkEventType event_type) | |
399 { | |
400 GtkEnumValue *vals = gtk_type_enum_get_values (GTK_TYPE_GDK_EVENT_TYPE); | |
401 | |
778 | 402 while (vals && ((GdkEventType)(vals->value) != event_type)) vals++; |
462 | 403 |
404 if (vals) | |
405 return (vals->value_nick); | |
406 | |
407 return (NULL); | |
408 } | |
409 | |
410 | |
411 /************************************************************************/ | |
412 /* display information functions */ | |
413 /************************************************************************/ | |
414 | |
415 DEFUN ("gtk-display-visual-class", Fgtk_display_visual_class, 0, 1, 0, /* | |
416 Return the visual class of the GTK display DEVICE is using. | |
417 The returned value will be one of the symbols `static-gray', `gray-scale', | |
418 `static-color', `pseudo-color', `true-color', or `direct-color'. | |
419 */ | |
420 (device)) | |
421 { | |
422 GdkVisual *vis = DEVICE_GTK_VISUAL (decode_gtk_device (device)); | |
423 switch (vis->type) | |
424 { | |
425 case GDK_VISUAL_STATIC_GRAY: return intern ("static-gray"); | |
426 case GDK_VISUAL_GRAYSCALE: return intern ("gray-scale"); | |
427 case GDK_VISUAL_STATIC_COLOR: return intern ("static-color"); | |
428 case GDK_VISUAL_PSEUDO_COLOR: return intern ("pseudo-color"); | |
429 case GDK_VISUAL_TRUE_COLOR: return intern ("true-color"); | |
430 case GDK_VISUAL_DIRECT_COLOR: return intern ("direct-color"); | |
431 default: | |
563 | 432 invalid_state ("display has an unknown visual class", Qunbound); |
462 | 433 return Qnil; /* suppress compiler warning */ |
434 } | |
435 } | |
436 | |
437 DEFUN ("gtk-display-visual-depth", Fgtk_display_visual_depth, 0, 1, 0, /* | |
438 Return the bitplane depth of the visual the GTK display DEVICE is using. | |
439 */ | |
440 (device)) | |
441 { | |
442 return make_int (DEVICE_GTK_DEPTH (decode_gtk_device (device))); | |
443 } | |
444 | |
445 static Lisp_Object | |
446 gtk_device_system_metrics (struct device *d, | |
447 enum device_metrics m) | |
448 { | |
449 #if 0 | |
450 GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (DEVICE_GTK_APP_SHELL (d))); | |
451 | |
452 style = gtk_style_attach (style, w); | |
453 #endif | |
454 | |
455 switch (m) | |
456 { | |
457 case DM_size_device: | |
458 return Fcons (make_int (gdk_screen_width ()), | |
459 make_int (gdk_screen_height ())); | |
460 case DM_size_device_mm: | |
461 return Fcons (make_int (gdk_screen_width_mm ()), | |
462 make_int (gdk_screen_height_mm ())); | |
463 case DM_num_color_cells: | |
464 return make_int (gdk_colormap_get_system_size ()); | |
465 case DM_num_bit_planes: | |
466 return make_int (DEVICE_GTK_DEPTH (d)); | |
467 | |
468 #if 0 | |
469 case DM_color_default: | |
470 case DM_color_select: | |
471 case DM_color_balloon: | |
472 case DM_color_3d_face: | |
473 case DM_color_3d_light: | |
474 case DM_color_3d_dark: | |
475 case DM_color_menu: | |
476 case DM_color_menu_highlight: | |
477 case DM_color_menu_button: | |
478 case DM_color_menu_disabled: | |
479 case DM_color_toolbar: | |
480 case DM_color_scrollbar: | |
481 case DM_color_desktop: | |
482 case DM_color_workspace: | |
483 case DM_font_default: | |
484 case DM_font_menubar: | |
485 case DM_font_dialog: | |
486 case DM_size_cursor: | |
487 case DM_size_scrollbar: | |
488 case DM_size_menu: | |
489 case DM_size_toolbar: | |
490 case DM_size_toolbar_button: | |
491 case DM_size_toolbar_border: | |
492 case DM_size_icon: | |
493 case DM_size_icon_small: | |
494 case DM_size_workspace: | |
495 case DM_device_dpi: | |
496 case DM_mouse_buttons: | |
497 case DM_swap_buttons: | |
498 case DM_show_sounds: | |
499 case DM_slow_device: | |
500 case DM_security: | |
501 #endif | |
502 default: /* No such device metric property for GTK devices */ | |
503 return Qunbound; | |
504 } | |
505 } | |
506 | |
507 DEFUN ("gtk-keysym-on-keyboard-p", Fgtk_keysym_on_keyboard_p, 1, 2, 0, /* | |
508 Return true if KEYSYM names a key on the keyboard of DEVICE. | |
509 More precisely, return true if some keystroke (possibly including modifiers) | |
510 on the keyboard of DEVICE keys generates KEYSYM. | |
511 Valid keysyms are listed in the files /usr/include/X11/keysymdef.h and in | |
512 /usr/lib/X11/XKeysymDB, or whatever the equivalents are on your system. | |
513 The keysym name can be provided in two forms: | |
514 - if keysym is a string, it must be the name as known to X windows. | |
515 - if keysym is a symbol, it must be the name as known to XEmacs. | |
516 The two names differ in capitalization and underscoring. | |
517 */ | |
518 (keysym, device)) | |
519 { | |
520 struct device *d = decode_device (device); | |
521 | |
522 if (!DEVICE_GTK_P (d)) | |
563 | 523 gui_error ("Not a GTK device", device); |
462 | 524 |
525 return (NILP (Fgethash (keysym, DEVICE_GTK_DATA (d)->x_keysym_map_hashtable, Qnil)) ? | |
526 Qnil : Qt); | |
527 } | |
528 | |
529 | |
530 /************************************************************************/ | |
531 /* grabs and ungrabs */ | |
532 /************************************************************************/ | |
533 | |
534 DEFUN ("gtk-grab-pointer", Fgtk_grab_pointer, 0, 3, 0, /* | |
535 Grab the pointer and restrict it to its current window. | |
536 If optional DEVICE argument is nil, the default device will be used. | |
537 If optional CURSOR argument is non-nil, change the pointer shape to that | |
538 until `gtk-ungrab-pointer' is called (it should be an object returned by the | |
539 `make-cursor-glyph' function). | |
540 If the second optional argument IGNORE-KEYBOARD is non-nil, ignore all | |
541 keyboard events during the grab. | |
542 Returns t if the grab is successful, nil otherwise. | |
543 */ | |
2286 | 544 (device, cursor, UNUSED (ignore_keyboard))) |
462 | 545 { |
546 GdkWindow *w; | |
547 int result; | |
548 struct device *d = decode_gtk_device (device); | |
549 | |
550 if (!NILP (cursor)) | |
551 { | |
552 CHECK_POINTER_GLYPH (cursor); | |
553 cursor = glyph_image_instance (cursor, device, ERROR_ME, 0); | |
554 } | |
555 | |
556 /* We should call gdk_pointer_grab() and (possibly) gdk_keyboard_grab() here instead */ | |
557 w = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (device_selected_frame (d))); | |
558 | |
559 result = gdk_pointer_grab (w, FALSE, | |
2054 | 560 (GdkEventMask) (GDK_POINTER_MOTION_MASK | |
561 GDK_POINTER_MOTION_HINT_MASK | | |
562 GDK_BUTTON1_MOTION_MASK | | |
563 GDK_BUTTON2_MOTION_MASK | | |
564 GDK_BUTTON3_MOTION_MASK | | |
565 GDK_BUTTON_PRESS_MASK | | |
566 GDK_BUTTON_RELEASE_MASK), | |
462 | 567 w, |
568 NULL, /* #### BILL!!! Need to create a GdkCursor * as necessary! */ | |
569 GDK_CURRENT_TIME); | |
570 | |
571 return (result == 0) ? Qt : Qnil; | |
572 } | |
573 | |
574 DEFUN ("gtk-ungrab-pointer", Fgtk_ungrab_pointer, 0, 1, 0, /* | |
575 Release a pointer grab made with `gtk-grab-pointer'. | |
576 If optional first arg DEVICE is nil the default device is used. | |
577 If it is t the pointer will be released on all GTK devices. | |
578 */ | |
579 (device)) | |
580 { | |
581 if (!EQ (device, Qt)) | |
582 { | |
583 gdk_pointer_ungrab (GDK_CURRENT_TIME); | |
584 } | |
585 else | |
586 { | |
587 Lisp_Object devcons, concons; | |
588 | |
589 DEVICE_LOOP_NO_BREAK (devcons, concons) | |
590 { | |
591 struct device *d = XDEVICE (XCAR (devcons)); | |
592 | |
593 if (DEVICE_GTK_P (d)) | |
594 gdk_pointer_ungrab (GDK_CURRENT_TIME); | |
595 } | |
596 } | |
597 return Qnil; | |
598 } | |
599 | |
600 DEFUN ("gtk-grab-keyboard", Fgtk_grab_keyboard, 0, 1, 0, /* | |
601 Grab the keyboard on the given device (defaulting to the selected one). | |
602 So long as the keyboard is grabbed, all keyboard events will be delivered | |
603 to emacs -- it is not possible for other clients to eavesdrop on them. | |
604 Ungrab the keyboard with `gtk-ungrab-keyboard' (use an unwind-protect). | |
605 Returns t if the grab is successful, nil otherwise. | |
606 */ | |
607 (device)) | |
608 { | |
609 struct device *d = decode_gtk_device (device); | |
610 GdkWindow *w = GET_GTK_WIDGET_WINDOW (FRAME_GTK_TEXT_WIDGET (device_selected_frame (d))); | |
611 | |
612 gdk_keyboard_grab (w, FALSE, GDK_CURRENT_TIME ); | |
613 | |
614 return Qt; | |
615 } | |
616 | |
617 DEFUN ("gtk-ungrab-keyboard", Fgtk_ungrab_keyboard, 0, 1, 0, /* | |
618 Release a keyboard grab made with `gtk-grab-keyboard'. | |
619 */ | |
2286 | 620 (UNUSED (device))) |
462 | 621 { |
622 gdk_keyboard_ungrab (GDK_CURRENT_TIME); | |
623 return Qnil; | |
624 } | |
625 | |
626 | |
627 /************************************************************************/ | |
628 /* Style Info */ | |
629 /************************************************************************/ | |
630 DEFUN ("gtk-style-info", Fgtk_style_info, 0, 1, 0, /* | |
631 Get the style information for a Gtk device. | |
632 */ | |
633 (device)) | |
634 { | |
635 struct device *d = decode_device (device); | |
636 GtkStyle *style = NULL; | |
637 Lisp_Object result = Qnil; | |
638 GtkWidget *app_shell = GTK_WIDGET (DEVICE_GTK_APP_SHELL (d)); | |
639 GdkWindow *w = GET_GTK_WIDGET_WINDOW (app_shell); | |
640 | |
641 if (!DEVICE_GTK_P (d)) | |
642 return (Qnil); | |
643 | |
644 style = gtk_widget_get_style (app_shell); | |
645 style = gtk_style_attach (style, w); | |
646 | |
647 if (!style) return (Qnil); | |
648 | |
649 #define FROB_COLOR(slot, name) \ | |
650 result = nconc2 (result, \ | |
651 list2 (intern (name), \ | |
652 list5 (xemacs_gtk_convert_color (&style->slot[GTK_STATE_NORMAL], app_shell),\ | |
653 xemacs_gtk_convert_color (&style->slot[GTK_STATE_ACTIVE], app_shell),\ | |
654 xemacs_gtk_convert_color (&style->slot[GTK_STATE_PRELIGHT], app_shell),\ | |
655 xemacs_gtk_convert_color (&style->slot[GTK_STATE_SELECTED], app_shell),\ | |
656 xemacs_gtk_convert_color (&style->slot[GTK_STATE_INSENSITIVE], app_shell)))) | |
657 | |
658 FROB_COLOR (fg, "foreground"); | |
659 FROB_COLOR (bg, "background"); | |
660 FROB_COLOR (light, "light"); | |
661 FROB_COLOR (dark, "dark"); | |
662 FROB_COLOR (mid, "mid"); | |
663 FROB_COLOR (text, "text"); | |
664 FROB_COLOR (base, "base"); | |
665 #undef FROB_COLOR | |
666 | |
667 result = nconc2 (result, list2 (Qfont, convert_font (style->font))); | |
668 | |
669 #define FROB_PIXMAP(state) (style->rc_style->bg_pixmap_name[state] ? build_string (style->rc_style->bg_pixmap_name[state]) : Qnil) | |
670 | |
671 if (style->rc_style) | |
672 result = nconc2 (result, list2 (Qbackground, | |
673 list5 ( FROB_PIXMAP (GTK_STATE_NORMAL), | |
674 FROB_PIXMAP (GTK_STATE_ACTIVE), | |
675 FROB_PIXMAP (GTK_STATE_PRELIGHT), | |
676 FROB_PIXMAP (GTK_STATE_SELECTED), | |
677 FROB_PIXMAP (GTK_STATE_INSENSITIVE)))); | |
678 #undef FROB_PIXMAP | |
679 | |
680 return (result); | |
681 } | |
682 | |
683 | |
684 /************************************************************************/ | |
685 /* initialization */ | |
686 /************************************************************************/ | |
687 | |
688 void | |
689 syms_of_device_gtk (void) | |
690 { | |
3092 | 691 #ifdef NEW_GC |
692 INIT_LRECORD_IMPLEMENTATION (gtk_device); | |
693 #endif /* NEW_GC */ | |
694 | |
462 | 695 DEFSUBR (Fgtk_keysym_on_keyboard_p); |
696 DEFSUBR (Fgtk_display_visual_class); | |
697 DEFSUBR (Fgtk_display_visual_depth); | |
698 DEFSUBR (Fgtk_style_info); | |
699 DEFSUBR (Fgtk_grab_pointer); | |
700 DEFSUBR (Fgtk_ungrab_pointer); | |
701 DEFSUBR (Fgtk_grab_keyboard); | |
702 DEFSUBR (Fgtk_ungrab_keyboard); | |
703 DEFSUBR (Fgtk_init); | |
704 | |
4477
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
705 DEFSYMBOL (Qmake_device_early_gtk_entry_point); |
e34711681f30
Don't determine whether to call general device-type code at startup,
Aidan Kehoe <kehoea@parhasard.net>
parents:
4117
diff
changeset
|
706 DEFSYMBOL (Qmake_device_late_gtk_entry_point); |
462 | 707 } |
708 | |
709 void | |
710 console_type_create_device_gtk (void) | |
711 { | |
712 CONSOLE_HAS_METHOD (gtk, init_device); | |
713 CONSOLE_HAS_METHOD (gtk, finish_init_device); | |
714 CONSOLE_HAS_METHOD (gtk, mark_device); | |
715 CONSOLE_HAS_METHOD (gtk, delete_device); | |
716 CONSOLE_HAS_METHOD (gtk, device_system_metrics); | |
545 | 717 /* CONSOLE_IMPLEMENTATION_FLAGS (gtk, XDEVIMPF_PIXEL_GEOMETRY); */ |
718 /* I inserted the above commented out statement, as the original | |
719 implementation of gtk_device_implementation_flags(), which I | |
720 deleted, contained commented out XDEVIMPF_PIXEL_GEOMETRY - kkm*/ | |
462 | 721 } |
722 | |
723 void | |
724 vars_of_device_gtk (void) | |
725 { | |
726 Fprovide (Qgtk); | |
727 | |
728 DEFVAR_LISP ("gtk-initial-argv-list", &Vgtk_initial_argv_list /* | |
729 You don't want to know. | |
730 This is used during startup to communicate the remaining arguments in | |
731 `command-line-args-left' to the C code, which passes the args to | |
732 the GTK initialization code, which removes some args, and then the | |
733 args are placed back into `gtk-initial-arg-list' and thence into | |
734 `command-line-args-left'. Perhaps `command-line-args-left' should | |
735 just reside in C. | |
736 */ ); | |
737 | |
738 DEFVAR_LISP ("gtk-initial-geometry", &Vgtk_initial_geometry /* | |
739 You don't want to know. | |
740 This is used during startup to communicate the default geometry to GTK. | |
741 */ ); | |
742 | |
743 Vgtk_initial_geometry = Qnil; | |
744 Vgtk_initial_argv_list = Qnil; | |
2828 | 745 |
746 Qgtk_seen_characters = Qnil; | |
462 | 747 } |
748 | |
749 #include <gdk/gdkx.h> | |
750 static void | |
751 gtk_device_init_x_specific_cruft (struct device *d) | |
752 { | |
753 DEVICE_INFD (d) = DEVICE_OUTFD (d) = ConnectionNumber (GDK_DISPLAY ()); | |
754 } |