annotate src/event-gtk.c @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents fdefd0186b75
children 2923009caf47
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.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
4 Copyright (C) 1996, 2001 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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
63 #include "events-mod.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
64
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
65 #include <gdk/gdkx.h>
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212 emacs_gtk_handle_magic_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214 /* This function can GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 GdkEvent *event = &emacs_event->event.magic.underlying_gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216 struct frame *f = XFRAME (EVENT_CHANNEL (emacs_event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
217
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 if (!FRAME_LIVE_P (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
221 switch (event->any.type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
223 case GDK_CLIENT_EVENT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
224 handle_client_message (f, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
225 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
226
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227 case GDK_FOCUS_CHANGE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228 handle_focus_event_1 (f, event->focus_change.in);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 case GDK_MAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232 case GDK_UNMAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233 handle_map_event (f, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
237 if (event->crossing.detail != GDK_NOTIFY_INFERIOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
238 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
239 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
240
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
241 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
242 /* FRAME_X_MOUSE_P (f) = 1; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
243 va_run_hook_with_args (Qmouse_enter_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
244 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
245 break;
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 case GDK_LEAVE_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
248 if (event->crossing.detail != GDK_NOTIFY_INFERIOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
249 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
250 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
251
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
252 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
253 /* FRAME_X_MOUSE_P (f) = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
254 va_run_hook_with_args (Qmouse_leave_frame_hook, 1, frame);
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 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 case GDK_VISIBILITY_NOTIFY: /* window visiblity has changed */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259 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
260 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261 FRAME_GTK_TOTALLY_VISIBLE_P (f) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262 (event->visibility.state == GDK_VISIBILITY_UNOBSCURED);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263 /* Note that the fvwm pager only sends VisibilityNotify when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 changing pages. Is this all we need to do ? JV */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265 /* Nope. We must at least trigger a redisplay here.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 Since this case seems similar to MapNotify, I've
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 factored out some code to change_frame_visibility().
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268 This triggers the necessary redisplay and runs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 (un)map-frame-hook. - dkindred@cs.cmu.edu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 /* Changed it again to support the tristate visibility flag */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271 change_frame_visibility (f, (event->visibility.state
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272 != GDK_VISIBILITY_FULLY_OBSCURED) ? 1 : -1);
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 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 }
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 /* Gtk to Emacs event conversion */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 /************************************************************************/
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 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 keysym_obeys_caps_lock_p (guint sym, struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289 /* 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
290 characters, where "alphabetic" means something more than simply A-Z.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291 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
292 But if shift-lock is down, then it does. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
293 if (gd->lock_interpretation == GDK_Shift_Lock)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
294 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
295
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
296 return
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297 ((sym >= GDK_A) && (sym <= GDK_Z)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298 ((sym >= GDK_a) && (sym <= GDK_z)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299 ((sym >= GDK_Agrave) && (sym <= GDK_Odiaeresis)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300 ((sym >= GDK_agrave) && (sym <= GDK_odiaeresis)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
301 ((sym >= GDK_Ooblique) && (sym <= GDK_Thorn)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
302 ((sym >= GDK_oslash) && (sym <= GDK_thorn));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
303 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
304
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
305 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
306 set_last_server_timestamp (struct device *d, GdkEvent *gdk_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
307 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
308 guint32 t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
309 switch (gdk_event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
310 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 case GDK_KEY_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312 case GDK_KEY_RELEASE: t = gdk_event->key.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313 case GDK_BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 case GDK_2BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 case GDK_3BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316 case GDK_BUTTON_RELEASE: t = gdk_event->button.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318 case GDK_LEAVE_NOTIFY: t = gdk_event->crossing.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 case GDK_MOTION_NOTIFY: t = gdk_event->motion.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 case GDK_PROPERTY_NOTIFY: t = gdk_event->property.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
321 case GDK_SELECTION_CLEAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322 case GDK_SELECTION_REQUEST:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
323 case GDK_SELECTION_NOTIFY: t = gdk_event->selection.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 default: return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
325 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
326 DEVICE_GTK_LAST_SERVER_TIMESTAMP (d) = t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
327 }
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 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
330 gtk_keysym_to_emacs_keysym (guint keysym, int simple_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
331 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
332 char *name;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
333 if (keysym >= GDK_exclam && keysym <= GDK_asciitilde)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
334 /* We must assume that the X keysym numbers for the ASCII graphic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
335 characters are the same as their ASCII codes. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336 return make_char (keysym);
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 switch (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
339 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340 /* These would be handled correctly by the default case, but by
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 special-casing them here we don't garbage a string or call
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 intern(). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343 case GDK_BackSpace: return QKbackspace;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 case GDK_Tab: return QKtab;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
345 case GDK_Linefeed: return QKlinefeed;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 case GDK_Return: return QKreturn;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347 case GDK_Escape: return QKescape;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348 case GDK_space: return QKspace;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
349 case GDK_Delete: return QKdelete;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
350 case 0: return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352 if (simple_p) return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 /* !!#### not Mule-ized */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
354 name = gdk_keyval_name (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355 if (!name || !name[0])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
356 /* This happens if there is a mismatch between the Xlib of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
357 XEmacs and the Xlib of the X server...
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 Let's hard-code in some knowledge of common keysyms introduced
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360 in recent X11 releases. Snarfed from X11/keysymdef.h
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 Probably we should add some stuff here for X11R6. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363 switch (keysym)
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 case 0xFF95: return KEYSYM ("kp-home");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366 case 0xFF96: return KEYSYM ("kp-left");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 case 0xFF97: return KEYSYM ("kp-up");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368 case 0xFF98: return KEYSYM ("kp-right");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 case 0xFF99: return KEYSYM ("kp-down");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370 case 0xFF9A: return KEYSYM ("kp-prior");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371 case 0xFF9B: return KEYSYM ("kp-next");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
372 case 0xFF9C: return KEYSYM ("kp-end");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 case 0xFF9D: return KEYSYM ("kp-begin");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
374 case 0xFF9E: return KEYSYM ("kp-insert");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
375 case 0xFF9F: return KEYSYM ("kp-delete");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
376
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377 case 0x1005FF10: return KEYSYM ("SunF36"); /* labeled F11 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378 case 0x1005FF11: return KEYSYM ("SunF37"); /* labeled F12 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
380 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
381 char buf [64];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 sprintf (buf, "unknown-keysym-0x%X", (int) keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 return KEYSYM (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
385 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 /* If it's got a one-character name, that's good enough. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
387 if (!name[1])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
388 return make_char (name[0]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
389
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390 /* If it's in the "Keyboard" character set, downcase it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391 The case of those keysyms is too totally random for us to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392 force anyone to remember them.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 The case of the other character sets is significant, however.
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 if ((((unsigned int) keysym) & (~0x1FF)) == ((unsigned int) 0xFE00))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
397 char buf [255];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 char *s1, *s2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
399 for (s1 = name, s2 = buf; *s1; s1++, s2++) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
400 if (*s1 == '_') {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
401 *s2 = '-';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
402 } else {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
403 *s2 = tolower (* (unsigned char *) s1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
404 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
405 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
406 *s2 = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
407 return KEYSYM (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
408 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
409 return KEYSYM (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414 gtk_to_emacs_keysym (struct device *d, GdkEventKey *event, int simple_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
415 /* simple_p means don't try too hard (ASCII only) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
416 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
417 if (event->length != 1)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
418 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
419 /* Generate multiple emacs events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 Emchar ch;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
421 Lisp_Object instream, fb_instream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
422 Lstream *istr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423 struct gcpro gcpro1, gcpro2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425 fb_instream =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
426 make_fixed_buffer_input_stream ((unsigned char *) event->string, event->length);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
427
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
428 /* #### Use get_coding_system_for_text_file
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
429 (Vcomposed_input_coding_system, 0) */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430 instream =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
431 make_coding_input_stream (XLSTREAM (fb_instream),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
432 Qundecided, CODING_DECODE);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
433
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
434 istr = XLSTREAM (instream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
435
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
436 GCPRO2 (instream, fb_instream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
437 while ((ch = Lstream_get_emchar (istr)) != EOF)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
438 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
439 Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440 struct Lisp_Event *ev = XEVENT (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
441 ev->channel = DEVICE_CONSOLE (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
442 ev->event_type = key_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
443 ev->timestamp = event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 ev->event.key.modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445 ev->event.key.keysym = make_char (ch);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
446 enqueue_gtk_dispatch_event (emacs_event);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
447 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 Lstream_close (istr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
449 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
450 Lstream_delete (istr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
451 Lstream_delete (XLSTREAM (fb_instream));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 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
453 return (Qnil);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
454 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
455 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
456 else
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
457 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
458 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
459 return (Qnil);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460 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
461 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
462 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
463
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
464
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
465 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
466 /* timeout events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
467 /************************************************************************/
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 static int timeout_id_tick;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
471 struct GTK_timeout {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
472 int id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
473 guint timeout_id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
474 struct GTK_timeout *next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
475 } *pending_timeouts, *completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
476
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
477 struct GTK_timeout_blocktype
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
478 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
479 Blocktype_declare (struct GTK_timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
480 } *the_GTK_timeout_blocktype;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
481
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 /* called by the gtk main loop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
483 static gint
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
484 gtk_timeout_callback (gpointer closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
486 struct GTK_timeout *timeout = (struct GTK_timeout *) closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
487 struct GTK_timeout *t2 = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
488
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
489 /* Remove this one from the list of pending timeouts */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
490 if (t2 == timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 pending_timeouts = pending_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
492 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
493 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
494 while (t2->next && t2->next != timeout) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 assert (t2->next);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
496 t2->next = t2->next->next;
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 /* Add this one to the list of completed timeouts */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
499 timeout->next = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
500 completed_timeouts = timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501 return(FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
502 }
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 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 emacs_gtk_add_timeout (EMACS_TIME thyme)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
506 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
507 struct GTK_timeout *timeout = Blocktype_alloc (the_GTK_timeout_blocktype);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
508 EMACS_TIME current_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
509 int milliseconds;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
510
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
511 timeout->id = timeout_id_tick++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
512 timeout->next = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
513 pending_timeouts = timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
514 EMACS_GET_TIME (current_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
515 EMACS_SUB_TIME (thyme, thyme, current_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
516 milliseconds = EMACS_SECS (thyme) * 1000 +
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
517 EMACS_USECS (thyme) / 1000;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
518 if (milliseconds < 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
519 milliseconds = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
520 timeout->timeout_id = gtk_timeout_add (milliseconds,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
521 gtk_timeout_callback,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
522 (gpointer) timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
523 return timeout->id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
524 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
525
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
526 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
527 emacs_gtk_remove_timeout (int id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
528 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
529 struct GTK_timeout *timeout, *t2;
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 timeout = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
532
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
533 /* 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
534 if (pending_timeouts)
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 if (id == pending_timeouts->id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
537 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
538 timeout = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
539 pending_timeouts = pending_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
540 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
541 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
542 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
543 t2 = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
544 while (t2->next && t2->next->id != id) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
545 if ( t2->next) /*found it */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
546 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
547 timeout = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
548 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
549 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
550 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
551 /* if it was pending, we have removed it from the list */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
552 if (timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
553 gtk_timeout_remove (timeout->timeout_id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
554 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
555
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
556 /* 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
557 into an Emacs event yet */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
558 if (!timeout && completed_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
559 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
560 /* Code duplication! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
561 if (id == completed_timeouts->id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
562 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
563 timeout = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
564 completed_timeouts = completed_timeouts->next;
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 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
567 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
568 t2 = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
569 while (t2->next && t2->next->id != id) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
570 if ( t2->next) /*found it */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
571 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
572 timeout = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
573 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
574 }
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
577
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
578 /* If we found the thing on the lists of timeouts,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
579 and removed it, deallocate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
580 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
581 if (timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
582 Blocktype_free (the_GTK_timeout_blocktype, timeout);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
585 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
586 gtk_timeout_to_emacs_event (struct Lisp_Event *emacs_event)
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 struct GTK_timeout *timeout = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
589 assert (timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
590 completed_timeouts = completed_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
591 emacs_event->event_type = timeout_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
592 /* timeout events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
593 emacs_event->timestamp = 0; /* #### wrong!! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
594 emacs_event->event.timeout.interval_id = timeout->id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
595 Blocktype_free (the_GTK_timeout_blocktype, timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
596 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
597
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 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
600 /* process and tty events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
601 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
602
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
603 struct what_is_ready_closure
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 int fd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
606 Lisp_Object what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
607 gint id;
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 static Lisp_Object *filedesc_with_input;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
611 static struct what_is_ready_closure **filedesc_to_what_closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
612
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
613 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
614 init_what_input_once (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
615 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
616 int i;
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 filedesc_with_input = xnew_array (Lisp_Object, MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
619 filedesc_to_what_closure =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
620 xnew_array (struct what_is_ready_closure *, MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
621
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
622 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
623 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
624 filedesc_to_what_closure[i] = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
625 filedesc_with_input[i] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
626 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
627
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
628 process_events_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
629 tty_events_occurred = 0;
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 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
633 mark_what_as_being_ready (struct what_is_ready_closure *closure)
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 if (NILP (filedesc_with_input[closure->fd]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
636 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
637 SELECT_TYPE temp_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
638 FD_ZERO (&temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
639 FD_SET (closure->fd, &temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
640 /* Check to make sure there's *really* input available.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
641 Sometimes things seem to get confused and this gets called
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
642 for the tty fd when there's really only input available
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
643 on some process's fd. (It will subsequently get called
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
644 for that process's fd, so returning without setting any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
645 flags will take care of it.) To see the problem, uncomment
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
646 the stderr_out below, turn NORMAL_QUIT_CHECK_TIMEOUT_MSECS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
647 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
648 and press return repeatedly. (Seen under AIX & Linux.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
649 -dkindred@cs.cmu.edu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
650 if (!poll_fds_for_input (temp_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
651 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
652 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
653 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
654 closure->fd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
655 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
656 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
657 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
658 filedesc_with_input[closure->fd] = closure->what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
659 if (PROCESSP (closure->what))
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 /* Don't increment this if the current process is already marked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
662 * as having input. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
663 process_events_occurred++;
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 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
666 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
667 tty_events_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
668 }
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
671
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
672 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
673 gtk_what_callback (gpointer closure, gint source, GdkInputCondition why)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
674 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
675 /* 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
676 The only purpose of this is to make XtAppProcessEvent() stop
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
677 blocking. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
678 if (closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
679 mark_what_as_being_ready ((struct what_is_ready_closure *) closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
680 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
681 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
682 fake_event_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
683 drain_signal_event_pipe ();
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
686
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
687 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
688 select_filedesc (int fd, Lisp_Object what)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
689 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
690 struct what_is_ready_closure *closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
691
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
692 /* If somebody is trying to select something that's already selected
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
693 for, then something went wrong. The generic routines ought to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
694 detect this and error before here. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
695 assert (!filedesc_to_what_closure[fd]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
696
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
697 closure = xnew (struct what_is_ready_closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
698 closure->fd = fd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
699 closure->what = what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
700 closure->id = gdk_input_add (fd, GDK_INPUT_READ,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
701 (GdkInputFunction) gtk_what_callback, closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
702 filedesc_to_what_closure[fd] = closure;
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 unselect_filedesc (int fd)
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 struct what_is_ready_closure *closure = filedesc_to_what_closure[fd];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
709
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
710 assert (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
711 if (!NILP (filedesc_with_input[fd]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
712 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
713 /* We are unselecting this process before we have drained the rest of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
714 the input from it, probably from status_notify() in the command loop.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
715 This can happen like so:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
716
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
717 - We are waiting in XtAppNextEvent()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
718 - Process generates output
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
719 - Process is marked as being ready
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
720 - Process dies, SIGCHLD gets generated before we return (!?)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
721 It could happen I guess.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
722 - sigchld_handler() marks process as dead
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
723 - Somehow we end up getting a new KeyPress event on the queue
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
724 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
725 not sure it can't either so let's assume it can...).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
726 - Key events have priority so we return that instead of the proc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
727 - Before dispatching the lisp key event we call status_notify()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
728 - Which deselects the process that SIGCHLD marked as dead.
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 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
731 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
732 throwing away the last block of output - status_notify() has already
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
733 taken care of running the proc filter or whatever.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
734 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
735 filedesc_with_input[fd] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
736 if (PROCESSP (closure->what))
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 assert (process_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
739 process_events_occurred--;
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 else
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 (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
744 tty_events_occurred--;
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
747 gdk_input_remove (closure->id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
748 xfree (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
749 filedesc_to_what_closure[fd] = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
750 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
751
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
752 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
753 emacs_gtk_select_process (struct Lisp_Process *p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
754 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
755 Lisp_Object process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
756 int infd = event_stream_unixoid_select_process (p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
757
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
758 XSETPROCESS (process, p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
759 select_filedesc (infd, process);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
760 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
761
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
762 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
763 emacs_gtk_unselect_process (struct Lisp_Process *p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
764 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
765 int infd = event_stream_unixoid_unselect_process (p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
766
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
767 unselect_filedesc (infd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
768 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
769
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
770 static USID
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
771 emacs_gtk_create_stream_pair (void* inhandle, void* outhandle,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
772 Lisp_Object* instream, Lisp_Object* outstream, int flags)
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 USID u = event_stream_unixoid_create_stream_pair
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
775 (inhandle, outhandle, instream, outstream, flags);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
776 if (u != USID_ERROR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
777 u = USID_DONTHASH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
778 return u;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
781 static USID
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
782 emacs_gtk_delete_stream_pair (Lisp_Object instream, Lisp_Object outstream)
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 event_stream_unixoid_delete_stream_pair (instream, outstream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
785 return USID_DONTHASH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
786 }
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 /* 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
789 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
790 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
791 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
792 debug_process_finalization (struct Lisp_Process *p)
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 #if 0 /* #### */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
795 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
796 Lisp_Object instr, outstr;
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 get_process_streams (p, &instr, &outstr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
799 /* if it still has fds, then it hasn't been killed yet. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
800 assert (NILP(instr));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
801 assert (NILP(outstr));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
802 /* 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
803 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
804 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
805 Lisp_Object process = filedesc_fds_with_input [i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
806 assert (!PROCESSP (process) || XPROCESS (process) != p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
807 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
808 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
809 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
810
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
811 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
812 gtk_process_to_emacs_event (struct Lisp_Event *emacs_event)
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 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
815 Lisp_Object process;
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 assert (process_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
818 for (i = 0; i < MAXDESC; i++)
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 process = filedesc_with_input[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
821 if (PROCESSP (process))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
822 break;
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 assert (i < MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
825 filedesc_with_input[i] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
826 process_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
827 /* process events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
828 emacs_event->event_type = process_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
829 emacs_event->timestamp = 0; /* #### */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
830 emacs_event->event.process.process = process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
831 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
832
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
833 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
834 emacs_gtk_select_console (struct console *con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
835 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
836 Lisp_Object console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
837 int infd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
838
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
839 if (CONSOLE_GTK_P (con))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
840 return; /* Gtk consoles are automatically selected for when we initialize them */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
841 infd = event_stream_unixoid_select_console (con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
842 XSETCONSOLE (console, con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
843 select_filedesc (infd, console);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
844 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
845
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
846 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
847 emacs_gtk_unselect_console (struct console *con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
848 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
849 Lisp_Object console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
850 int infd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
851
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
852 if (CONSOLE_GTK_P (con))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
853 return; /* X consoles are automatically selected for when we initialize them */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
854 infd = event_stream_unixoid_unselect_console (con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
855 XSETCONSOLE (console, con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
856 unselect_filedesc (infd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
857 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
858
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
859 /* 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
860 if an event was available. Note that when this function is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
861 called, there should always be a tty marked as ready for input.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
862 However, the input condition might actually be EOF, so there
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
863 may not really be any input available. (In this case,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
864 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
865 to be deleted.) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
866
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
867 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
868 gtk_tty_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
869 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
870 int i;
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 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
873 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
874 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
875 Lisp_Object console = filedesc_with_input[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
876 if (CONSOLEP (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 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
879 tty_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
880 filedesc_with_input[i] = Qnil;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
881 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
882 XCONSOLE (console)))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
883 return 1;
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
886
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
887 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
888 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
889
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 /* Drag 'n Drop handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
893 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
894 #ifdef HAVE_DRAGNDROP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
895 #define TARGET_URI_LIST 0x00
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
896 #define TARGET_TEXT_PLAIN 0x01
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
897 #define TARGET_FILE_NAME 0x02
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
898 #define TARGET_NETSCAPE 0x03
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 GdkAtom preferred_targets[10];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
901
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
902 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
903 dragndrop_data_received (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
904 GdkDragContext *context,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
905 gint x,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
906 gint y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
907 GtkSelectionData *data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
908 guint info,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
909 guint time)
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 Lisp_Object event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
912 struct device *d = gtk_any_window_to_device (widget->window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
913 struct frame *f = gtk_any_widget_or_parent_to_frame (d, widget);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
914 struct Lisp_Event *ev = XEVENT (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
915 Lisp_Object l_type = Qnil, l_data = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
916 Lisp_Object l_dndlist = Qnil, l_item = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
917 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
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 GCPRO4 (l_type, l_data, l_dndlist, l_item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
920
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
921 ev->event_type = misc_user_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
922 ev->timestamp = time;
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 XSETFRAME (ev->channel, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
925
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
926 ev->event.misc.x = x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
927 ev->event.misc.y = y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
928
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
929 if (data->type == preferred_targets[TARGET_URI_LIST])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
930 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
931 /* newline-separated list of URLs */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
932 int start, end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
933 const char *string_data = (char *) data->data;
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 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
936
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
937 for (start = 0, end = 0; string_data && string_data[end]; end++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
938 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
939 if ((string_data[end] == '\r') && (string_data[end+1] == '\n'))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
940 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
941 l_item = make_string (&string_data[start], end - start);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
942 l_dndlist = Fcons (l_item, l_dndlist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
943 ++end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
944 start = ++end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
945 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
946 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
947 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
948 else if (data->type == preferred_targets[TARGET_TEXT_PLAIN])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
949 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
950 /* Arbitrary string */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
951 l_type = Qdragdrop_MIME;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
952 l_dndlist = list1 (list3 (list1 (build_string ("text/plain")),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
953 build_string ("8_bit"),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
954 make_ext_string (data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
955 strlen ((char *)data->data),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
956 Qctext)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
957 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
958 else if (data->type == preferred_targets[TARGET_FILE_NAME])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
959 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
960 /* Random filename */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
961 char *hurl = dnd_url_hexify_string (data->data, "file:");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
962
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 589
diff changeset
963 l_dndlist = list1 (make_string ((Intbyte *)hurl, strlen (hurl)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
964 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
965
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
966 xfree (hurl);
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 else if (data->type == preferred_targets[TARGET_NETSCAPE])
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 /* Single URL */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
971 l_dndlist = list1 (make_string ((Extbyte *)data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
972 strlen ((char *)data->data)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
973 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
974 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
975 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
976 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
977 /* Unknown type - what to do?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
978 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
979 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
980 l_type = Qdragdrop_MIME;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
981 l_dndlist = list1 (list3 (list1 (build_string (gdk_atom_name (data->type))),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
982 build_string ("8bit"),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
983 make_ext_string ((Extbyte *) data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
984 data->length, Qbinary)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
985 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
986
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
987 ev->event.misc.function = Qdragdrop_drop_dispatch;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
988 ev->event.misc.object = Fcons (l_type, l_dndlist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
989
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
990 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
991
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
992 gtk_drag_finish (context, TRUE, FALSE, time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
993 enqueue_gtk_dispatch_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
994 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
995
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
996 gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
997 dragndrop_dropped (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
998 GdkDragContext *drag_context,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
999 gint x,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1000 gint y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1001 guint time,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1002 gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1003 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1004 /* Netscape drops things like:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1005 STRING
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1006 _SGI_ICON
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1007 _SGI_ICON_TYPE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1008 SGI_FILE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1009 FILE_NAME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1010 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1011
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1012 gmc drops things like
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1013 application/x-mc-desktop-icon
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1014 text/uri-list
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1015 text/plain
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1016 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1017
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1018 We prefer:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1019 text/uri-list
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1020 text/plain
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1021 FILE_NAME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1022 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1023 first one
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 GdkAtom found = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1026 GList *list = drag_context->targets;
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 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1029
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1030 if (!preferred_targets[0])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1031 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1032 preferred_targets[TARGET_URI_LIST] = gdk_atom_intern ("text/uri-list", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1033 preferred_targets[TARGET_TEXT_PLAIN] = gdk_atom_intern ("text/plain", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1034 preferred_targets[TARGET_FILE_NAME] = gdk_atom_intern ("FILE_NAME", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1035 preferred_targets[TARGET_NETSCAPE] = gdk_atom_intern ("_NETSCAPE_URL", FALSE);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1038 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1039 stderr_out ("Drop info available in the following formats: \n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1040 while (list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1041 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1042 stderr_out ("\t%s\n", gdk_atom_name ((GdkAtom)list->data));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1043 list = list->next;
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 list = drag_context->targets;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1046 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1047
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1048 while (list && !found)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1049 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1050 for (i = 0; preferred_targets[i] && !found; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1051 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1052 if ((GdkAtom) list->data == preferred_targets[i])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1053 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1054 found = (GdkAtom) list->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1055 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1056 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1057 list = list->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1058 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1059
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1060 if (!found)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1061 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1062 found = (GdkAtom) drag_context->targets->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1063 }
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 gtk_drag_get_data (GTK_WIDGET (user_data), drag_context, found, time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1066 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1067 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1068 #endif /* HAVE_DRAGNDROP */
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 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1072 /* get the next event from gtk */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1073 /************************************************************************/
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 static Lisp_Object dispatch_event_queue, dispatch_event_queue_tail;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1076
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1077 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1078 enqueue_gtk_dispatch_event (Lisp_Object event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1079 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1080 enqueue_event (event, &dispatch_event_queue, &dispatch_event_queue_tail);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1081 }
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 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1084 dequeue_gtk_dispatch_event (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1085 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1086 return dequeue_event (&dispatch_event_queue, &dispatch_event_queue_tail);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1087 }
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 /* This business exists because menu events "happen" when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1090 menubar_selection_callback() is called from somewhere deep
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1091 within XtAppProcessEvent in emacs_Xt_next_event(). The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1092 callback needs to terminate the modal loop in that function
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1093 or else it will continue waiting until another event is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1094 received.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1095
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1096 Same business applies to scrollbar events. */
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 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1099 signal_special_gtk_user_event (Lisp_Object channel, Lisp_Object function,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1100 Lisp_Object object)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1101 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1102 Lisp_Object event = Fmake_event (Qnil, Qnil);
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 XEVENT (event)->event_type = misc_user_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1105 XEVENT (event)->channel = channel;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1106 XEVENT (event)->event.eval.function = function;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1107 XEVENT (event)->event.eval.object = object;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1108
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1109 enqueue_gtk_dispatch_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1110 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1111
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1112 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1113 emacs_gtk_next_event (struct Lisp_Event *emacs_event)
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 we_didnt_get_an_event:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1116
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1117 while (NILP (dispatch_event_queue) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1118 !completed_timeouts &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1119 !fake_event_occurred &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1120 !process_events_occurred &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1121 !tty_events_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1122 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1123 gtk_main_iteration();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1124 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1125
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1126 if (!NILP (dispatch_event_queue))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1127 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1128 Lisp_Object event, event2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1129 XSETEVENT (event2, emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1130 event = dequeue_gtk_dispatch_event ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1131 Fcopy_event (event, event2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1132 Fdeallocate_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1133 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1134 else if (tty_events_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1135 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1136 if (!gtk_tty_to_emacs_event (emacs_event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1137 goto we_didnt_get_an_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1138 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1139 else if (completed_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1140 gtk_timeout_to_emacs_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1141 else if (fake_event_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1142 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1143 /* 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
1144 fake_event_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1145 /* eval events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1146 emacs_event->event_type = eval_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1147 emacs_event->event.eval.function = Qidentity;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1148 emacs_event->event.eval.object = Qnil;
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 else /* if (process_events_occurred) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1151 gtk_process_to_emacs_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1152 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1153
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1154 int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1155 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
1156 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1157 struct device *d = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1158 struct gtk_device *gd = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1159 gboolean accept_any_window = FALSE;
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 if (!frame)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1162 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1163 frame = XFRAME (Fselected_frame (Vdefault_gtk_device));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1164 accept_any_window = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1165 }
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 d = XDEVICE (FRAME_DEVICE (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1168 gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1169
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1170 set_last_server_timestamp (d, gdk_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 switch (gdk_event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1173 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1174 /* XEmacs handles double and triple clicking on its own, and if
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1175 we capture these events, it royally confuses the code in
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1176 ../lisp/mouse.el */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1177 case GDK_2BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1178 case GDK_3BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1179 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1180
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1181 case GDK_BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1182 case GDK_BUTTON_RELEASE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1183 /* We need to ignore button events outside our main window or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1184 things get ugly. The standard scrollbars in Gtk try to be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1185 nice and pass the button press events up to the parent
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1186 widget. This causes us no end of grief though. Effects
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1187 range from setting point to the wrong place to selecting
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1188 new windows. */
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 GdkWindow *w = gdk_window_at_pointer (NULL, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1191
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1192 /* If you press mouse button and drag it around, and release
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1193 it outside the window, you will get a NULL GdkWindow at
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1194 pointer. We need to forward these events on to XEmacs so
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1195 that the mouse selection voodoo works.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1196 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1197 if (w && (w != gdk_window_lookup (GDK_ROOT_WINDOW ())))
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 GdkEvent ev;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1200 GtkWidget *wid = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1201
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1202 ev.any.window = w;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1203 wid = gtk_get_event_widget (&ev);
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 if (!GTK_IS_XEMACS (wid) && !accept_any_window)
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 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1208 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1209 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1210 if (!accept_any_window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1211 gtk_widget_grab_focus (FRAME_GTK_TEXT_WIDGET (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1212 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1213 /* Fall through */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1214 case GDK_KEY_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1215 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1216 unsigned int modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1217 int shift_p, lock_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1218 gboolean key_event_p = (gdk_event->type == GDK_KEY_PRESS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1219 unsigned int *state =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1220 key_event_p ? &gdk_event->key.state : &gdk_event->button.state;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1221
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1222 /* If this is a synthetic KeyPress or Button event, and the user
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1223 has expressed a disinterest in this security hole, then drop
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1224 it on the floor. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1225 /* #### BILL!!! Should this be a generic check for ANY synthetic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1226 event? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1227 if ((gdk_event->any.send_event) && !gtk_allow_sendevents)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1228 return 0;
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 DEVICE_GTK_MOUSE_TIMESTAMP (d) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1231 DEVICE_GTK_GLOBAL_MOUSE_TIMESTAMP (d) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1232 key_event_p ? gdk_event->key.time : gdk_event->button.time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1233
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1234 if (*state & GDK_CONTROL_MASK) modifiers |= XEMACS_MOD_CONTROL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1235 if (*state & gd->MetaMask) modifiers |= XEMACS_MOD_META;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1236 if (*state & gd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1237 if (*state & gd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1238 if (*state & gd->AltMask) modifiers |= XEMACS_MOD_ALT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1239
589
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1240 {
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1241 int numero_de_botao = -1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1242
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1243 if (!key_event_p)
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1244 numero_de_botao = gdk_event->button.button;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1245
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1246 /* 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
1247 field, but not both. */
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1248 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
1249 modifiers |= XEMACS_MOD_BUTTON1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1250 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
1251 modifiers |= XEMACS_MOD_BUTTON2;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1252 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
1253 modifiers |= XEMACS_MOD_BUTTON3;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1254 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
1255 modifiers |= XEMACS_MOD_BUTTON4;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1256 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
1257 modifiers |= XEMACS_MOD_BUTTON5;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1258 }
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1259
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1260 /* Ignore the Caps_Lock key if:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1261 - any other modifiers are down, so that Caps_Lock doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1262 turn C-x into C-X, which would suck.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1263 - the event was a mouse event. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1264 if (modifiers || ! key_event_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1265 *state &= (~GDK_LOCK_MASK);
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 shift_p = *state & GDK_SHIFT_MASK;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1268 lock_p = *state & GDK_LOCK_MASK;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1269
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1270 if (shift_p || lock_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1271 modifiers |= XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1272
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1273 if (key_event_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1274 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1275 GdkEventKey *key_event = &gdk_event->key;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1276 Lisp_Object keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1277
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1278 /* This used to compute the frame from the given X window and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1279 store it here, but we really don't care about the frame. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1280 emacs_event->channel = DEVICE_CONSOLE (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1281
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1282 /* Keysym mucking has already been done inside the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1283 GdkEventKey parsing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1284 keysym = gtk_to_emacs_keysym (d, key_event, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1285
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1286 /* If the emacs keysym is nil, then that means that the X
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1287 keysym was either a Modifier or NoSymbol, which
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1288 probably means that we're in the midst of reading a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1289 Multi_key sequence, or a "dead" key prefix, or XIM
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1290 input. Ignore it. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1291 if (NILP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1292 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1293
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1294 /* More Caps_Lock garbage: Caps_Lock should *only* add the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1295 shift modifier to two-case keys (that is, A-Z and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1296 related characters). So at this point (after looking up
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1297 the keysym) if the keysym isn't a dual-case alphabetic,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1298 and if the caps lock key was down but the shift key
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1299 wasn't, then turn off the shift modifier. Gag barf */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1300 /* #### type lossage: assuming equivalence of emacs and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1301 X keysyms */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1302 /* !!#### maybe fix for Mule */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1303 if (lock_p && !shift_p &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1304 ! (CHAR_OR_CHAR_INTP (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1305 && keysym_obeys_caps_lock_p
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1306 ((guint) XCHAR_OR_CHAR_INT (keysym), d)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1307 modifiers &= (~XEMACS_MOD_SHIFT);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1308
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1309 /* If this key contains two distinct keysyms, that is,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1310 "shift" generates a different keysym than the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1311 non-shifted key, then don't apply the shift modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1312 bit: it's implicit. Otherwise, if there would be no
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1313 other way to tell the difference between the shifted
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1314 and unshifted version of this key, apply the shift bit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1315 Non-graphics, like Backspace and F1 get the shift bit
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1316 in the modifiers slot. Neither the characters "a",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1317 "A", "2", nor "@" normally have the shift bit set.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1318 However, "F1" normally does. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1319 if (modifiers & XEMACS_MOD_SHIFT)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1320 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1321 if (CHAR_OR_CHAR_INTP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1322 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1323 modifiers &= ~XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1324 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1325 }
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 emacs_event->event_type = key_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1328 emacs_event->timestamp = key_event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1329 emacs_event->event.key.modifiers = modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1330 emacs_event->event.key.keysym = keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1331 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1332 else /* Mouse press/release event */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1333 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1334 GdkEventButton *button_event = &gdk_event->button;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1335 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1336
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1337 emacs_event->event_type = (button_event->type == GDK_BUTTON_RELEASE) ?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1338 button_release_event : button_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1339
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1340 emacs_event->event.button.modifiers = modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1341 emacs_event->timestamp = button_event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1342 emacs_event->event.button.button = button_event->button;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1343 emacs_event->event.button.x = button_event->x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1344 emacs_event->event.button.y = button_event->y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1345 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1346 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1347 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1348 case GDK_KEY_RELEASE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1349 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1350 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1351 case GDK_MOTION_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1352 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1353 GdkEventMotion *ev = &gdk_event->motion;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1354 unsigned int modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1355 gint x,y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1356 GdkModifierType mask;
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 /* We use MOTION_HINT_MASK, so we will get only one motion
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1359 event until the next time we call gdk_window_get_pointer or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1360 the user clicks the mouse. So call gdk_window_get_pointer
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1361 now (meaning that the event will be in sync with the server
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1362 just before Fnext_event() returns). If the mouse is still
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1363 in motion, then the server will immediately generate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1364 exactly one more motion event, which will be on the queue
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1365 waiting for us next time around. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1366 gdk_window_get_pointer (ev->window, &x, &y, &mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1367
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1368 DEVICE_GTK_MOUSE_TIMESTAMP (d) = ev->time;
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 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1371 emacs_event->event_type = pointer_motion_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1372 emacs_event->timestamp = ev->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1373 emacs_event->event.motion.x = x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1374 emacs_event->event.motion.y = y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1375 if (mask & GDK_SHIFT_MASK) modifiers |= XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1376 if (mask & GDK_CONTROL_MASK) modifiers |= XEMACS_MOD_CONTROL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1377 if (mask & gd->MetaMask) modifiers |= XEMACS_MOD_META;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1378 if (mask & gd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1379 if (mask & gd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1380 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
1381 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
1382 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
1383 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
1384 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
1385 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
1386
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1387 /* Currently ignores Shift_Lock but probably shouldn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1388 (but it definitely should ignore Caps_Lock). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1389 emacs_event->event.motion.modifiers = modifiers;
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 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1392
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1393 default: /* it's a magic event */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1394 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1395 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1396 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1397 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1398 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1399
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1400 static const char *event_name (GdkEvent *);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1401
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1402 static gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1403 generic_event_handler (GtkWidget *widget, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1404 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1405 Lisp_Object emacs_event = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1406 if (!GTK_IS_XEMACS (widget))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1407 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1408 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
1409 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1410 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1411
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1412 emacs_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1413
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1414 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
1415 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1416 enqueue_gtk_dispatch_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1417 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1418 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1419 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1420 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1421 Fdeallocate_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1422 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1423 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1424 }
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 gint emacs_gtk_key_event_handler(GtkWidget *widget, GdkEventKey *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1427 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1428 return (generic_event_handler (widget, (GdkEvent *) event));
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1431 gint emacs_gtk_button_event_handler(GtkWidget *widget, GdkEventButton *event)
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 return (generic_event_handler (widget, (GdkEvent *) event));
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1436 gint emacs_gtk_motion_event_handler (GtkWidget *widget, GdkEventMotion *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 return (generic_event_handler (widget, (GdkEvent *) event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1439 }
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 gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1442 emacs_shell_event_handler (GtkWidget *wid /* unused */,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1443 GdkEvent *event,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1444 gpointer closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1445 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1446 struct frame *frame = (struct frame *) closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1447 Lisp_Object lisp_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1448 struct Lisp_Event *emacs_event = XEVENT (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1449 GdkEvent *gdk_event_copy = &emacs_event->event.magic.underlying_gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1450 struct device *d = XDEVICE (FRAME_DEVICE (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1451 gboolean ignore_p = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1452
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1453 set_last_server_timestamp (d, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1454
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1455 #define FROB(event_member) gdk_event_copy->event_member = event->event_member
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1456
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1457 switch (event->type)
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 case GDK_SELECTION_REQUEST:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1460 case GDK_SELECTION_CLEAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1461 case GDK_SELECTION_NOTIFY: FROB(selection); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1462 case GDK_PROPERTY_NOTIFY: FROB(property); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1463 case GDK_CLIENT_EVENT: FROB(client); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1464 case GDK_MAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1465 case GDK_UNMAP: FROB(any); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1466 case GDK_CONFIGURE: FROB(configure); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1467 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1468 case GDK_LEAVE_NOTIFY: FROB(crossing); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1469 case GDK_FOCUS_CHANGE: FROB(focus_change); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1470 case GDK_VISIBILITY_NOTIFY: FROB(visibility); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1471 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1472 ignore_p = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1473 /* 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
1474 *gdk_event_copy = *event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1475 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1476 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1477 #undef FROB
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 emacs_event->event_type = magic_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1480 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1481
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1482 if (ignore_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1483 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1484 stderr_out ("Ignoring event... (%s)\n", event_name (event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1485 Fdeallocate_event (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1486 return (FALSE);
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 else
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 enqueue_gtk_dispatch_event (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1491 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1492 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1493 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1494
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1495
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1496 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1497 /* input pending / C-g checking */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1498 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1499 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1500 gtk_check_for_quit_char (struct device *d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1501
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1502 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1503 check_for_tty_quit_char (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1504 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1505 SELECT_TYPE temp_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1506 int infd = DEVICE_INFD (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1507 struct console *con = XCONSOLE (DEVICE_CONSOLE (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1508 Emchar quit_char = CONSOLE_QUIT_CHAR (con);
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 FD_ZERO (&temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1511 FD_SET (infd, &temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1512
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1513 while (1)
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 Lisp_Object event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1516 Emchar the_char;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1517
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1518 if (!poll_fds_for_input (temp_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1519 return;
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 event = Fmake_event (Qnil, Qnil);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1522 if (!read_event_from_tty_or_stream_desc (XEVENT (event), con))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1523 /* EOF, or something ... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1524 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1525 /* #### bogus. quit-char should be allowed to be any sort
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1526 of event. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1527 the_char = event_to_character (XEVENT (event), 1, 0, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1528 if (the_char >= 0 && the_char == quit_char)
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 Vquit_flag = Qt;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1531 /* do not queue the C-g. See above. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1532 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1533 }
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 /* queue the read event to be read for real later. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1536 enqueue_gtk_dispatch_event (event);
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1539
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1540 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1541 emacs_gtk_quit_p (void)
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 Lisp_Object devcons, concons;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1544
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1545 CONSOLE_LOOP (concons)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1546 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1547 struct console *con = XCONSOLE (XCAR (concons));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1548 if (!con->input_enabled)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1549 continue;
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 CONSOLE_DEVICE_LOOP (devcons, con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1552 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1553 struct device *d;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1554 d = XDEVICE (XCAR (devcons));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1555
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1556 if (DEVICE_GTK_P (d))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1557 /* emacs may be exiting */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1558 gtk_check_for_quit_char (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1559 else if (DEVICE_TTY_P (d))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1560 check_for_tty_quit_char (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1561 }
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1564
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1565 #include <gdk/gdkx.h>
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 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1568 drain_gtk_queue (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1569
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 /* 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
1572 event queue to get empty, or the queue never gets drained. The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1573 situation is as follows. A process event gets signalled, we put
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1574 it on the queue, then we go into Fnext_event(), which calls
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1575 drain_gtk_queue(). But gtk_events_pending() will always return
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1576 TRUE if there are file-descriptor (aka our process) events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1577 pending. Using GDK_events_pending() only shows us windowing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1578 system events.
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 if (GDK_DISPLAY ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1581 while (gdk_events_pending ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1582 gtk_main_iteration ();
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1585 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1586 emacs_gtk_event_pending_p (int user_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1587 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1588 Lisp_Object event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1589 int tick_count_val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1590
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1591 /* 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
1592 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
1593 would return immediately without blocking).
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 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
1596 *user generated* events available (that is, whether there are keyboard
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1597 or mouse-click events ready to be read). This also implies that
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1598 emacs_Xt_next_event() would not block.
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 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
1601 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
1602 in a SIGIO world, since input causes an interrupt.
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1605 /* This function used to simply check whether there were any X
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1606 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
1607 X events using XCheckIfEvent(), looking for keystrokes and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1608 button events). That worked in the old cheesoid event loop,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1609 which didn't go through XtAppDispatchEvent(), but it doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1610 work any more -- X events may not result in anything. For
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1611 example, a button press in a blank part of the menubar appears
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1612 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
1613 button press that activates the menubar results in an Emacs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1614 event through the stop_next_event mechanism).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1615
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1616 The only accurate way of determining whether these X events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1617 translate into Emacs events is to go ahead and dispatch them
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1618 until there's something on the dispatch queue. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1619
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1620 /* See if there are any user events already on the queue. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1621 EVENT_CHAIN_LOOP (event, dispatch_event_queue)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1622 if (!user_p || command_event_p (event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1623 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1624
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1625 /* See if there's any TTY input available.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1626 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1627 if (poll_fds_for_input (tty_only_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1628 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1629
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1630 if (!user_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1631 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1632 /* 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
1633 pending, we know there will be an event so we're through. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1634 /* XtInputMask pending_value; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1635
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1636 /* Note that formerly we just checked the value of XtAppPending()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1637 to determine if there was file-desc input. This doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1638 work any more with the signal_event_pipe; XtAppPending()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1639 will says "yes" in this case but there isn't really any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1640 input. Another way of fixing this problem is for the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1641 signal_event_pipe to generate actual input in the form
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1642 of an identity eval event or something. (#### maybe this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1643 actually happens?) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1644
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1645 if (poll_fds_for_input (process_only_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1646 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1647
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1648 /* #### 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
1649 is a 'peek' for events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1650 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1651 pending_value = XtAppPending (Xt_app_con);
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 if (pending_value & XtIMTimer)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1654 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1655 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1656 }
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 /* XtAppPending() can be super-slow, esp. over a network connection.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1659 Quantify results have indicated that in some cases the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1660 call to detect_input_pending() completely dominates the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1661 running time of redisplay(). Fortunately, in a SIGIO world
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1662 we can more quickly determine whether there are any X events:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1663 if an event has happened since the last time we checked, then
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1664 a SIGIO will have happened. On a machine with broken SIGIO,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1665 we'll still be in an OK state -- the sigio_happened flag
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1666 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
1667 one second behind reality. (In general it's OK if we
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1668 erroneously report no input pending when input is actually
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1669 pending() -- preemption is just a bit less efficient, that's
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1670 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
1671 promised that `next-event' won't block but it actually will,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1672 and some action might get delayed until the next time you
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1673 hit a key.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1674 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1675
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1676 /* 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
1677 by using a temporary variable */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1678 tick_count_val = quit_check_signal_tick_count;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1679 if (last_quit_check_signal_tick_count != tick_count_val)
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 last_quit_check_signal_tick_count = tick_count_val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1682
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1683 /* We need to drain the entire queue now -- if we only
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1684 drain part of it, we may later on end up with events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1685 actually pending but detect_input_pending() returning
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1686 false because there wasn't another SIGIO. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1687
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1688 drain_gtk_queue ();
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 EVENT_CHAIN_LOOP (event, dispatch_event_queue)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1691 if (!user_p || command_event_p (event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1692 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1693 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1694
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1695 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1696 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1697
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1698
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1699 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1700 /* initialization */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1701 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1702
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1703 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1704 syms_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1705 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
1706 DEFSYMBOL (Qkey_mapping);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
1707 DEFSYMBOL (Qsans_modifiers);
462
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1710 void reinit_vars_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1711 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1712 gtk_event_stream = xnew (struct event_stream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1713 gtk_event_stream->event_pending_p = emacs_gtk_event_pending_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1714 gtk_event_stream->next_event_cb = emacs_gtk_next_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1715 gtk_event_stream->handle_magic_event_cb= emacs_gtk_handle_magic_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1716 gtk_event_stream->add_timeout_cb = emacs_gtk_add_timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1717 gtk_event_stream->remove_timeout_cb = emacs_gtk_remove_timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1718 gtk_event_stream->select_console_cb = emacs_gtk_select_console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1719 gtk_event_stream->unselect_console_cb = emacs_gtk_unselect_console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1720 gtk_event_stream->select_process_cb = emacs_gtk_select_process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1721 gtk_event_stream->unselect_process_cb = emacs_gtk_unselect_process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1722 gtk_event_stream->quit_p_cb = emacs_gtk_quit_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1723 gtk_event_stream->create_stream_pair_cb= emacs_gtk_create_stream_pair;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1724 gtk_event_stream->delete_stream_pair_cb= emacs_gtk_delete_stream_pair;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1725
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1726 the_GTK_timeout_blocktype = Blocktype_new (struct GTK_timeout_blocktype);
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 /* this function only makes safe calls */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1729 init_what_input_once ();
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 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1733 vars_of_event_gtk (void)
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 reinit_vars_of_event_gtk ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1736
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1737 dispatch_event_queue = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1738 staticpro (&dispatch_event_queue);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1739 dispatch_event_queue_tail = Qnil;
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 462
diff changeset
1740 staticpro (&dispatch_event_queue_tail);
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 DEFVAR_BOOL ("gtk-allow-sendevents", &gtk_allow_sendevents /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1743 *Non-nil means to allow synthetic events. Nil means they are ignored.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1744 Beware: allowing emacs to process SendEvents opens a big security hole.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1745 */ );
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1746 gtk_allow_sendevents = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1747
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1748 last_quit_check_signal_tick_count = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1749 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1750
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1751 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1752 init_event_gtk_late (void) /* called when already initialized */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1753 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1754 timeout_id_tick = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1755 pending_timeouts = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1756 completed_timeouts = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1757
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1758 event_stream = gtk_event_stream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1759
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1760 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1761 /* Shut GDK the hell up */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1762 gdk_error_trap_push ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1763 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1764
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1765 gdk_input_add (signal_event_pipe[0], GDK_INPUT_READ,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1766 (GdkInputFunction) gtk_what_callback, NULL);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1769 /* Bogus utility routines */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1770 static const char *event_name (GdkEvent *ev)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1771 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1772 return (gtk_event_name (ev->any.type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1773 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1774
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1775 /* 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
1776 generic code with this X specific CRAP! */
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 #include <gdk/gdkx.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1779 #include <X11/keysym.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1780 /* #### BILL!!! Fix this please! */
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
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 /* keymap handling */
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 /* X bogusly doesn't define the interpretations of any bits besides
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1788 ModControl, ModShift, and ModLock; so the Interclient Communication
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1789 Conventions Manual says that we have to bend over backwards to figure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1790 out what the other modifier bits mean. According to ICCCM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1791
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1792 - Any keycode which is assigned ModControl is a "control" key.
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 - 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
1795 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
1796 etc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1797
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1798 - Any keypress event which contains ModControl in its state should be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1799 interpreted as a "control" character.
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 - 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
1802 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
1803 should be interpreted as a "meta" character. Likewise for Super, Hyper,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1804 etc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1805
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1806 - 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
1807 bit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1808
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1809 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
1810 "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
1811 one of the modifier bits Mod1-Mod5.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1812
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1813 Unfortunately, many keyboards don't have Meta keys in their default
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1814 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
1815 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
1816 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
1817 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
1818
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1819 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
1820 checked.
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 Emacs detects keyboard configurations which violate the above rules, and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1823 prints an error message on the standard-error-output. (Perhaps it should
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1824 use a pop-up-window instead.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1825 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1826
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1827 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1828 gtk_reset_key_mapping (struct device *d)
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 Display *display = GDK_DISPLAY ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1831 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1832 XModifierKeymap *map = (XModifierKeymap *) xd->x_keysym_map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1833 KeySym *keysym, *keysym_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1834 Lisp_Object hashtable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1835 int key_code_count, keysyms_per_code;
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 if (map)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1838 XFree ((char *) map);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1839 XDisplayKeycodes (display,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1840 &xd->x_keysym_map_min_code,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1841 &xd->x_keysym_map_max_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1842 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
1843 map = (XModifierKeymap *)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1844 XGetKeyboardMapping (display, xd->x_keysym_map_min_code, key_code_count,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1845 &xd->x_keysym_map_keysyms_per_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1846
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1847 xd->x_keysym_map = (void *)map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1848 hashtable = xd->x_keysym_map_hashtable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1849 if (HASH_TABLEP (hashtable))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1850 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1851 Fclrhash (hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1852 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1853 else
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 xd->x_keysym_map_hashtable = hashtable =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1856 make_lisp_hash_table (128, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1859 for (keysym = (KeySym *) map,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1860 keysyms_per_code = xd->x_keysym_map_keysyms_per_code,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1861 keysym_end = keysym + (key_code_count * keysyms_per_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1862 keysym < keysym_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1863 keysym += keysyms_per_code)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1864 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1865 int j;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1866
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1867 if (keysym[0] == NoSymbol)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1868 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1869
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1870 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1871 Extbyte *name = XKeysymToString (keysym[0]);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1872 Lisp_Object sym = gtk_keysym_to_emacs_keysym (keysym[0], 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1873 if (name)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1874 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1875 Fputhash (build_ext_string (name, Qnative), Qsans_modifiers,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1876 hashtable);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1877 Fputhash (sym, Qsans_modifiers, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1878 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1879 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1880
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1881 for (j = 1; j < keysyms_per_code; j++)
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 if (keysym[j] != keysym[0] &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1884 keysym[j] != NoSymbol)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1885 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1886 Extbyte *name = XKeysymToString (keysym[j]);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1887 Lisp_Object sym = gtk_keysym_to_emacs_keysym (keysym[j], 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1888 if (name && NILP (Fgethash (sym, hashtable, Qnil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1889 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1890 Fputhash (build_ext_string (name, Qnative), Qt, hashtable);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1891 Fputhash (sym, Qt, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1892 }
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1896 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1897
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1898 static const char *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1899 index_to_name (int indice)
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 switch (indice)
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 case ShiftMapIndex: return "ModShift";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1904 case LockMapIndex: return "ModLock";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1905 case ControlMapIndex: return "ModControl";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1906 case Mod1MapIndex: return "Mod1";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1907 case Mod2MapIndex: return "Mod2";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1908 case Mod3MapIndex: return "Mod3";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1909 case Mod4MapIndex: return "Mod4";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1910 case Mod5MapIndex: return "Mod5";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1911 default: return "???";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1912 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1913 }
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 /* Boy, I really wish C had local functions... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1916 struct c_doesnt_have_closures /* #### not yet used */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1917 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1918 int warned_about_overlapping_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1919 int warned_about_predefined_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1920 int warned_about_duplicate_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1921 int meta_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1922 int hyper_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1923 int super_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1924 int alt_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1925 int mode_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1926 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1927
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1928 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1929 gtk_reset_modifier_mapping (struct device *d)
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 Display *display = GDK_DISPLAY ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1932 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1933 int modifier_index, modifier_key, column, mkpm;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1934 int warned_about_overlapping_modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1935 /* int warned_about_predefined_modifiers = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1936 /* int warned_about_duplicate_modifiers = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1937 int meta_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1938 int hyper_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1939 int super_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1940 int alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1941 int mode_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1942 XModifierKeymap *map = (XModifierKeymap *) xd->x_modifier_keymap;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1943
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1944 xd->lock_interpretation = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1945
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1946 if (map)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1947 XFreeModifiermap (map);
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 gtk_reset_key_mapping (d);
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 xd->x_modifier_keymap = map = XGetModifierMapping (display);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1952
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1953 /* Boy, I really wish C had local functions...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1954 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1955
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1956 /* 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
1957 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
1958 it, but the backslash does). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1959
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1960 #define store_modifier(name,old) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1961 old = modifier_index;
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 mkpm = map->max_keypermod;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1964 for (modifier_index = 0; modifier_index < 8; modifier_index++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1965 for (modifier_key = 0; modifier_key < mkpm; modifier_key++) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1966 KeySym last_sym = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1967 for (column = 0; column < 4; column += 2) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1968 KeyCode code = map->modifiermap[modifier_index * mkpm
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1969 + modifier_key];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1970 KeySym sym = (code ? XKeycodeToKeysym (display, code, column) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1971 if (sym == last_sym) continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1972 last_sym = sym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1973 switch (sym) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1974 case XK_Mode_switch:store_modifier ("Mode_switch", mode_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1975 case XK_Meta_L: store_modifier ("Meta_L", meta_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1976 case XK_Meta_R: store_modifier ("Meta_R", meta_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1977 case XK_Super_L: store_modifier ("Super_L", super_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1978 case XK_Super_R: store_modifier ("Super_R", super_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1979 case XK_Hyper_L: store_modifier ("Hyper_L", hyper_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1980 case XK_Hyper_R: store_modifier ("Hyper_R", hyper_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1981 case XK_Alt_L: store_modifier ("Alt_L", alt_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1982 case XK_Alt_R: store_modifier ("Alt_R", alt_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1983 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1984 case XK_Control_L: check_modifier ("Control_L", ControlMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1985 case XK_Control_R: check_modifier ("Control_R", ControlMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1986 case XK_Shift_L: check_modifier ("Shift_L", ShiftMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1987 case XK_Shift_R: check_modifier ("Shift_R", ShiftMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1988 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1989 case XK_Shift_Lock: /* check_modifier ("Shift_Lock", LockMask); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1990 xd->lock_interpretation = XK_Shift_Lock; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1991 case XK_Caps_Lock: /* check_modifier ("Caps_Lock", LockMask); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1992 xd->lock_interpretation = XK_Caps_Lock; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1993
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1994 /* 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
1995 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
1996 assigns modifier bits to a couple of random function keys for
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1997 no reason that I can discern, so printing a warning here would
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1998 be annoying. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1999 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2000 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2001 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2002 #undef store_modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2003 #undef check_modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2004 #undef modwarn
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2005 #undef modbarf
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2006
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2007 /* 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
2008 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
2009 is not disturbed and remains an Alt key. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2010 if (! meta_bit && alt_bit)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2011 meta_bit = alt_bit, alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2012
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2013 /* mode_bit overrides everything, since it's processed down inside of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2014 XLookupString() instead of by us. If Meta and Mode_switch both
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2015 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
2016 interpret that bit as Meta, because we can't make XLookupString()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2017 not interpret it as Mode_switch; and interpreting it as both would
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2018 be totally wrong. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2019 if (mode_bit)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2020 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2021 const char *warn = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2022 if (mode_bit == meta_bit) warn = "Meta", meta_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2023 else if (mode_bit == hyper_bit) warn = "Hyper", hyper_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2024 else if (mode_bit == super_bit) warn = "Super", super_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2025 else if (mode_bit == alt_bit) warn = "Alt", alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2026 if (warn)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2027 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2028 warn_when_safe
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2029 (Qkey_mapping, Qwarning,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2030 "XEmacs: %s is being used for both Mode_switch and %s.",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2031 index_to_name (mode_bit), warn),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2032 warned_about_overlapping_modifiers = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2033 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2034 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2035 #undef index_to_name
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 xd->MetaMask = (meta_bit ? (1 << meta_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2038 xd->HyperMask = (hyper_bit ? (1 << hyper_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2039 xd->SuperMask = (super_bit ? (1 << super_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2040 xd->AltMask = (alt_bit ? (1 << alt_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2041 xd->ModeMask = (mode_bit ? (1 << mode_bit) : 0); /* unused */
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2044
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2045 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2046 gtk_init_modifier_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2047 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2048 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2049 gd->x_keysym_map_hashtable = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2050 gd->x_keysym_map = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2051 gd->x_modifier_keymap = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2052 gtk_reset_modifier_mapping (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2053 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2054
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2055 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2056 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2057 gtk_key_is_modifier_p (KeyCode keycode, struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2058 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2059 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2060 KeySym *syms;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2061 KeySym *map = (KeySym *) xd->x_keysym_map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2062 int i;
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 if (keycode < xd->x_keysym_map_min_code ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2065 keycode > xd->x_keysym_map_max_code)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2066 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2067
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2068 syms = &map [(keycode - xd->x_keysym_map_min_code) *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2069 xd->x_keysym_map_keysyms_per_code];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2070 for (i = 0; i < xd->x_keysym_map_keysyms_per_code; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2071 if (IsModifierKey (syms [i]) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2072 syms [i] == XK_Mode_switch) /* why doesn't IsModifierKey count this? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2073 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2074 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2075 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2076 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2077
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2078 struct _quit_predicate_closure {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2079 struct device *device;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2080 Bool *critical;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2081 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2082
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2083 static Bool
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2084 quit_char_predicate (Display *display, XEvent *event, XPointer data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2085 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2086 struct _quit_predicate_closure *cl = (struct _quit_predicate_closure *) data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2087 struct device *d = cl->device;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2088 struct frame *f = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2089 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2090 char c, quit_char;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2091 Bool *critical = cl->critical;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2092 Lisp_Object keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2093 GdkWindow *window = gdk_window_lookup (event->xany.window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2094 guint32 keycode = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2095 GdkEventKey gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2096
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2097 if (window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2098 f = gtk_any_window_to_frame (d, window);
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 (critical)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2101 *critical = False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2102
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2103 if ((event->type != KeyPress) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2104 (! window) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2105 (! f) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2106 (event->xkey.state
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2107 & (gd->MetaMask | gd->HyperMask | gd->SuperMask | gd->AltMask)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2108 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2109 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2110 }
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 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2113 char dummy[256];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2114 XLookupString (&(event->xkey), dummy, 200, (KeySym *)&keycode, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2115 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2116
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2117 memset (&gdk_event, 0, sizeof (gdk_event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2118 gdk_event.type = GDK_KEY_PRESS;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2119 gdk_event.window = window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2120 gdk_event.keyval = keycode;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2121 gdk_event.state = event->xkey.state;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2122
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2123 /* This duplicates some code that exists elsewhere, but it's relatively
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2124 fast and doesn't cons. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2125 keysym = gtk_to_emacs_keysym (d, &gdk_event, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2126 if (NILP (keysym)) return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2127 if (CHAR_OR_CHAR_INTP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2128 c = XCHAR_OR_CHAR_INT (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2129 /* Highly doubtful that these are the quit character, but... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2130 else if (EQ (keysym, QKbackspace)) c = '\b';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2131 else if (EQ (keysym, QKtab)) c = '\t';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2132 else if (EQ (keysym, QKlinefeed)) c = '\n';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2133 else if (EQ (keysym, QKreturn)) c = '\r';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2134 else if (EQ (keysym, QKescape)) c = 27;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2135 else if (EQ (keysym, QKspace)) c = ' ';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2136 else if (EQ (keysym, QKdelete)) c = 127;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2137 else return 0;
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->xkey.state & gd->MetaMask) c |= 0x80;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2140 if ((event->xkey.state & ControlMask) && !(c >= 'A' && c <= 'Z'))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2141 c &= 0x1F; /* unshifted control characters */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2142 quit_char = CONSOLE_QUIT_CHAR (XCONSOLE (DEVICE_CONSOLE (d)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2143
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2144 if (c == quit_char)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2145 return True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2146 /* 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
2147 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
2148 won't cause ^G to act differently than before. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2149 if (event->xkey.state & ControlMask) c &= 0x1F;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2150 if (c == quit_char)
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 if (critical) *critical = True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2153 return True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2154 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2155 return False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2156 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2157
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2158 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2159 gtk_check_for_quit_char (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2160 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2161 XEvent event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2162 int queued;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2163 Bool critical_quit = False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2164 struct _quit_predicate_closure closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2165
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2166 XEventsQueued (GDK_DISPLAY (), QueuedAfterReading);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2167
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2168 closure.device = d;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2169 closure.critical = &critical_quit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2170
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2171 queued = XCheckIfEvent (GDK_DISPLAY (), &event, quit_char_predicate, (char *) &closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2172
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2173 if (queued)
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 Vquit_flag = (critical_quit ? Qcritical : Qt);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2176 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2177 }