annotate src/event-gtk.c @ 788:026c5bf9c134

[xemacs-hg @ 2002-03-21 07:29:57 by ben] chartab.c: Fix bugs in implementation and doc strings. config.h.in: Add foo_checking_assert_at_line() macros. Not clear whether these are actually useful, though; I'll take them out if not. symsinit.h, emacs.c: Some improvements to the timeline. Rearrange a bit the init calls. Add call for reinit_vars_of_object_mswindows() and declare in symsinit.h. event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, events.c, events.h: Introduce new event methods for printing, comparing, and hashing magic events, to avoid event-type-specific stuff that had crept into events.c. (And was crashing, since the channel in MS Windows magic events may be nil.) Implement the methods in event-{tty,gtk,Xt,mswindows}.c. Make wrapping functions event_stream_{compare,hash,format}_magic_event() to check if everything's OK and call the actual callback. Fix events.c to use the new methods. Add a new event-stream-operation EVENT_STREAM_NOTHING -- event stream not actually required to be able to do anything, just be open. (#### This event-stream-operation stuff needs to be rethought.) Fixed describe_event() in event-Xt.c to print its output to a stream, not always to stderr, so it can be used elsewhere. (e.g. in print-event when a magic event is encountered?) lisp.h, lrecord.h: Define new assert_at_line(), for use in asserts inside of inline functions. The assert will report the line and file of the inline function, which is almost certainly not what you want as it's useless. what you want to see is where the pseudo-macro was called from. So, when error-checking is on, we pass in the line and file into the macros, for accurate printout using assert_at_line(). Happens only when error-checking is defined so doesn't slow down non-error-checking builds. Fix XCHAR, XINT, XCHAR_OR_INT, XFOO, and wrap_foo() in this fashion. lstream.c, lstream.h: Add resizing_buffer_to_lisp_string(). objects-gtk.c: Fix typo. objects-msw.c: Implement a smarter way of determining whether a font matches a charset. Formerly we just looked at the "script" element of the font spec, converted it to a code page, and compared it with the code page derived from the charset. Now, as well as doing this, we ask the font for the list of unicode ranges it supports, see what range the charset falls into (#### bogus! need to do this char-by-char), and see if any of the font's supported ranges include the charset's range. also do some caching in Vfont_signature_data of previous inquiries. charset.h, text.c, mule-charset.c: New fun; extracted out of Fmake_char() and declare prototype in charset.h. text.h: introduce assert_by_line() to make REP_BYTES_BY_FIRST_BYTE report the file and line more accurately in an assertion failure. unicode.c: make non-static (used in objects-msw.c), declare in charset.h. mule\mule-category.el: Start implementing a category API compatible with FSF. Not there yet. We need improvements to char-tables. mule\mule-charset.el: Copy translation table code from FSF 21.1 and fix up. Eventually we'll have them in XEmacs. (used in ccl) Not here quite yet, and we need some improvements to char-tables. mule\cyril-util.el, mule\cyrillic.el, mule\devan-util.el, mule\ethio-util.el, mule\korea-util.el, mule\mule-tty-init.el, mule\tibet-util.el, mule\viet-util.el, mule\vietnamese.el: Fix numerous compilation warnings. Fix up code related to translation tables and other types of char-tables. menubar-items.el: Move the frame commands from the View menu to the File menu, to be consistent with how most other programs do things. Move less-used revert/recover items to a submenu. Make "recover" not prompt for a file, but recover the current buffer. TODO.ben-mule-21-5: Create bug list for latest problems.
author ben
date Thu, 21 Mar 2002 07:31:30 +0000
parents 2923009caf47
children 06b73d289047
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1 /* The event_stream interface for X11 with gtk, and/or tty frames.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2 Copyright (C) 1991-5, 1997 Free Software Foundation, Inc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
3 Copyright (C) 1995 Sun Microsystems, Inc.
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
4 Copyright (C) 1996, 2001, 2002 Ben Wing.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
5 Copyright (C) 2000 William Perry.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
6
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
7 This file is part of XEmacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
8
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
9 XEmacs is free software; you can redistribute it and/or modify it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
10 under the terms of the GNU General Public License as published by the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
11 Free Software Foundation; either version 2, or (at your option) any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
12 later version.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
13
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
17 for more details.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
18
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
20 along with XEmacs; see the file COPYING. If not, write to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
22 Boston, MA 02111-1307, USA. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
23
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
24 /* This file is heavily based upon event-Xt.c */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
25
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
26 /* Synched up with: Not in FSF. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
27
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
28 #include <config.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
29 #include "lisp.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
30
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
31 #include "console-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
32
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
33 #include "blocktype.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
34 #include "buffer.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
35 #include "commands.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
36 #include "console.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
37 #include "console-tty.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
38 #include "events.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
39 #include "frame.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
40 #include "objects-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
41 #include "process.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
42 #include "redisplay.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
43 #include "elhash.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
44
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
45 #include "gtk-xemacs.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
46
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
47 #include "systime.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
48 #include "sysproc.h" /* for MAXDESC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
49
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
50 #include "lstream.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
51 #include "file-coding.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
52
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
53 #include <gdk/gdkkeysyms.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
54
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
55 #ifdef HAVE_DRAGNDROP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
56 #include "dragdrop.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
57 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
58
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
59 #if defined (HAVE_OFFIX_DND)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
60 #include "offix.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
61 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
62
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 771
diff changeset
63 #include <gdk/gdkx.h>
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
64
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 771
diff changeset
65 #include "event-gtk.h"
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
66
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
67 static struct event_stream *gtk_event_stream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
68
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
69 /* Do we accept events sent by other clients? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
70 int gtk_allow_sendevents;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
71
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
72 static int process_events_occurred;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
73 static int tty_events_occurred;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
74
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
75 /* Mask of bits indicating the descriptors that we wait for input on */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
76 extern SELECT_TYPE input_wait_mask, process_only_mask, tty_only_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
77
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
78 static Lisp_Object gtk_keysym_to_emacs_keysym ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
79 void debug_process_finalization (struct Lisp_Process *p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
80 gboolean emacs_gtk_event_handler (GtkWidget *wid /* unused */,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
81 GdkEvent *event,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
82 gpointer closure /* unused */);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
83
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
84 static int last_quit_check_signal_tick_count;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
85
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
86 Lisp_Object Qkey_mapping;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
87 Lisp_Object Qsans_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
88
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
89 static void enqueue_gtk_dispatch_event (Lisp_Object event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
91 #define IS_MODIFIER_KEY(keysym) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
92 ((((keysym) >= GDK_Shift_L) && ((keysym) <= GDK_Hyper_R)) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
93 || ((keysym) == GDK_Mode_switch) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
94 || ((keysym) == GDK_Num_Lock))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
95
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
96
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
97
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
98 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
99 /* magic-event handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
100 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
101 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
102 handle_focus_event_1 (struct frame *f, int in_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 /* We don't want to handle the focus change now, because we might
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
105 be in an accept-process-output, sleep-for, or sit-for. So
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
106 we enqueue it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
107
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 Actually, we half handle it: we handle it as far as changing the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109 box cursor for redisplay, but we don't call any hooks or do any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110 select-frame stuff until after the sit-for.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113 if (in_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 GTK_WIDGET_SET_FLAGS (FRAME_GTK_TEXT_WIDGET (f), GTK_HAS_FOCUS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
118 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
119 GTK_WIDGET_UNSET_FLAGS (FRAME_GTK_TEXT_WIDGET (f), GTK_HAS_FOCUS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 gtk_widget_grab_focus (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122 gtk_widget_draw_focus (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125 Lisp_Object frm;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 Lisp_Object conser;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 struct gcpro gcpro1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 XSETFRAME (frm, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 conser = Fcons (frm, Fcons (FRAME_DEVICE (f), in_p ? Qt : Qnil));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 GCPRO1 (conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 emacs_handle_focus_change_preliminary (conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134 enqueue_magic_eval_event (emacs_handle_focus_change_final,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
140 /* both GDK_MAP and GDK_VISIBILITY_NOTIFY can cause this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 JV is_visible has the same semantics as f->visible*/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143 change_frame_visibility (struct frame *f, int is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149 if (!FRAME_VISIBLE_P (f) && is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 FRAME_VISIBLE_P (f) = is_visible;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 /* This improves the double flicker when uniconifying a frame
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 some. A lot of it is not showing a buffer which has changed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 while the frame was iconified. To fix it further requires
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 the good 'ol double redisplay structure. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157 va_run_hook_with_args (Qmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159 else if (FRAME_VISIBLE_P (f) && !is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 FRAME_VISIBLE_P (f) = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162 va_run_hook_with_args (Qunmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164 else if (FRAME_VISIBLE_P (f) * is_visible < 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166 FRAME_VISIBLE_P(f) = - FRAME_VISIBLE_P(f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167 if (FRAME_REPAINT_P (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
168 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169 va_run_hook_with_args (Qmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 handle_map_event (struct frame *f, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179 if (event->any.type == GDK_MAP)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 FRAME_GTK_TOTALLY_VISIBLE_P (f) = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 change_frame_visibility (f, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 FRAME_GTK_TOTALLY_VISIBLE_P (f) = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187 change_frame_visibility (f, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 /* Calling Fframe_iconified_p is the only way we have to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189 correctly update FRAME_ICONIFIED_P */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
190 Fframe_iconified_p (frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
193
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195 handle_client_message (struct frame *f, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
200
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
201 /* The event-Xt code used to handle WM_DELETE_WINDOW here, but we
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202 handle that directly in frame-gtk.c */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 if (event->client.message_type == gdk_atom_intern ("WM_PROTOCOLS", 0) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205 (GdkAtom) event->client.data.l[0] == gdk_atom_intern ("WM_TAKE_FOCUS", 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
207 handle_focus_event_1 (f, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
208 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
209 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 static void
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
212 emacs_gtk_format_magic_event (Lisp_Event *emacs_event, Lisp_Object pstream)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
213 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
214 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (event));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
215 if (CONSOLE_GTK_P (XCONSOLE (console)))
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
216 write_c_string (gtk_event_name (event->event.magic.underlying_gdk_event.
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
217 type));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
218 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
219
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
220 static int
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
221 emacs_gtk_compare_magic_event (Lisp_Event *e1, Lisp_Event *e2)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
222 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
223 if (CONSOLE_GTK_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e1)))) &&
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
224 CONSOLE_GTK_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e2)))))
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
225 return (!memcmp (&e1->event.magic.underlying_gdk_event,
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
226 &e2->event.magic.underlying_gdk_event,
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
227 sizeof (GdkEvent)));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
228 if (CONSOLE_GTK_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e1)))) ||
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
229 CONSOLE_GTK_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e2)))))
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
230 return 0;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
231 return 1;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
232 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
233
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
234 static Hashcode
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
235 emacs_gtk_hash_magic_event (Lisp_Event *e)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
236 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
237 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (e));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
238 if (CONSOLE_GTK_P (XCONSOLE (console)))
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
239 return memory_hash (&e->event.magic.underlying_gdk_event,
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
240 sizeof (GdkEvent));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
241 return 0;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
242 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
243
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
244 static void
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
245 emacs_gtk_handle_magic_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
246 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
247 /* This function can GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
248 GdkEvent *event = &emacs_event->event.magic.underlying_gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
249 struct frame *f = XFRAME (EVENT_CHANNEL (emacs_event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
250
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
251 if (!FRAME_LIVE_P (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
252 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
253
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
254 switch (event->any.type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
255 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
256 case GDK_CLIENT_EVENT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257 handle_client_message (f, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
260 case GDK_FOCUS_CHANGE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261 handle_focus_event_1 (f, event->focus_change.in);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 case GDK_MAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265 case GDK_UNMAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 handle_map_event (f, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 if (event->crossing.detail != GDK_NOTIFY_INFERIOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
273
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
274 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275 /* FRAME_X_MOUSE_P (f) = 1; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276 va_run_hook_with_args (Qmouse_enter_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280 case GDK_LEAVE_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281 if (event->crossing.detail != GDK_NOTIFY_INFERIOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
284
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
285 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 /* FRAME_X_MOUSE_P (f) = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287 va_run_hook_with_args (Qmouse_leave_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
290
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291 case GDK_VISIBILITY_NOTIFY: /* window visiblity has changed */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
292 if (event->visibility.window == GET_GTK_WIDGET_WINDOW (FRAME_GTK_SHELL_WIDGET (f)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
293 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
294 FRAME_GTK_TOTALLY_VISIBLE_P (f) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
295 (event->visibility.state == GDK_VISIBILITY_UNOBSCURED);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
296 /* Note that the fvwm pager only sends VisibilityNotify when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297 changing pages. Is this all we need to do ? JV */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298 /* Nope. We must at least trigger a redisplay here.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299 Since this case seems similar to MapNotify, I've
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300 factored out some code to change_frame_visibility().
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
301 This triggers the necessary redisplay and runs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
302 (un)map-frame-hook. - dkindred@cs.cmu.edu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
303 /* Changed it again to support the tristate visibility flag */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
304 change_frame_visibility (f, (event->visibility.state
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
305 != GDK_VISIBILITY_FULLY_OBSCURED) ? 1 : -1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
306 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
307 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
308
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
309 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
310 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 /* Gtk to Emacs event conversion */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 keysym_obeys_caps_lock_p (guint sym, struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
321 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322 /* Eeeeevil hack. Don't apply Caps_Lock to things that aren't alphabetic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
323 characters, where "alphabetic" means something more than simply A-Z.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 That is, if Caps_Lock is down, typing ESC doesn't produce Shift-ESC.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
325 But if shift-lock is down, then it does. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
326 if (gd->lock_interpretation == GDK_Shift_Lock)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
327 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
328
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
329 return
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
330 ((sym >= GDK_A) && (sym <= GDK_Z)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
331 ((sym >= GDK_a) && (sym <= GDK_z)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
332 ((sym >= GDK_Agrave) && (sym <= GDK_Odiaeresis)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
333 ((sym >= GDK_agrave) && (sym <= GDK_odiaeresis)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
334 ((sym >= GDK_Ooblique) && (sym <= GDK_Thorn)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
335 ((sym >= GDK_oslash) && (sym <= GDK_thorn));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
337
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
338 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
339 set_last_server_timestamp (struct device *d, GdkEvent *gdk_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 guint32 t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 switch (gdk_event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 case GDK_KEY_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
345 case GDK_KEY_RELEASE: t = gdk_event->key.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 case GDK_BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347 case GDK_2BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348 case GDK_3BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
349 case GDK_BUTTON_RELEASE: t = gdk_event->button.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
350 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351 case GDK_LEAVE_NOTIFY: t = gdk_event->crossing.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352 case GDK_MOTION_NOTIFY: t = gdk_event->motion.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 case GDK_PROPERTY_NOTIFY: t = gdk_event->property.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
354 case GDK_SELECTION_CLEAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355 case GDK_SELECTION_REQUEST:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
356 case GDK_SELECTION_NOTIFY: t = gdk_event->selection.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
357 default: return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
358 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
359 DEVICE_GTK_LAST_SERVER_TIMESTAMP (d) = t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
361
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
362 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363 gtk_keysym_to_emacs_keysym (guint keysym, int simple_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
364 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
365 char *name;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366 if (keysym >= GDK_exclam && keysym <= GDK_asciitilde)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 /* We must assume that the X keysym numbers for the ASCII graphic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368 characters are the same as their ASCII codes. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 return make_char (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371 switch (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
372 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 /* These would be handled correctly by the default case, but by
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
374 special-casing them here we don't garbage a string or call
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
375 intern(). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
376 case GDK_BackSpace: return QKbackspace;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377 case GDK_Tab: return QKtab;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378 case GDK_Linefeed: return QKlinefeed;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 case GDK_Return: return QKreturn;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
380 case GDK_Escape: return QKescape;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
381 case GDK_space: return QKspace;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 case GDK_Delete: return QKdelete;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 case 0: return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
385 if (simple_p) return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 /* !!#### not Mule-ized */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
387 name = gdk_keyval_name (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
388 if (!name || !name[0])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
389 /* This happens if there is a mismatch between the Xlib of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390 XEmacs and the Xlib of the X server...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392 Let's hard-code in some knowledge of common keysyms introduced
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 in recent X11 releases. Snarfed from X11/keysymdef.h
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
394
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
395 Probably we should add some stuff here for X11R6. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396 switch (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
397 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 case 0xFF95: return KEYSYM ("kp-home");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
399 case 0xFF96: return KEYSYM ("kp-left");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
400 case 0xFF97: return KEYSYM ("kp-up");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
401 case 0xFF98: return KEYSYM ("kp-right");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
402 case 0xFF99: return KEYSYM ("kp-down");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
403 case 0xFF9A: return KEYSYM ("kp-prior");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
404 case 0xFF9B: return KEYSYM ("kp-next");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
405 case 0xFF9C: return KEYSYM ("kp-end");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
406 case 0xFF9D: return KEYSYM ("kp-begin");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
407 case 0xFF9E: return KEYSYM ("kp-insert");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
408 case 0xFF9F: return KEYSYM ("kp-delete");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
409
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 case 0x1005FF10: return KEYSYM ("SunF36"); /* labeled F11 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411 case 0x1005FF11: return KEYSYM ("SunF37"); /* labeled F12 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414 char buf [64];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
415 sprintf (buf, "unknown-keysym-0x%X", (int) keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
416 return KEYSYM (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
417 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
418 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
419 /* If it's got a one-character name, that's good enough. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 if (!name[1])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
421 return make_char (name[0]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
422
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423 /* If it's in the "Keyboard" character set, downcase it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424 The case of those keysyms is too totally random for us to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425 force anyone to remember them.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
426 The case of the other character sets is significant, however.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
427 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
428 if ((((unsigned int) keysym) & (~0x1FF)) == ((unsigned int) 0xFE00))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
429 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430 char buf [255];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
431 char *s1, *s2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
432 for (s1 = name, s2 = buf; *s1; s1++, s2++) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
433 if (*s1 == '_') {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
434 *s2 = '-';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
435 } else {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
436 *s2 = tolower (* (unsigned char *) s1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
437 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
438 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
439 *s2 = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440 return KEYSYM (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
441 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
442 return KEYSYM (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
443 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
446 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
447 gtk_to_emacs_keysym (struct device *d, GdkEventKey *event, int simple_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 /* simple_p means don't try too hard (ASCII only) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
449 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
450 if (event->length != 1)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
451 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 /* Generate multiple emacs events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
453 Emchar ch;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
454 Lisp_Object instream, fb_instream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
455 Lstream *istr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
456 struct gcpro gcpro1, gcpro2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
457
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
458 fb_instream =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
459 make_fixed_buffer_input_stream ((unsigned char *) event->string, event->length);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
461 /* #### Use get_coding_system_for_text_file
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
462 (Vcomposed_input_coding_system, 0) */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
463 instream =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
464 make_coding_input_stream (XLSTREAM (fb_instream),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
465 Qundecided, CODING_DECODE);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
466
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
467 istr = XLSTREAM (instream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
468
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
469 GCPRO2 (instream, fb_instream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470 while ((ch = Lstream_get_emchar (istr)) != EOF)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
471 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
472 Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
473 struct Lisp_Event *ev = XEVENT (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
474 ev->channel = DEVICE_CONSOLE (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
475 ev->event_type = key_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
476 ev->timestamp = event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
477 ev->event.key.modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
478 ev->event.key.keysym = make_char (ch);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
479 enqueue_gtk_dispatch_event (emacs_event);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
480 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
481 Lstream_close (istr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
483 Lstream_delete (istr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
484 Lstream_delete (XLSTREAM (fb_instream));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485 if (IS_MODIFIER_KEY (event->keyval) || (event->keyval == GDK_Mode_switch))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
486 return (Qnil);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
487 return (gtk_keysym_to_emacs_keysym (event->keyval, simple_p));
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
488 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
489 else
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
490 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 if (IS_MODIFIER_KEY (event->keyval) || (event->keyval == GDK_Mode_switch))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
492 return (Qnil);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
493 return (gtk_keysym_to_emacs_keysym (event->keyval, simple_p));
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
494 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
496
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
497
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
498 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
499 /* timeout events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
500 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
502 static int timeout_id_tick;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
503
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
504 struct GTK_timeout {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 int id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
506 guint timeout_id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
507 struct GTK_timeout *next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
508 } *pending_timeouts, *completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
509
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
510 struct GTK_timeout_blocktype
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
511 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
512 Blocktype_declare (struct GTK_timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
513 } *the_GTK_timeout_blocktype;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
514
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
515 /* called by the gtk main loop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
516 static gint
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
517 gtk_timeout_callback (gpointer closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
518 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
519 struct GTK_timeout *timeout = (struct GTK_timeout *) closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
520 struct GTK_timeout *t2 = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
521
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
522 /* Remove this one from the list of pending timeouts */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
523 if (t2 == timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
524 pending_timeouts = pending_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
525 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
526 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
527 while (t2->next && t2->next != timeout) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
528 assert (t2->next);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
529 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
530 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
531 /* Add this one to the list of completed timeouts */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
532 timeout->next = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
533 completed_timeouts = timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
534 return(FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
535 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
536
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
537 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
538 emacs_gtk_add_timeout (EMACS_TIME thyme)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
539 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
540 struct GTK_timeout *timeout = Blocktype_alloc (the_GTK_timeout_blocktype);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
541 EMACS_TIME current_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
542 int milliseconds;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
543
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
544 timeout->id = timeout_id_tick++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
545 timeout->next = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
546 pending_timeouts = timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
547 EMACS_GET_TIME (current_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
548 EMACS_SUB_TIME (thyme, thyme, current_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
549 milliseconds = EMACS_SECS (thyme) * 1000 +
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
550 EMACS_USECS (thyme) / 1000;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
551 if (milliseconds < 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
552 milliseconds = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
553 timeout->timeout_id = gtk_timeout_add (milliseconds,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
554 gtk_timeout_callback,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
555 (gpointer) timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
556 return timeout->id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
557 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
558
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
559 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
560 emacs_gtk_remove_timeout (int id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
561 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
562 struct GTK_timeout *timeout, *t2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
563
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
564 timeout = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
565
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
566 /* Find the timeout on the list of pending ones, if it's still there. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
567 if (pending_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
568 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
569 if (id == pending_timeouts->id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
570 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
571 timeout = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
572 pending_timeouts = pending_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
573 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
574 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
575 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
576 t2 = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
577 while (t2->next && t2->next->id != id) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
578 if ( t2->next) /*found it */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
579 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
580 timeout = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
581 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
582 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
583 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
584 /* if it was pending, we have removed it from the list */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
585 if (timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
586 gtk_timeout_remove (timeout->timeout_id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
587 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
588
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
589 /* It could be that the call back was already called but we didn't convert
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
590 into an Emacs event yet */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
591 if (!timeout && completed_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
592 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
593 /* Code duplication! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
594 if (id == completed_timeouts->id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
595 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
596 timeout = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
597 completed_timeouts = completed_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
598 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
599 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
600 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
601 t2 = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
602 while (t2->next && t2->next->id != id) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
603 if ( t2->next) /*found it */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
604 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
605 timeout = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
606 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
607 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
608 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
609 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
610
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
611 /* If we found the thing on the lists of timeouts,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
612 and removed it, deallocate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
613 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
614 if (timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
615 Blocktype_free (the_GTK_timeout_blocktype, timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
616 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
617
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
618 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
619 gtk_timeout_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
620 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
621 struct GTK_timeout *timeout = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
622 assert (timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
623 completed_timeouts = completed_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
624 emacs_event->event_type = timeout_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
625 /* timeout events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
626 emacs_event->timestamp = 0; /* #### wrong!! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
627 emacs_event->event.timeout.interval_id = timeout->id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
628 Blocktype_free (the_GTK_timeout_blocktype, timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
629 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
630
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
631
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
632 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
633 /* process and tty events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
634 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
635
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
636 struct what_is_ready_closure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
637 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
638 int fd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
639 Lisp_Object what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
640 gint id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
641 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
642
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
643 static Lisp_Object *filedesc_with_input;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
644 static struct what_is_ready_closure **filedesc_to_what_closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
645
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
646 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
647 init_what_input_once (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
648 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
649 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
650
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
651 filedesc_with_input = xnew_array (Lisp_Object, MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
652 filedesc_to_what_closure =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
653 xnew_array (struct what_is_ready_closure *, MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
654
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
655 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
656 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
657 filedesc_to_what_closure[i] = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
658 filedesc_with_input[i] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
659 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
660
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
661 process_events_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
662 tty_events_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
663 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
664
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
665 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
666 mark_what_as_being_ready (struct what_is_ready_closure *closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
667 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
668 if (NILP (filedesc_with_input[closure->fd]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
669 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
670 SELECT_TYPE temp_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
671 FD_ZERO (&temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
672 FD_SET (closure->fd, &temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
673 /* Check to make sure there's *really* input available.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
674 Sometimes things seem to get confused and this gets called
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
675 for the tty fd when there's really only input available
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
676 on some process's fd. (It will subsequently get called
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
677 for that process's fd, so returning without setting any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
678 flags will take care of it.) To see the problem, uncomment
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
679 the stderr_out below, turn NORMAL_QUIT_CHECK_TIMEOUT_MSECS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
680 down to 25, do sh -c 'xemacs -nw -q -f shell 2>/tmp/log'
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
681 and press return repeatedly. (Seen under AIX & Linux.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
682 -dkindred@cs.cmu.edu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
683 if (!poll_fds_for_input (temp_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
684 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
685 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
686 stderr_out ("mark_what_as_being_ready: no input available (fd=%d)\n",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
687 closure->fd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
688 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
689 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
690 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
691 filedesc_with_input[closure->fd] = closure->what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
692 if (PROCESSP (closure->what))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
693 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
694 /* Don't increment this if the current process is already marked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
695 * as having input. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
696 process_events_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
697 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
698 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
699 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
700 tty_events_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
701 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
702 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
703 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
704
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
705 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
706 gtk_what_callback (gpointer closure, gint source, GdkInputCondition why)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
707 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
708 /* If closure is 0, then we got a fake event from a signal handler.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
709 The only purpose of this is to make XtAppProcessEvent() stop
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
710 blocking. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
711 if (closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
712 mark_what_as_being_ready ((struct what_is_ready_closure *) closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
713 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
714 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
715 fake_event_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
716 drain_signal_event_pipe ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
717 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
718 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
719
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
720 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
721 select_filedesc (int fd, Lisp_Object what)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
722 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
723 struct what_is_ready_closure *closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
724
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
725 /* If somebody is trying to select something that's already selected
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
726 for, then something went wrong. The generic routines ought to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
727 detect this and error before here. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
728 assert (!filedesc_to_what_closure[fd]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
729
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
730 closure = xnew (struct what_is_ready_closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
731 closure->fd = fd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
732 closure->what = what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
733 closure->id = gdk_input_add (fd, GDK_INPUT_READ,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
734 (GdkInputFunction) gtk_what_callback, closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
735 filedesc_to_what_closure[fd] = closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
736 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
737
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
738 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
739 unselect_filedesc (int fd)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
740 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
741 struct what_is_ready_closure *closure = filedesc_to_what_closure[fd];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
742
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
743 assert (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
744 if (!NILP (filedesc_with_input[fd]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
745 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
746 /* We are unselecting this process before we have drained the rest of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
747 the input from it, probably from status_notify() in the command loop.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
748 This can happen like so:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
749
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
750 - We are waiting in XtAppNextEvent()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
751 - Process generates output
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
752 - Process is marked as being ready
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
753 - Process dies, SIGCHLD gets generated before we return (!?)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
754 It could happen I guess.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
755 - sigchld_handler() marks process as dead
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
756 - Somehow we end up getting a new KeyPress event on the queue
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
757 at the same time (I'm really so sure how that happens but I'm
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
758 not sure it can't either so let's assume it can...).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
759 - Key events have priority so we return that instead of the proc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
760 - Before dispatching the lisp key event we call status_notify()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
761 - Which deselects the process that SIGCHLD marked as dead.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
762
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
763 Thus we never remove it from _with_input and turn it into a lisp
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
764 event, so we need to do it here. But this does not mean that we're
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
765 throwing away the last block of output - status_notify() has already
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
766 taken care of running the proc filter or whatever.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
767 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
768 filedesc_with_input[fd] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
769 if (PROCESSP (closure->what))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
770 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
771 assert (process_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
772 process_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
773 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
774 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
775 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
776 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
777 tty_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
778 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
779 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
780 gdk_input_remove (closure->id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
781 xfree (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
782 filedesc_to_what_closure[fd] = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
783 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
784
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
785 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
786 emacs_gtk_select_process (struct Lisp_Process *p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
787 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
788 Lisp_Object process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
789 int infd = event_stream_unixoid_select_process (p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
790
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
791 XSETPROCESS (process, p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
792 select_filedesc (infd, process);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
793 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
794
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
795 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
796 emacs_gtk_unselect_process (struct Lisp_Process *p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
797 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
798 int infd = event_stream_unixoid_unselect_process (p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
799
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
800 unselect_filedesc (infd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
801 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
802
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
803 static USID
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
804 emacs_gtk_create_stream_pair (void* inhandle, void* outhandle,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
805 Lisp_Object* instream, Lisp_Object* outstream, int flags)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
806 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
807 USID u = event_stream_unixoid_create_stream_pair
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
808 (inhandle, outhandle, instream, outstream, flags);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
809 if (u != USID_ERROR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
810 u = USID_DONTHASH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
811 return u;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
812 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
813
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
814 static USID
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
815 emacs_gtk_delete_stream_pair (Lisp_Object instream, Lisp_Object outstream)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
816 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
817 event_stream_unixoid_delete_stream_pair (instream, outstream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
818 return USID_DONTHASH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
819 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
820
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
821 /* This is called from GC when a process object is about to be freed.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
822 If we've still got pointers to it in this file, we're gonna lose hard.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
823 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
824 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
825 debug_process_finalization (struct Lisp_Process *p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
826 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
827 #if 0 /* #### */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
828 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
829 Lisp_Object instr, outstr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
830
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
831 get_process_streams (p, &instr, &outstr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
832 /* if it still has fds, then it hasn't been killed yet. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
833 assert (NILP(instr));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
834 assert (NILP(outstr));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
835 /* Better not still be in the "with input" table; we know it's got no fds. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
836 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
837 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
838 Lisp_Object process = filedesc_fds_with_input [i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
839 assert (!PROCESSP (process) || XPROCESS (process) != p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
840 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
841 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
842 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
843
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
844 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
845 gtk_process_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
846 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
847 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
848 Lisp_Object process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
849
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
850 assert (process_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
851 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
852 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
853 process = filedesc_with_input[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
854 if (PROCESSP (process))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
855 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
856 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
857 assert (i < MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
858 filedesc_with_input[i] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
859 process_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
860 /* process events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
861 emacs_event->event_type = process_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
862 emacs_event->timestamp = 0; /* #### */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
863 emacs_event->event.process.process = process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
864 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
865
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
866 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
867 emacs_gtk_select_console (struct console *con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
868 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
869 Lisp_Object console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
870 int infd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
871
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
872 if (CONSOLE_GTK_P (con))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
873 return; /* Gtk consoles are automatically selected for when we initialize them */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
874 infd = event_stream_unixoid_select_console (con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
875 XSETCONSOLE (console, con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
876 select_filedesc (infd, console);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
877 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
878
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
879 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
880 emacs_gtk_unselect_console (struct console *con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
881 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
882 Lisp_Object console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
883 int infd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
884
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
885 if (CONSOLE_GTK_P (con))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
886 return; /* X consoles are automatically selected for when we initialize them */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
887 infd = event_stream_unixoid_unselect_console (con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
888 XSETCONSOLE (console, con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
889 unselect_filedesc (infd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
890 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
891
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
892 /* read an event from a tty, if one is available. Returns non-zero
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
893 if an event was available. Note that when this function is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
894 called, there should always be a tty marked as ready for input.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
895 However, the input condition might actually be EOF, so there
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
896 may not really be any input available. (In this case,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
897 read_event_from_tty_or_stream_desc() will arrange for the TTY device
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
898 to be deleted.) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
899
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
900 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
901 gtk_tty_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
902 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
903 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
904
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
905 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
906 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
907 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
908 Lisp_Object console = filedesc_with_input[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
909 if (CONSOLEP (console))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
910 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
911 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
912 tty_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
913 filedesc_with_input[i] = Qnil;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
914 if (read_event_from_tty_or_stream_desc (emacs_event,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
915 XCONSOLE (console)))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
916 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
917 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
918 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
919
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
920 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
921 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
922
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
923
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
924 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
925 /* Drag 'n Drop handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
926 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
927 #ifdef HAVE_DRAGNDROP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
928 #define TARGET_URI_LIST 0x00
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
929 #define TARGET_TEXT_PLAIN 0x01
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
930 #define TARGET_FILE_NAME 0x02
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
931 #define TARGET_NETSCAPE 0x03
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
932
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
933 static GdkAtom preferred_targets[10];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
934
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
935 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
936 dragndrop_data_received (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
937 GdkDragContext *context,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
938 gint x,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
939 gint y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
940 GtkSelectionData *data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
941 guint info,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
942 guint time)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
943 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
944 Lisp_Object event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
945 struct device *d = gtk_any_window_to_device (widget->window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
946 struct frame *f = gtk_any_widget_or_parent_to_frame (d, widget);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
947 struct Lisp_Event *ev = XEVENT (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
948 Lisp_Object l_type = Qnil, l_data = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
949 Lisp_Object l_dndlist = Qnil, l_item = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
950 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
951
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
952 GCPRO4 (l_type, l_data, l_dndlist, l_item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
953
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
954 ev->event_type = misc_user_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
955 ev->timestamp = time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
956
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
957 XSETFRAME (ev->channel, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
958
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
959 ev->event.misc.x = x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
960 ev->event.misc.y = y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
961
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
962 if (data->type == preferred_targets[TARGET_URI_LIST])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
963 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
964 /* newline-separated list of URLs */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
965 int start, end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
966 const char *string_data = (char *) data->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
967
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
968 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
969
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
970 for (start = 0, end = 0; string_data && string_data[end]; end++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
971 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
972 if ((string_data[end] == '\r') && (string_data[end+1] == '\n'))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
973 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
974 l_item = make_string (&string_data[start], end - start);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
975 l_dndlist = Fcons (l_item, l_dndlist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
976 ++end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
977 start = ++end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
978 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
979 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
980 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
981 else if (data->type == preferred_targets[TARGET_TEXT_PLAIN])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
982 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
983 /* Arbitrary string */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
984 l_type = Qdragdrop_MIME;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
985 l_dndlist = list1 (list3 (list1 (build_string ("text/plain")),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
986 build_string ("8_bit"),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
987 make_ext_string (data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
988 strlen ((char *)data->data),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
989 Qctext)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
990 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
991 else if (data->type == preferred_targets[TARGET_FILE_NAME])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
992 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
993 /* Random filename */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
994 char *hurl = dnd_url_hexify_string (data->data, "file:");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
995
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 589
diff changeset
996 l_dndlist = list1 (make_string ((Intbyte *)hurl, strlen (hurl)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
997 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
998
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
999 xfree (hurl);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1000 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1001 else if (data->type == preferred_targets[TARGET_NETSCAPE])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1002 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1003 /* Single URL */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1004 l_dndlist = list1 (make_string ((Extbyte *)data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1005 strlen ((char *)data->data)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1006 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1007 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1008 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1009 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1010 /* Unknown type - what to do?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1011 We just pass it up to lisp - we already have a mime type.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1012 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1013 l_type = Qdragdrop_MIME;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1014 l_dndlist = list1 (list3 (list1 (build_string (gdk_atom_name (data->type))),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1015 build_string ("8bit"),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1016 make_ext_string ((Extbyte *) data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1017 data->length, Qbinary)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1018 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1019
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1020 ev->event.misc.function = Qdragdrop_drop_dispatch;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1021 ev->event.misc.object = Fcons (l_type, l_dndlist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1022
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1023 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1024
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1025 gtk_drag_finish (context, TRUE, FALSE, time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1026 enqueue_gtk_dispatch_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1027 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1028
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1029 gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1030 dragndrop_dropped (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1031 GdkDragContext *drag_context,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1032 gint x,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1033 gint y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1034 guint time,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1035 gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1036 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1037 /* Netscape drops things like:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1038 STRING
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1039 _SGI_ICON
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1040 _SGI_ICON_TYPE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1041 SGI_FILE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1042 FILE_NAME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1043 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1044
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1045 gmc drops things like
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1046 application/x-mc-desktop-icon
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1047 text/uri-list
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1048 text/plain
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1049 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1050
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1051 We prefer:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1052 text/uri-list
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1053 text/plain
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1054 FILE_NAME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1055 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1056 first one
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1057 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1058 GdkAtom found = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1059 GList *list = drag_context->targets;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1060
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1061 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1062
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1063 if (!preferred_targets[0])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1064 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1065 preferred_targets[TARGET_URI_LIST] = gdk_atom_intern ("text/uri-list", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1066 preferred_targets[TARGET_TEXT_PLAIN] = gdk_atom_intern ("text/plain", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1067 preferred_targets[TARGET_FILE_NAME] = gdk_atom_intern ("FILE_NAME", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1068 preferred_targets[TARGET_NETSCAPE] = gdk_atom_intern ("_NETSCAPE_URL", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1069 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1070
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1071 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1072 stderr_out ("Drop info available in the following formats: \n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1073 while (list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1074 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1075 stderr_out ("\t%s\n", gdk_atom_name ((GdkAtom)list->data));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1076 list = list->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1077 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1078 list = drag_context->targets;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1079 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1080
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1081 while (list && !found)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1082 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1083 for (i = 0; preferred_targets[i] && !found; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1084 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1085 if ((GdkAtom) list->data == preferred_targets[i])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1086 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1087 found = (GdkAtom) list->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1088 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1089 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1090 list = list->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1091 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1092
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1093 if (!found)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1094 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1095 found = (GdkAtom) drag_context->targets->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1096 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1097
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1098 gtk_drag_get_data (GTK_WIDGET (user_data), drag_context, found, time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1099 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1100 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1101 #endif /* HAVE_DRAGNDROP */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1102
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1103
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1104 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1105 /* get the next event from gtk */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1106 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1107
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1108 static Lisp_Object dispatch_event_queue, dispatch_event_queue_tail;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1109
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1110 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1111 enqueue_gtk_dispatch_event (Lisp_Object event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1112 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1113 enqueue_event (event, &dispatch_event_queue, &dispatch_event_queue_tail);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1114 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1115
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1116 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1117 dequeue_gtk_dispatch_event (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1118 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1119 return dequeue_event (&dispatch_event_queue, &dispatch_event_queue_tail);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1120 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1121
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1122 /* This business exists because menu events "happen" when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1123 menubar_selection_callback() is called from somewhere deep
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1124 within XtAppProcessEvent in emacs_Xt_next_event(). The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1125 callback needs to terminate the modal loop in that function
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1126 or else it will continue waiting until another event is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1127 received.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1128
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1129 Same business applies to scrollbar events. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1130
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1131 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1132 signal_special_gtk_user_event (Lisp_Object channel, Lisp_Object function,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1133 Lisp_Object object)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1134 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1135 Lisp_Object event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1136
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1137 XEVENT (event)->event_type = misc_user_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1138 XEVENT (event)->channel = channel;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1139 XEVENT (event)->event.eval.function = function;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1140 XEVENT (event)->event.eval.object = object;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1141
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1142 enqueue_gtk_dispatch_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1143 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1144
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1145 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1146 emacs_gtk_next_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1147 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1148 we_didnt_get_an_event:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1149
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1150 while (NILP (dispatch_event_queue) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1151 !completed_timeouts &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1152 !fake_event_occurred &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1153 !process_events_occurred &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1154 !tty_events_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1155 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1156 gtk_main_iteration();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1157 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1158
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1159 if (!NILP (dispatch_event_queue))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1160 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1161 Lisp_Object event, event2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1162 XSETEVENT (event2, emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1163 event = dequeue_gtk_dispatch_event ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1164 Fcopy_event (event, event2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1165 Fdeallocate_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1166 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1167 else if (tty_events_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1168 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1169 if (!gtk_tty_to_emacs_event (emacs_event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1170 goto we_didnt_get_an_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1171 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1172 else if (completed_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1173 gtk_timeout_to_emacs_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1174 else if (fake_event_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1175 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1176 /* A dummy event, so that a cycle of the command loop will occur. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1177 fake_event_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1178 /* eval events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1179 emacs_event->event_type = eval_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1180 emacs_event->event.eval.function = Qidentity;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1181 emacs_event->event.eval.object = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1182 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1183 else /* if (process_events_occurred) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1184 gtk_process_to_emacs_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1185 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1186
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1187 int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1188 gtk_event_to_emacs_event (struct frame *frame, GdkEvent *gdk_event, struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1189 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1190 struct device *d = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1191 struct gtk_device *gd = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1192 gboolean accept_any_window = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1193
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1194 if (!frame)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1195 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1196 frame = XFRAME (Fselected_frame (Vdefault_gtk_device));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1197 accept_any_window = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1198 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1199
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1200 d = XDEVICE (FRAME_DEVICE (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1201 gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1202
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1203 set_last_server_timestamp (d, gdk_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1204
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1205 switch (gdk_event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1206 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1207 /* XEmacs handles double and triple clicking on its own, and if
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1208 we capture these events, it royally confuses the code in
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1209 ../lisp/mouse.el */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1210 case GDK_2BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1211 case GDK_3BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1212 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1213
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1214 case GDK_BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1215 case GDK_BUTTON_RELEASE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1216 /* We need to ignore button events outside our main window or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1217 things get ugly. The standard scrollbars in Gtk try to be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1218 nice and pass the button press events up to the parent
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1219 widget. This causes us no end of grief though. Effects
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1220 range from setting point to the wrong place to selecting
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1221 new windows. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1222 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1223 GdkWindow *w = gdk_window_at_pointer (NULL, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1224
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1225 /* If you press mouse button and drag it around, and release
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1226 it outside the window, you will get a NULL GdkWindow at
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1227 pointer. We need to forward these events on to XEmacs so
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1228 that the mouse selection voodoo works.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1229 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1230 if (w && (w != gdk_window_lookup (GDK_ROOT_WINDOW ())))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1231 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1232 GdkEvent ev;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1233 GtkWidget *wid = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1234
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1235 ev.any.window = w;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1236 wid = gtk_get_event_widget (&ev);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1237
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1238 if (!GTK_IS_XEMACS (wid) && !accept_any_window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1239 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1240 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1241 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1242 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1243 if (!accept_any_window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1244 gtk_widget_grab_focus (FRAME_GTK_TEXT_WIDGET (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1245 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1246 /* Fall through */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1247 case GDK_KEY_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1248 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1249 unsigned int modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1250 int shift_p, lock_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1251 gboolean key_event_p = (gdk_event->type == GDK_KEY_PRESS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1252 unsigned int *state =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1253 key_event_p ? &gdk_event->key.state : &gdk_event->button.state;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1254
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1255 /* If this is a synthetic KeyPress or Button event, and the user
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1256 has expressed a disinterest in this security hole, then drop
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1257 it on the floor. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1258 /* #### BILL!!! Should this be a generic check for ANY synthetic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1259 event? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1260 if ((gdk_event->any.send_event) && !gtk_allow_sendevents)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1261 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1262
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1263 DEVICE_GTK_MOUSE_TIMESTAMP (d) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1264 DEVICE_GTK_GLOBAL_MOUSE_TIMESTAMP (d) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1265 key_event_p ? gdk_event->key.time : gdk_event->button.time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1266
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1267 if (*state & GDK_CONTROL_MASK) modifiers |= XEMACS_MOD_CONTROL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1268 if (*state & gd->MetaMask) modifiers |= XEMACS_MOD_META;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1269 if (*state & gd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1270 if (*state & gd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1271 if (*state & gd->AltMask) modifiers |= XEMACS_MOD_ALT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1272
589
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1273 {
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1274 int numero_de_botao = -1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1275
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1276 if (!key_event_p)
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1277 numero_de_botao = gdk_event->button.button;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1278
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1279 /* the button gets noted either in the button or the modifiers
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1280 field, but not both. */
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1281 if (numero_de_botao != 1 && (*state & GDK_BUTTON1_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1282 modifiers |= XEMACS_MOD_BUTTON1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1283 if (numero_de_botao != 2 && (*state & GDK_BUTTON2_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1284 modifiers |= XEMACS_MOD_BUTTON2;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1285 if (numero_de_botao != 3 && (*state & GDK_BUTTON3_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1286 modifiers |= XEMACS_MOD_BUTTON3;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1287 if (numero_de_botao != 4 && (*state & GDK_BUTTON4_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1288 modifiers |= XEMACS_MOD_BUTTON4;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1289 if (numero_de_botao != 5 && (*state & GDK_BUTTON5_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1290 modifiers |= XEMACS_MOD_BUTTON5;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1291 }
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1292
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1293 /* Ignore the Caps_Lock key if:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1294 - any other modifiers are down, so that Caps_Lock doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1295 turn C-x into C-X, which would suck.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1296 - the event was a mouse event. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1297 if (modifiers || ! key_event_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1298 *state &= (~GDK_LOCK_MASK);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1299
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1300 shift_p = *state & GDK_SHIFT_MASK;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1301 lock_p = *state & GDK_LOCK_MASK;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1302
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1303 if (shift_p || lock_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1304 modifiers |= XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1305
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1306 if (key_event_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1307 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1308 GdkEventKey *key_event = &gdk_event->key;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1309 Lisp_Object keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1310
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1311 /* This used to compute the frame from the given X window and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1312 store it here, but we really don't care about the frame. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1313 emacs_event->channel = DEVICE_CONSOLE (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1314
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1315 /* Keysym mucking has already been done inside the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1316 GdkEventKey parsing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1317 keysym = gtk_to_emacs_keysym (d, key_event, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1318
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1319 /* If the emacs keysym is nil, then that means that the X
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1320 keysym was either a Modifier or NoSymbol, which
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1321 probably means that we're in the midst of reading a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1322 Multi_key sequence, or a "dead" key prefix, or XIM
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1323 input. Ignore it. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1324 if (NILP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1325 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1326
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1327 /* More Caps_Lock garbage: Caps_Lock should *only* add the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1328 shift modifier to two-case keys (that is, A-Z and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1329 related characters). So at this point (after looking up
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1330 the keysym) if the keysym isn't a dual-case alphabetic,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1331 and if the caps lock key was down but the shift key
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1332 wasn't, then turn off the shift modifier. Gag barf */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1333 /* #### type lossage: assuming equivalence of emacs and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1334 X keysyms */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1335 /* !!#### maybe fix for Mule */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1336 if (lock_p && !shift_p &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1337 ! (CHAR_OR_CHAR_INTP (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1338 && keysym_obeys_caps_lock_p
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1339 ((guint) XCHAR_OR_CHAR_INT (keysym), d)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1340 modifiers &= (~XEMACS_MOD_SHIFT);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1341
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1342 /* If this key contains two distinct keysyms, that is,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1343 "shift" generates a different keysym than the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1344 non-shifted key, then don't apply the shift modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1345 bit: it's implicit. Otherwise, if there would be no
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1346 other way to tell the difference between the shifted
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1347 and unshifted version of this key, apply the shift bit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1348 Non-graphics, like Backspace and F1 get the shift bit
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1349 in the modifiers slot. Neither the characters "a",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1350 "A", "2", nor "@" normally have the shift bit set.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1351 However, "F1" normally does. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1352 if (modifiers & XEMACS_MOD_SHIFT)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1353 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1354 if (CHAR_OR_CHAR_INTP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1355 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1356 modifiers &= ~XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1357 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1358 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1359
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1360 emacs_event->event_type = key_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1361 emacs_event->timestamp = key_event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1362 emacs_event->event.key.modifiers = modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1363 emacs_event->event.key.keysym = keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1364 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1365 else /* Mouse press/release event */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1366 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1367 GdkEventButton *button_event = &gdk_event->button;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1368 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1369
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1370 emacs_event->event_type = (button_event->type == GDK_BUTTON_RELEASE) ?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1371 button_release_event : button_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1372
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1373 emacs_event->event.button.modifiers = modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1374 emacs_event->timestamp = button_event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1375 emacs_event->event.button.button = button_event->button;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1376 emacs_event->event.button.x = button_event->x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1377 emacs_event->event.button.y = button_event->y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1378 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1379 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1380 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1381 case GDK_KEY_RELEASE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1382 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1383 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1384 case GDK_MOTION_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1385 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1386 GdkEventMotion *ev = &gdk_event->motion;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1387 unsigned int modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1388 gint x,y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1389 GdkModifierType mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1390
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1391 /* We use MOTION_HINT_MASK, so we will get only one motion
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1392 event until the next time we call gdk_window_get_pointer or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1393 the user clicks the mouse. So call gdk_window_get_pointer
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1394 now (meaning that the event will be in sync with the server
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1395 just before Fnext_event() returns). If the mouse is still
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1396 in motion, then the server will immediately generate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1397 exactly one more motion event, which will be on the queue
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1398 waiting for us next time around. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1399 gdk_window_get_pointer (ev->window, &x, &y, &mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1400
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1401 DEVICE_GTK_MOUSE_TIMESTAMP (d) = ev->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1402
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1403 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1404 emacs_event->event_type = pointer_motion_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1405 emacs_event->timestamp = ev->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1406 emacs_event->event.motion.x = x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1407 emacs_event->event.motion.y = y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1408 if (mask & GDK_SHIFT_MASK) modifiers |= XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1409 if (mask & GDK_CONTROL_MASK) modifiers |= XEMACS_MOD_CONTROL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1410 if (mask & gd->MetaMask) modifiers |= XEMACS_MOD_META;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1411 if (mask & gd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1412 if (mask & gd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1413 if (mask & gd->AltMask) modifiers |= XEMACS_MOD_ALT;
589
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1414 if (mask & GDK_BUTTON1_MASK) modifiers |= XEMACS_MOD_BUTTON1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1415 if (mask & GDK_BUTTON2_MASK) modifiers |= XEMACS_MOD_BUTTON2;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1416 if (mask & GDK_BUTTON3_MASK) modifiers |= XEMACS_MOD_BUTTON3;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1417 if (mask & GDK_BUTTON4_MASK) modifiers |= XEMACS_MOD_BUTTON4;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1418 if (mask & GDK_BUTTON5_MASK) modifiers |= XEMACS_MOD_BUTTON5;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1419
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1420 /* Currently ignores Shift_Lock but probably shouldn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1421 (but it definitely should ignore Caps_Lock). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1422 emacs_event->event.motion.modifiers = modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1423 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1424 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1425
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1426 default: /* it's a magic event */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1427 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1428 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1429 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1430 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1431 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1432
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1433 static const char *event_name (GdkEvent *);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1434
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1435 static gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1436 generic_event_handler (GtkWidget *widget, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1437 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1438 Lisp_Object emacs_event = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1439 if (!GTK_IS_XEMACS (widget))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1440 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1441 stderr_out ("Got a %s event for a non-XEmacs widget\n",event_name (event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1442 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1443 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1444
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1445 emacs_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1446
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1447 if (gtk_event_to_emacs_event (GTK_XEMACS_FRAME (widget), event, XEVENT (emacs_event)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1448 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1449 enqueue_gtk_dispatch_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1450 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1451 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1452 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1453 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1454 Fdeallocate_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1455 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1456 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1457 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1458
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1459 gint emacs_gtk_key_event_handler(GtkWidget *widget, GdkEventKey *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1460 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1461 return (generic_event_handler (widget, (GdkEvent *) event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1462 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1463
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1464 gint emacs_gtk_button_event_handler(GtkWidget *widget, GdkEventButton *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1465 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1466 return (generic_event_handler (widget, (GdkEvent *) event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1467 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1468
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1469 gint emacs_gtk_motion_event_handler (GtkWidget *widget, GdkEventMotion *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1470 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1471 return (generic_event_handler (widget, (GdkEvent *) event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1472 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1473
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1474 gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1475 emacs_shell_event_handler (GtkWidget *wid /* unused */,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1476 GdkEvent *event,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1477 gpointer closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1478 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1479 struct frame *frame = (struct frame *) closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1480 Lisp_Object lisp_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1481 struct Lisp_Event *emacs_event = XEVENT (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1482 GdkEvent *gdk_event_copy = &emacs_event->event.magic.underlying_gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1483 struct device *d = XDEVICE (FRAME_DEVICE (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1484 gboolean ignore_p = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1485
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1486 set_last_server_timestamp (d, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1487
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1488 #define FROB(event_member) gdk_event_copy->event_member = event->event_member
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1489
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1490 switch (event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1491 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1492 case GDK_SELECTION_REQUEST:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1493 case GDK_SELECTION_CLEAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1494 case GDK_SELECTION_NOTIFY: FROB(selection); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1495 case GDK_PROPERTY_NOTIFY: FROB(property); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1496 case GDK_CLIENT_EVENT: FROB(client); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1497 case GDK_MAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1498 case GDK_UNMAP: FROB(any); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1499 case GDK_CONFIGURE: FROB(configure); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1500 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1501 case GDK_LEAVE_NOTIFY: FROB(crossing); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1502 case GDK_FOCUS_CHANGE: FROB(focus_change); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1503 case GDK_VISIBILITY_NOTIFY: FROB(visibility); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1504 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1505 ignore_p = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1506 /* Hrmm... do we really want to swallow all the other events as magic? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1507 *gdk_event_copy = *event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1508 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1509 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1510 #undef FROB
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1511
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1512 emacs_event->event_type = magic_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1513 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1514
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1515 if (ignore_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1516 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1517 stderr_out ("Ignoring event... (%s)\n", event_name (event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1518 Fdeallocate_event (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1519 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1520 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1521 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1522 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1523 enqueue_gtk_dispatch_event (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1524 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1525 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1526 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1527
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1528
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1529 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1530 /* input pending / C-g checking */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1531 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1532 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1533 gtk_check_for_quit_char (struct device *d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1534
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1535 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1536 check_for_tty_quit_char (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1537 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1538 SELECT_TYPE temp_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1539 int infd = DEVICE_INFD (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1540 struct console *con = XCONSOLE (DEVICE_CONSOLE (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1541 Emchar quit_char = CONSOLE_QUIT_CHAR (con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1542
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1543 FD_ZERO (&temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1544 FD_SET (infd, &temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1545
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1546 while (1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1547 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1548 Lisp_Object event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1549 Emchar the_char;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1550
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1551 if (!poll_fds_for_input (temp_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1552 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1553
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1554 event = Fmake_event (Qnil, Qnil);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1555 if (!read_event_from_tty_or_stream_desc (XEVENT (event), con))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1556 /* EOF, or something ... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1557 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1558 /* #### bogus. quit-char should be allowed to be any sort
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1559 of event. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1560 the_char = event_to_character (XEVENT (event), 1, 0, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1561 if (the_char >= 0 && the_char == quit_char)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1562 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1563 Vquit_flag = Qt;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1564 /* do not queue the C-g. See above. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1565 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1566 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1567
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1568 /* queue the read event to be read for real later. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1569 enqueue_gtk_dispatch_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1570 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1571 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1572
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1573 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1574 emacs_gtk_quit_p (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1575 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1576 Lisp_Object devcons, concons;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1577
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1578 CONSOLE_LOOP (concons)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1579 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1580 struct console *con = XCONSOLE (XCAR (concons));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1581 if (!con->input_enabled)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1582 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1583
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1584 CONSOLE_DEVICE_LOOP (devcons, con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1585 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1586 struct device *d;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1587 d = XDEVICE (XCAR (devcons));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1588
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1589 if (DEVICE_GTK_P (d))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1590 /* emacs may be exiting */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1591 gtk_check_for_quit_char (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1592 else if (DEVICE_TTY_P (d))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1593 check_for_tty_quit_char (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1594 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1595 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1596 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1597
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1598 #include <gdk/gdkx.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1599
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1600 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1601 drain_gtk_queue (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1602
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1603 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1604 /* We can't just spin through here and wait for GTKs idea of the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1605 event queue to get empty, or the queue never gets drained. The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1606 situation is as follows. A process event gets signalled, we put
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1607 it on the queue, then we go into Fnext_event(), which calls
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1608 drain_gtk_queue(). But gtk_events_pending() will always return
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1609 TRUE if there are file-descriptor (aka our process) events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1610 pending. Using GDK_events_pending() only shows us windowing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1611 system events.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1612 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1613 if (GDK_DISPLAY ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1614 while (gdk_events_pending ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1615 gtk_main_iteration ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1616 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1617
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1618 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1619 emacs_gtk_event_pending_p (int user_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1620 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1621 Lisp_Object event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1622 int tick_count_val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1623
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1624 /* If `user_p' is false, then this function returns whether there are any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1625 X, timeout, or fd events pending (that is, whether emacs_gtk_next_event()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1626 would return immediately without blocking).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1627
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1628 if `user_p' is true, then this function returns whether there are any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1629 *user generated* events available (that is, whether there are keyboard
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1630 or mouse-click events ready to be read). This also implies that
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1631 emacs_Xt_next_event() would not block.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1632
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1633 In a non-SIGIO world, this also checks whether the user has typed ^G,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1634 since this is a convenient place to do so. We don't need to do this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1635 in a SIGIO world, since input causes an interrupt.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1636 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1637
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1638 /* This function used to simply check whether there were any X
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1639 events (or if user_p was 1, it iterated over all the pending
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1640 X events using XCheckIfEvent(), looking for keystrokes and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1641 button events). That worked in the old cheesoid event loop,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1642 which didn't go through XtAppDispatchEvent(), but it doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1643 work any more -- X events may not result in anything. For
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1644 example, a button press in a blank part of the menubar appears
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1645 as an X event but will not result in any Emacs events (a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1646 button press that activates the menubar results in an Emacs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1647 event through the stop_next_event mechanism).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1648
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1649 The only accurate way of determining whether these X events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1650 translate into Emacs events is to go ahead and dispatch them
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1651 until there's something on the dispatch queue. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1652
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1653 /* See if there are any user events already on the queue. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1654 EVENT_CHAIN_LOOP (event, dispatch_event_queue)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1655 if (!user_p || command_event_p (event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1656 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1657
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1658 /* See if there's any TTY input available.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1659 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1660 if (poll_fds_for_input (tty_only_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1661 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1662
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1663 if (!user_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1664 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1665 /* If not user_p and there are any timer or file-desc events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1666 pending, we know there will be an event so we're through. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1667 /* XtInputMask pending_value; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1668
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1669 /* Note that formerly we just checked the value of XtAppPending()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1670 to determine if there was file-desc input. This doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1671 work any more with the signal_event_pipe; XtAppPending()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1672 will says "yes" in this case but there isn't really any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1673 input. Another way of fixing this problem is for the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1674 signal_event_pipe to generate actual input in the form
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1675 of an identity eval event or something. (#### maybe this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1676 actually happens?) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1677
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1678 if (poll_fds_for_input (process_only_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1679 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1680
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1681 /* #### Is there any way to do this in Gtk? I don't think there
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1682 is a 'peek' for events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1683 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1684 pending_value = XtAppPending (Xt_app_con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1685
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1686 if (pending_value & XtIMTimer)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1687 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1688 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1689 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1690
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1691 /* XtAppPending() can be super-slow, esp. over a network connection.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1692 Quantify results have indicated that in some cases the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1693 call to detect_input_pending() completely dominates the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1694 running time of redisplay(). Fortunately, in a SIGIO world
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1695 we can more quickly determine whether there are any X events:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1696 if an event has happened since the last time we checked, then
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1697 a SIGIO will have happened. On a machine with broken SIGIO,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1698 we'll still be in an OK state -- the sigio_happened flag
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1699 will get set at least once a second, so we'll be no more than
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1700 one second behind reality. (In general it's OK if we
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1701 erroneously report no input pending when input is actually
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1702 pending() -- preemption is just a bit less efficient, that's
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1703 all. It's bad bad bad if you err the other way -- you've
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1704 promised that `next-event' won't block but it actually will,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1705 and some action might get delayed until the next time you
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1706 hit a key.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1707 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1708
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1709 /* quit_check_signal_tick_count is volatile so try to avoid race conditions
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1710 by using a temporary variable */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1711 tick_count_val = quit_check_signal_tick_count;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1712 if (last_quit_check_signal_tick_count != tick_count_val)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1713 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1714 last_quit_check_signal_tick_count = tick_count_val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1715
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1716 /* We need to drain the entire queue now -- if we only
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1717 drain part of it, we may later on end up with events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1718 actually pending but detect_input_pending() returning
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1719 false because there wasn't another SIGIO. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1720
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1721 drain_gtk_queue ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1722
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1723 EVENT_CHAIN_LOOP (event, dispatch_event_queue)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1724 if (!user_p || command_event_p (event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1725 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1726 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1727
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1728 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1729 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1730
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1731
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1732 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1733 /* initialization */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1734 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1735
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1736 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1737 syms_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1738 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
1739 DEFSYMBOL (Qkey_mapping);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
1740 DEFSYMBOL (Qsans_modifiers);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1741 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1742
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1743 void reinit_vars_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1744 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1745 gtk_event_stream = xnew (struct event_stream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1746 gtk_event_stream->event_pending_p = emacs_gtk_event_pending_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1747 gtk_event_stream->next_event_cb = emacs_gtk_next_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1748 gtk_event_stream->handle_magic_event_cb= emacs_gtk_handle_magic_event;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
1749 gtk_event_stream->format_magic_event_cb= emacs_gtk_format_magic_event;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
1750 gtk_event_stream->compare_magic_event_cb= emacs_gtk_compare_magic_event;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
1751 gtk_event_stream->hash_magic_event_cb = emacs_gtk_hash_magic_event;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1752 gtk_event_stream->add_timeout_cb = emacs_gtk_add_timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1753 gtk_event_stream->remove_timeout_cb = emacs_gtk_remove_timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1754 gtk_event_stream->select_console_cb = emacs_gtk_select_console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1755 gtk_event_stream->unselect_console_cb = emacs_gtk_unselect_console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1756 gtk_event_stream->select_process_cb = emacs_gtk_select_process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1757 gtk_event_stream->unselect_process_cb = emacs_gtk_unselect_process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1758 gtk_event_stream->quit_p_cb = emacs_gtk_quit_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1759 gtk_event_stream->create_stream_pair_cb= emacs_gtk_create_stream_pair;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1760 gtk_event_stream->delete_stream_pair_cb= emacs_gtk_delete_stream_pair;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1761
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1762 the_GTK_timeout_blocktype = Blocktype_new (struct GTK_timeout_blocktype);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1763
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1764 /* this function only makes safe calls */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1765 init_what_input_once ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1766 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1767
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1768 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1769 vars_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1770 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1771 reinit_vars_of_event_gtk ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1772
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1773 dispatch_event_queue = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1774 staticpro (&dispatch_event_queue);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1775 dispatch_event_queue_tail = Qnil;
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 462
diff changeset
1776 staticpro (&dispatch_event_queue_tail);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1777
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1778 DEFVAR_BOOL ("gtk-allow-sendevents", &gtk_allow_sendevents /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1779 *Non-nil means to allow synthetic events. Nil means they are ignored.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1780 Beware: allowing emacs to process SendEvents opens a big security hole.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1781 */ );
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1782 gtk_allow_sendevents = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1783
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1784 last_quit_check_signal_tick_count = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1785 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1786
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1787 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1788 init_event_gtk_late (void) /* called when already initialized */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1789 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1790 timeout_id_tick = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1791 pending_timeouts = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1792 completed_timeouts = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1793
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1794 event_stream = gtk_event_stream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1795
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1796 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1797 /* Shut GDK the hell up */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1798 gdk_error_trap_push ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1799 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1800
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1801 gdk_input_add (signal_event_pipe[0], GDK_INPUT_READ,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1802 (GdkInputFunction) gtk_what_callback, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1803 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1804
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1805 /* Bogus utility routines */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1806 static const char *event_name (GdkEvent *ev)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1807 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1808 return (gtk_event_name (ev->any.type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1809 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1810
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1811 /* This is down at the bottom of the file so I can avoid polluting the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1812 generic code with this X specific CRAP! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1813
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1814 #include <gdk/gdkx.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1815 #include <X11/keysym.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1816 /* #### BILL!!! Fix this please! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1817
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1818
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1819 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1820 /* keymap handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1821 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1822
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1823 /* X bogusly doesn't define the interpretations of any bits besides
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1824 ModControl, ModShift, and ModLock; so the Interclient Communication
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1825 Conventions Manual says that we have to bend over backwards to figure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1826 out what the other modifier bits mean. According to ICCCM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1827
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1828 - Any keycode which is assigned ModControl is a "control" key.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1829
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1830 - Any modifier bit which is assigned to a keycode which generates Meta_L
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1831 or Meta_R is the modifier bit meaning "meta". Likewise for Super, Hyper,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1832 etc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1833
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1834 - Any keypress event which contains ModControl in its state should be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1835 interpreted as a "control" character.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1836
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1837 - Any keypress event which contains a modifier bit in its state which is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1838 generated by a keycode whose corresponding keysym is Meta_L or Meta_R
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1839 should be interpreted as a "meta" character. Likewise for Super, Hyper,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1840 etc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1841
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1842 - It is illegal for a keysym to be associated with more than one modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1843 bit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1844
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1845 This means that the only thing that emacs can reasonably interpret as a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1846 "meta" key is a key whose keysym is Meta_L or Meta_R, and which generates
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1847 one of the modifier bits Mod1-Mod5.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1848
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1849 Unfortunately, many keyboards don't have Meta keys in their default
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1850 configuration. So, if there are no Meta keys, but there are "Alt" keys,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1851 emacs will interpret Alt as Meta. If there are both Meta and Alt keys,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1852 then the Meta keys mean "Meta", and the Alt keys mean "Alt" (it used to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1853 mean "Symbol," but that just confused the hell out of way too many people).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1854
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1855 This works with the default configurations of the 19 keyboard-types I've
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1856 checked.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1857
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1858 Emacs detects keyboard configurations which violate the above rules, and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1859 prints an error message on the standard-error-output. (Perhaps it should
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1860 use a pop-up-window instead.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1861 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1862
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1863 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1864 gtk_reset_key_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1865 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1866 Display *display = GDK_DISPLAY ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1867 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1868 XModifierKeymap *map = (XModifierKeymap *) xd->x_keysym_map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1869 KeySym *keysym, *keysym_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1870 Lisp_Object hashtable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1871 int key_code_count, keysyms_per_code;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1872
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1873 if (map)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1874 XFree ((char *) map);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1875 XDisplayKeycodes (display,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1876 &xd->x_keysym_map_min_code,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1877 &xd->x_keysym_map_max_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1878 key_code_count = xd->x_keysym_map_max_code - xd->x_keysym_map_min_code + 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1879 map = (XModifierKeymap *)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1880 XGetKeyboardMapping (display, xd->x_keysym_map_min_code, key_code_count,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1881 &xd->x_keysym_map_keysyms_per_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1882
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1883 xd->x_keysym_map = (void *)map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1884 hashtable = xd->x_keysym_map_hashtable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1885 if (HASH_TABLEP (hashtable))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1886 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1887 Fclrhash (hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1888 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1889 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1890 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1891 xd->x_keysym_map_hashtable = hashtable =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1892 make_lisp_hash_table (128, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1893 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1894
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1895 for (keysym = (KeySym *) map,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1896 keysyms_per_code = xd->x_keysym_map_keysyms_per_code,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1897 keysym_end = keysym + (key_code_count * keysyms_per_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1898 keysym < keysym_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1899 keysym += keysyms_per_code)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1900 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1901 int j;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1902
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1903 if (keysym[0] == NoSymbol)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1904 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1905
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1906 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1907 Extbyte *name = XKeysymToString (keysym[0]);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1908 Lisp_Object sym = gtk_keysym_to_emacs_keysym (keysym[0], 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1909 if (name)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1910 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1911 Fputhash (build_ext_string (name, Qnative), Qsans_modifiers,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1912 hashtable);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1913 Fputhash (sym, Qsans_modifiers, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1914 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1915 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1916
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1917 for (j = 1; j < keysyms_per_code; j++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1918 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1919 if (keysym[j] != keysym[0] &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1920 keysym[j] != NoSymbol)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1921 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1922 Extbyte *name = XKeysymToString (keysym[j]);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1923 Lisp_Object sym = gtk_keysym_to_emacs_keysym (keysym[j], 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1924 if (name && NILP (Fgethash (sym, hashtable, Qnil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1925 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1926 Fputhash (build_ext_string (name, Qnative), Qt, hashtable);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1927 Fputhash (sym, Qt, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1928 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1929 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1930 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1931 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1932 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1933
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1934 static const char *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1935 index_to_name (int indice)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1936 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1937 switch (indice)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1938 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1939 case ShiftMapIndex: return "ModShift";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1940 case LockMapIndex: return "ModLock";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1941 case ControlMapIndex: return "ModControl";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1942 case Mod1MapIndex: return "Mod1";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1943 case Mod2MapIndex: return "Mod2";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1944 case Mod3MapIndex: return "Mod3";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1945 case Mod4MapIndex: return "Mod4";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1946 case Mod5MapIndex: return "Mod5";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1947 default: return "???";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1948 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1949 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1950
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1951 /* Boy, I really wish C had local functions... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1952 struct c_doesnt_have_closures /* #### not yet used */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1953 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1954 int warned_about_overlapping_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1955 int warned_about_predefined_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1956 int warned_about_duplicate_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1957 int meta_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1958 int hyper_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1959 int super_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1960 int alt_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1961 int mode_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1962 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1963
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1964 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1965 gtk_reset_modifier_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1966 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1967 Display *display = GDK_DISPLAY ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1968 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1969 int modifier_index, modifier_key, column, mkpm;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1970 int warned_about_overlapping_modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1971 /* int warned_about_predefined_modifiers = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1972 /* int warned_about_duplicate_modifiers = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1973 int meta_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1974 int hyper_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1975 int super_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1976 int alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1977 int mode_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1978 XModifierKeymap *map = (XModifierKeymap *) xd->x_modifier_keymap;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1979
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1980 xd->lock_interpretation = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1981
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1982 if (map)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1983 XFreeModifiermap (map);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1984
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1985 gtk_reset_key_mapping (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1986
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1987 xd->x_modifier_keymap = map = XGetModifierMapping (display);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1988
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1989 /* Boy, I really wish C had local functions...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1990 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1991
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1992 /* The call to warn_when_safe must be on the same line as the string or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1993 make-msgfile won't pick it up properly (the newline doesn't confuse
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1994 it, but the backslash does). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1995
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1996 #define store_modifier(name,old) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1997 old = modifier_index;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1998
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1999 mkpm = map->max_keypermod;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2000 for (modifier_index = 0; modifier_index < 8; modifier_index++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2001 for (modifier_key = 0; modifier_key < mkpm; modifier_key++) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2002 KeySym last_sym = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2003 for (column = 0; column < 4; column += 2) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2004 KeyCode code = map->modifiermap[modifier_index * mkpm
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2005 + modifier_key];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2006 KeySym sym = (code ? XKeycodeToKeysym (display, code, column) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2007 if (sym == last_sym) continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2008 last_sym = sym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2009 switch (sym) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2010 case XK_Mode_switch:store_modifier ("Mode_switch", mode_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2011 case XK_Meta_L: store_modifier ("Meta_L", meta_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2012 case XK_Meta_R: store_modifier ("Meta_R", meta_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2013 case XK_Super_L: store_modifier ("Super_L", super_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2014 case XK_Super_R: store_modifier ("Super_R", super_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2015 case XK_Hyper_L: store_modifier ("Hyper_L", hyper_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2016 case XK_Hyper_R: store_modifier ("Hyper_R", hyper_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2017 case XK_Alt_L: store_modifier ("Alt_L", alt_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2018 case XK_Alt_R: store_modifier ("Alt_R", alt_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2019 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2020 case XK_Control_L: check_modifier ("Control_L", ControlMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2021 case XK_Control_R: check_modifier ("Control_R", ControlMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2022 case XK_Shift_L: check_modifier ("Shift_L", ShiftMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2023 case XK_Shift_R: check_modifier ("Shift_R", ShiftMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2024 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2025 case XK_Shift_Lock: /* check_modifier ("Shift_Lock", LockMask); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2026 xd->lock_interpretation = XK_Shift_Lock; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2027 case XK_Caps_Lock: /* check_modifier ("Caps_Lock", LockMask); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2028 xd->lock_interpretation = XK_Caps_Lock; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2029
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2030 /* It probably doesn't make any sense for a modifier bit to be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2031 assigned to a key that is not one of the above, but OpenWindows
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2032 assigns modifier bits to a couple of random function keys for
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2033 no reason that I can discern, so printing a warning here would
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2034 be annoying. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2035 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2036 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2037 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2038 #undef store_modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2039 #undef check_modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2040 #undef modwarn
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2041 #undef modbarf
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2042
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2043 /* If there was no Meta key, then try using the Alt key instead.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2044 If there is both a Meta key and an Alt key, then the Alt key
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2045 is not disturbed and remains an Alt key. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2046 if (! meta_bit && alt_bit)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2047 meta_bit = alt_bit, alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2048
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2049 /* mode_bit overrides everything, since it's processed down inside of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2050 XLookupString() instead of by us. If Meta and Mode_switch both
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2051 generate the same modifier bit (which is an error), then we don't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2052 interpret that bit as Meta, because we can't make XLookupString()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2053 not interpret it as Mode_switch; and interpreting it as both would
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2054 be totally wrong. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2055 if (mode_bit)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2056 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2057 const char *warn = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2058 if (mode_bit == meta_bit) warn = "Meta", meta_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2059 else if (mode_bit == hyper_bit) warn = "Hyper", hyper_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2060 else if (mode_bit == super_bit) warn = "Super", super_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2061 else if (mode_bit == alt_bit) warn = "Alt", alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2062 if (warn)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2063 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2064 warn_when_safe
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2065 (Qkey_mapping, Qwarning,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2066 "XEmacs: %s is being used for both Mode_switch and %s.",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2067 index_to_name (mode_bit), warn),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2068 warned_about_overlapping_modifiers = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2069 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2070 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2071 #undef index_to_name
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2072
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2073 xd->MetaMask = (meta_bit ? (1 << meta_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2074 xd->HyperMask = (hyper_bit ? (1 << hyper_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2075 xd->SuperMask = (super_bit ? (1 << super_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2076 xd->AltMask = (alt_bit ? (1 << alt_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2077 xd->ModeMask = (mode_bit ? (1 << mode_bit) : 0); /* unused */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2078
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2079 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2080
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2081 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2082 gtk_init_modifier_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2083 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2084 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2085 gd->x_keysym_map_hashtable = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2086 gd->x_keysym_map = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2087 gd->x_modifier_keymap = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2088 gtk_reset_modifier_mapping (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2089 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2090
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2091 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2092 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2093 gtk_key_is_modifier_p (KeyCode keycode, struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2094 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2095 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2096 KeySym *syms;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2097 KeySym *map = (KeySym *) xd->x_keysym_map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2098 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2099
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2100 if (keycode < xd->x_keysym_map_min_code ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2101 keycode > xd->x_keysym_map_max_code)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2102 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2103
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2104 syms = &map [(keycode - xd->x_keysym_map_min_code) *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2105 xd->x_keysym_map_keysyms_per_code];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2106 for (i = 0; i < xd->x_keysym_map_keysyms_per_code; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2107 if (IsModifierKey (syms [i]) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2108 syms [i] == XK_Mode_switch) /* why doesn't IsModifierKey count this? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2109 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2110 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2111 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2112 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2113
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2114 struct _quit_predicate_closure {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2115 struct device *device;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2116 Bool *critical;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2117 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2118
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2119 static Bool
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2120 quit_char_predicate (Display *display, XEvent *event, XPointer data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2121 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2122 struct _quit_predicate_closure *cl = (struct _quit_predicate_closure *) data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2123 struct device *d = cl->device;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2124 struct frame *f = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2125 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2126 char c, quit_char;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2127 Bool *critical = cl->critical;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2128 Lisp_Object keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2129 GdkWindow *window = gdk_window_lookup (event->xany.window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2130 guint32 keycode = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2131 GdkEventKey gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2132
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2133 if (window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2134 f = gtk_any_window_to_frame (d, window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2135
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2136 if (critical)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2137 *critical = False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2138
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2139 if ((event->type != KeyPress) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2140 (! window) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2141 (! f) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2142 (event->xkey.state
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2143 & (gd->MetaMask | gd->HyperMask | gd->SuperMask | gd->AltMask)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2144 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2145 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2146 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2147
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2148 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2149 char dummy[256];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2150 XLookupString (&(event->xkey), dummy, 200, (KeySym *)&keycode, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2151 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2152
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2153 memset (&gdk_event, 0, sizeof (gdk_event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2154 gdk_event.type = GDK_KEY_PRESS;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2155 gdk_event.window = window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2156 gdk_event.keyval = keycode;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2157 gdk_event.state = event->xkey.state;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2158
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2159 /* This duplicates some code that exists elsewhere, but it's relatively
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2160 fast and doesn't cons. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2161 keysym = gtk_to_emacs_keysym (d, &gdk_event, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2162 if (NILP (keysym)) return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2163 if (CHAR_OR_CHAR_INTP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2164 c = XCHAR_OR_CHAR_INT (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2165 /* Highly doubtful that these are the quit character, but... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2166 else if (EQ (keysym, QKbackspace)) c = '\b';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2167 else if (EQ (keysym, QKtab)) c = '\t';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2168 else if (EQ (keysym, QKlinefeed)) c = '\n';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2169 else if (EQ (keysym, QKreturn)) c = '\r';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2170 else if (EQ (keysym, QKescape)) c = 27;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2171 else if (EQ (keysym, QKspace)) c = ' ';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2172 else if (EQ (keysym, QKdelete)) c = 127;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2173 else return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2174
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2175 if (event->xkey.state & gd->MetaMask) c |= 0x80;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2176 if ((event->xkey.state & ControlMask) && !(c >= 'A' && c <= 'Z'))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2177 c &= 0x1F; /* unshifted control characters */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2178 quit_char = CONSOLE_QUIT_CHAR (XCONSOLE (DEVICE_CONSOLE (d)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2179
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2180 if (c == quit_char)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2181 return True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2182 /* If we've got Control-Shift-G instead of Control-G, that means
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2183 we have a critical_quit. Caps_Lock is its own modifier, so it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2184 won't cause ^G to act differently than before. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2185 if (event->xkey.state & ControlMask) c &= 0x1F;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2186 if (c == quit_char)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2187 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2188 if (critical) *critical = True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2189 return True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2190 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2191 return False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2192 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2193
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2194 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2195 gtk_check_for_quit_char (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2196 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2197 XEvent event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2198 int queued;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2199 Bool critical_quit = False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2200 struct _quit_predicate_closure closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2201
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2202 XEventsQueued (GDK_DISPLAY (), QueuedAfterReading);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2203
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2204 closure.device = d;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2205 closure.critical = &critical_quit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2206
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2207 queued = XCheckIfEvent (GDK_DISPLAY (), &event, quit_char_predicate, (char *) &closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2208
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2209 if (queued)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2210 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2211 Vquit_flag = (critical_quit ? Qcritical : Qt);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2212 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2213 }