annotate src/event-gtk.c @ 5090:0ca81354c4c7

Further frame-geometry cleanups -------------------- ChangeLog entries follow: -------------------- man/ChangeLog addition: 2010-03-03 Ben Wing <ben@xemacs.org> * internals/internals.texi (Intro to Window and Frame Geometry): * internals/internals.texi (The Paned Area): * internals/internals.texi (The Displayable Area): Update to make note of e.g. the fact that the bottom gutter is actually above the minibuffer. src/ChangeLog addition: 2010-03-03 Ben Wing <ben@xemacs.org> * emacs.c: * emacs.c (assert_equal_failed): * lisp.h: * lisp.h (assert_equal): New fun assert_equal, asserting that two values == each other, and printing out both values upon failure. * frame-gtk.c (gtk_initialize_frame_size): * frame-impl.h: * frame-impl.h (FRAME_TOP_INTERNAL_BORDER_START): * frame-impl.h (FRAME_BOTTOM_INTERNAL_BORDER_START): * frame-impl.h (FRAME_LEFT_INTERNAL_BORDER_START): * frame-impl.h (FRAME_PANED_TOP_EDGE): * frame-impl.h (FRAME_NONPANED_SIZE): * frame-x.c (x_initialize_frame_size): * frame.c: * gutter.c (get_gutter_coords): * gutter.c (calculate_gutter_size): * gutter.h: * gutter.h (WINDOW_REAL_TOP_GUTTER_BOUNDS): * gutter.h (FRAME_TOP_GUTTER_BOUNDS): * input-method-xlib.c: * input-method-xlib.c (XIM_SetGeometry): * redisplay-output.c (clear_left_border): * redisplay-output.c (clear_right_border): * redisplay-output.c (redisplay_output_pixmap): * redisplay-output.c (redisplay_clear_region): * redisplay-output.c (redisplay_clear_top_of_window): * redisplay-output.c (redisplay_clear_to_window_end): * redisplay-xlike-inc.c (XLIKE_clear_frame): * redisplay.c: * redisplay.c (UPDATE_CACHE_RETURN): * redisplay.c (pixel_to_glyph_translation): * toolbar.c (update_frame_toolbars_geometry): * window.c (Fwindow_pixel_edges): Get rid of some redundant macros. Consistently use the FRAME_TOP_*_START, FRAME_RIGHT_*_END, etc. format. Rename FRAME_*_BORDER_* to FRAME_*_INTERNAL_BORDER_*. Comment out FRAME_BOTTOM_* for gutters and the paned area due to the uncertainty over where the paned area actually begins. (Eventually we should probably move the gutters outside the minibuffer so that the paned area is contiguous.) Use FRAME_PANED_* more often in the code to make things clearer. Update the diagram to show that the bottom gutter is inside the minibuffer (!) and that there are "junk boxes" when you have left and/or right gutters (dead boxes that are mistakenly left uncleared, unlike the corresponding scrollbar dead boxes). Update the text appropriately to cover the bottom gutter position, etc. Rewrite gutter-geometry code to use the FRAME_*_GUTTER_* in place of equivalent expressions referencing other frame elements, to make the code more portable in case we move around the gutter location. Cleanup FRAME_*_GUTTER_BOUNDS() in gutter.h. Add some #### GEOM! comments where I think code is incorrect -- typically, it wasn't fixed up properly when the gutter was added. Some cosmetic changes.
author Ben Wing <ben@xemacs.org>
date Wed, 03 Mar 2010 05:07:47 -0600
parents 16112448d484
children a48ef26d87ee 8b2f75cecb89
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.
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
4 Copyright (C) 1996, 2001, 2002, 2003 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 "blocktype.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
32 #include "buffer.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
33 #include "commands.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
34 #include "console.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
35 #include "device-impl.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
36 #include "elhash.h"
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
37 #include "events.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
38 #include "file-coding.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
39 #include "frame-impl.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
40 #include "lstream.h"
462
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"
809
285f13b079f3 [xemacs-hg @ 2002-04-07 16:01:30 by wmperry]
wmperry
parents: 800
diff changeset
43 #include "window.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
44
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
45 #include "console-tty.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
46
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
47 #include "console-gtk-impl.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
48 #include "objects-gtk.h"
462
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 "gtk-xemacs.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
51
4908
b3ce27ca7647 various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
52 #include "sysgdkx.h"
b3ce27ca7647 various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
53
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
54 #include "systime.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
55 #include "sysproc.h" /* for MAXDESC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
56
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
57 #ifdef HAVE_DRAGNDROP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
58 #include "dragdrop.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
59 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
60
2081
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
61 #ifdef HAVE_MENUBARS
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
62 # include "menubar.h"
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
63 #endif
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
64
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
65 static struct event_stream *gtk_event_stream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
66
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
67 #ifdef WIN32_ANY
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
68 extern int mswindows_is_blocking;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
69 #endif
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
70
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
71 /* Do we accept events sent by other clients? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
72 int gtk_allow_sendevents;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
73
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
74 static int process_events_occurred;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
75 static int tty_events_occurred;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
76
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
77 /* Mask of bits indicating the descriptors that we wait for input on */
1415
d47e87058e8f [xemacs-hg @ 2003-04-15 17:01:56 by stephent]
stephent
parents: 1292
diff changeset
78 extern SELECT_TYPE input_wait_mask, non_fake_input_wait_mask;
d47e87058e8f [xemacs-hg @ 2003-04-15 17:01:56 by stephent]
stephent
parents: 1292
diff changeset
79 extern SELECT_TYPE process_only_mask, tty_only_mask;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
80
2054
91d4c8c65a0f [xemacs-hg @ 2004-05-02 04:06:51 by malcolmp]
malcolmp
parents: 1726
diff changeset
81 static Lisp_Object gtk_keysym_to_emacs_keysym (guint keysym, int simple_p);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
82 void debug_process_finalization (struct Lisp_Process *p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
83 gboolean emacs_gtk_event_handler (GtkWidget *wid /* unused */,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
84 GdkEvent *event,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
85 gpointer closure /* unused */);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
86
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
87 static int last_quit_check_signal_tick_count;
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 Lisp_Object Qsans_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90
2489
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
91 /*
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
92 * Identify if the keysym is a modifier. This implementation mirrors x.org's
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
93 * IsModifierKey(), but for GDK keysyms.
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
94 */
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
95 #ifdef GDK_ISO_Lock
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
96 #define IS_MODIFIER_KEY(keysym) \
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
97 ((((keysym) >= GDK_Shift_L) && ((keysym) <= GDK_Hyper_R)) \
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
98 || (((keysym) >= GDK_ISO_Lock) && \
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
99 ((keysym) <= GDK_ISO_Last_Group_Lock)) \
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
100 || ((keysym) == GDK_Mode_switch) \
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
101 || ((keysym) == GDK_Num_Lock))
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
102 #else
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103 #define IS_MODIFIER_KEY(keysym) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 ((((keysym) >= GDK_Shift_L) && ((keysym) <= GDK_Hyper_R)) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
105 || ((keysym) == GDK_Mode_switch) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
106 || ((keysym) == GDK_Num_Lock))
2489
f81997b69560 [xemacs-hg @ 2005-01-19 23:10:16 by malcolmp]
malcolmp
parents: 2367
diff changeset
107 #endif
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
109 #define THIS_IS_GTK
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
110 #include "event-xlike-inc.c"
462
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 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 /* magic-event handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 handle_focus_event_1 (struct frame *f, int in_p)
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 /* 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
120 be in an accept-process-output, sleep-for, or sit-for. So
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 we enqueue it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 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
124 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
125 select-frame stuff until after the sit-for.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128 if (in_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 GTK_WIDGET_SET_FLAGS (FRAME_GTK_TEXT_WIDGET (f), GTK_HAS_FOCUS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134 GTK_WIDGET_UNSET_FLAGS (FRAME_GTK_TEXT_WIDGET (f), GTK_HAS_FOCUS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 gtk_widget_grab_focus (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137 gtk_widget_draw_focus (FRAME_GTK_TEXT_WIDGET (f));
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 Lisp_Object frm;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 Lisp_Object conser;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 struct gcpro gcpro1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
144 frm = wrap_frame (f);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145 conser = Fcons (frm, Fcons (FRAME_DEVICE (f), in_p ? Qt : Qnil));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 GCPRO1 (conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148 emacs_handle_focus_change_preliminary (conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149 enqueue_magic_eval_event (emacs_handle_focus_change_final,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150 conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 /* both GDK_MAP and GDK_VISIBILITY_NOTIFY can cause this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156 JV is_visible has the same semantics as f->visible*/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 change_frame_visibility (struct frame *f, int is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
160 Lisp_Object frame = wrap_frame (f);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 if (!FRAME_VISIBLE_P (f) && is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165 FRAME_VISIBLE_P (f) = is_visible;
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
166 /* [[ This improves the double flicker when uniconifying a frame
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167 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
168 while the frame was iconified. To fix it further requires
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
169 the good 'ol double redisplay structure. ]] -- comment is
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
170 invalid, obviously predates 19.12, when the double redisplay
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
171 structure (i.e. current + desired) was put back in. --ben */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173 va_run_hook_with_args (Qmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 else if (FRAME_VISIBLE_P (f) && !is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 FRAME_VISIBLE_P (f) = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178 va_run_hook_with_args (Qunmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 else if (FRAME_VISIBLE_P (f) * is_visible < 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 FRAME_VISIBLE_P(f) = - FRAME_VISIBLE_P(f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 if (FRAME_REPAINT_P (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 va_run_hook_with_args (Qmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
190 handle_map_event (struct frame *f, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
192 Lisp_Object frame = wrap_frame (f);
462
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 if (event->any.type == GDK_MAP)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196 FRAME_GTK_TOTALLY_VISIBLE_P (f) = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 change_frame_visibility (f, 1);
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 else
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 FRAME_GTK_TOTALLY_VISIBLE_P (f) = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202 change_frame_visibility (f, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 /* Calling Fframe_iconified_p is the only way we have to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 correctly update FRAME_ICONIFIED_P */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205 Fframe_iconified_p (frame);
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 }
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 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210 handle_client_message (struct frame *f, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212 /* 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
213 handle that directly in frame-gtk.c */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 if (event->client.message_type == gdk_atom_intern ("WM_PROTOCOLS", 0) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216 (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
217 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 handle_focus_event_1 (f, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219 }
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222 static void
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
223 emacs_gtk_format_magic_event (Lisp_Event *emacs_event, Lisp_Object pstream)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
224 {
789
06b73d289047 [xemacs-hg @ 2002-03-21 15:13:41 by wmperry]
wmperry
parents: 788
diff changeset
225 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (emacs_event));
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
226 if (CONSOLE_GTK_P (XCONSOLE (console)))
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
227 write_cistring
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 809
diff changeset
228 (pstream,
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
229 gtk_event_name (EVENT_MAGIC_GDK_EVENT (emacs_event).type));
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
230 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
231
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
232 static int
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
233 emacs_gtk_compare_magic_event (Lisp_Event *e1, Lisp_Event *e2)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
234 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
235 if (CONSOLE_GTK_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e1)))) &&
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
236 CONSOLE_GTK_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e2)))))
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
237 return (!memcmp (&EVENT_MAGIC_GDK_EVENT (e1),
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
238 &EVENT_MAGIC_GDK_EVENT (e2),
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
239 sizeof (GdkEvent)));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
240 if (CONSOLE_GTK_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e1)))) ||
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
241 CONSOLE_GTK_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e2)))))
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
242 return 0;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
243 return 1;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
244 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
245
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
246 static Hashcode
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
247 emacs_gtk_hash_magic_event (Lisp_Event *e)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
248 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
249 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (e));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
250 if (CONSOLE_GTK_P (XCONSOLE (console)))
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
251 return memory_hash (&EVENT_MAGIC_GDK_EVENT (e),
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
252 sizeof (GdkEvent));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
253 return 0;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
254 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
255
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
256 static void
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257 emacs_gtk_handle_magic_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259 /* This function can GC */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
260 GdkEvent *event = &EVENT_MAGIC_GDK_EVENT (emacs_event);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261 struct frame *f = XFRAME (EVENT_CHANNEL (emacs_event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263 if (!FRAME_LIVE_P (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 switch (event->any.type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268 case GDK_CLIENT_EVENT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 handle_client_message (f, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272 case GDK_FOCUS_CHANGE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
273 handle_focus_event_1 (f, event->focus_change.in);
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 case GDK_MAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277 case GDK_UNMAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 handle_map_event (f, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 break;
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 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 if (event->crossing.detail != GDK_NOTIFY_INFERIOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
284 Lisp_Object frame = wrap_frame (f);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
285
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 /* FRAME_X_MOUSE_P (f) = 1; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287 va_run_hook_with_args (Qmouse_enter_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
290
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291 case GDK_LEAVE_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
292 if (event->crossing.detail != GDK_NOTIFY_INFERIOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
293 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
294 Lisp_Object frame = wrap_frame (f);
462
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 /* FRAME_X_MOUSE_P (f) = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297 va_run_hook_with_args (Qmouse_leave_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
301 case GDK_VISIBILITY_NOTIFY: /* window visiblity has changed */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
302 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
303 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
304 FRAME_GTK_TOTALLY_VISIBLE_P (f) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
305 (event->visibility.state == GDK_VISIBILITY_UNOBSCURED);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
306 /* Note that the fvwm pager only sends VisibilityNotify when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
307 changing pages. Is this all we need to do ? JV */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
308 /* Nope. We must at least trigger a redisplay here.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
309 Since this case seems similar to MapNotify, I've
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
310 factored out some code to change_frame_visibility().
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 This triggers the necessary redisplay and runs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312 (un)map-frame-hook. - dkindred@cs.cmu.edu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313 /* Changed it again to support the tristate visibility flag */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 change_frame_visibility (f, (event->visibility.state
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 != GDK_VISIBILITY_FULLY_OBSCURED) ? 1 : -1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
321 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
323
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
325 /* Gtk to Emacs event conversion */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
326 /************************************************************************/
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 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
329 keysym_obeys_caps_lock_p (guint sym, struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
330 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
331 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
332 /* 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
333 characters, where "alphabetic" means something more than simply A-Z.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
334 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
335 But if shift-lock is down, then it does. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336 if (gd->lock_interpretation == GDK_Shift_Lock)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
337 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
338
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
339 return
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340 ((sym >= GDK_A) && (sym <= GDK_Z)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 ((sym >= GDK_a) && (sym <= GDK_z)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 ((sym >= GDK_Agrave) && (sym <= GDK_Odiaeresis)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343 ((sym >= GDK_agrave) && (sym <= GDK_odiaeresis)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 ((sym >= GDK_Ooblique) && (sym <= GDK_Thorn)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
345 ((sym >= GDK_oslash) && (sym <= GDK_thorn));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
349 set_last_server_timestamp (struct device *d, GdkEvent *gdk_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
350 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351 guint32 t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352 switch (gdk_event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
354 case GDK_KEY_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355 case GDK_KEY_RELEASE: t = gdk_event->key.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
356 case GDK_BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
357 case GDK_2BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
358 case GDK_3BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
359 case GDK_BUTTON_RELEASE: t = gdk_event->button.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
361 case GDK_LEAVE_NOTIFY: t = gdk_event->crossing.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
362 case GDK_MOTION_NOTIFY: t = gdk_event->motion.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363 case GDK_PROPERTY_NOTIFY: t = gdk_event->property.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
364 case GDK_SELECTION_CLEAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
365 case GDK_SELECTION_REQUEST:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366 case GDK_SELECTION_NOTIFY: t = gdk_event->selection.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 default: return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 DEVICE_GTK_LAST_SERVER_TIMESTAMP (d) = t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
372 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 gtk_keysym_to_emacs_keysym (guint keysym, int simple_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
374 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
375 char *name;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
376 if (keysym >= GDK_exclam && keysym <= GDK_asciitilde)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377 /* We must assume that the X keysym numbers for the ASCII graphic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378 characters are the same as their ASCII codes. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 return make_char (keysym);
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 switch (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 /* These would be handled correctly by the default case, but by
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 special-casing them here we don't garbage a string or call
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
385 intern(). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 case GDK_BackSpace: return QKbackspace;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
387 case GDK_Tab: return QKtab;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
388 case GDK_Linefeed: return QKlinefeed;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
389 case GDK_Return: return QKreturn;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390 case GDK_Escape: return QKescape;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391 case GDK_space: return QKspace;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392 case GDK_Delete: return QKdelete;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 case 0: return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
394 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
395 if (simple_p) return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396 /* !!#### not Mule-ized */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
397 name = gdk_keyval_name (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 if (!name || !name[0])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
399 /* This happens if there is a mismatch between the Xlib of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
400 XEmacs and the Xlib of the X server...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
401
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
402 Let's hard-code in some knowledge of common keysyms introduced
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
403 in recent X11 releases. Snarfed from X11/keysymdef.h
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 Probably we should add some stuff here for X11R6. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
406 switch (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
407 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
408 case 0xFF95: return KEYSYM ("kp-home");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
409 case 0xFF96: return KEYSYM ("kp-left");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 case 0xFF97: return KEYSYM ("kp-up");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411 case 0xFF98: return KEYSYM ("kp-right");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412 case 0xFF99: return KEYSYM ("kp-down");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413 case 0xFF9A: return KEYSYM ("kp-prior");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414 case 0xFF9B: return KEYSYM ("kp-next");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
415 case 0xFF9C: return KEYSYM ("kp-end");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
416 case 0xFF9D: return KEYSYM ("kp-begin");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
417 case 0xFF9E: return KEYSYM ("kp-insert");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
418 case 0xFF9F: return KEYSYM ("kp-delete");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
419
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 case 0x1005FF10: return KEYSYM ("SunF36"); /* labeled F11 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
421 case 0x1005FF11: return KEYSYM ("SunF37"); /* labeled F12 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
422 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424 char buf [64];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425 sprintf (buf, "unknown-keysym-0x%X", (int) keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
426 return KEYSYM (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
427 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
428 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
429 /* If it's got a one-character name, that's good enough. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430 if (!name[1])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
431 return make_char (name[0]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
432
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
433 /* If it's in the "Keyboard" character set, downcase it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
434 The case of those keysyms is too totally random for us to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
435 force anyone to remember them.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
436 The case of the other character sets is significant, however.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
437 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
438 if ((((unsigned int) keysym) & (~0x1FF)) == ((unsigned int) 0xFE00))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
439 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440 char buf [255];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
441 char *s1, *s2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
442 for (s1 = name, s2 = buf; *s1; s1++, s2++) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
443 if (*s1 == '_') {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 *s2 = '-';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445 } else {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
446 *s2 = tolower (* (unsigned char *) s1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
447 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
449 *s2 = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
450 return KEYSYM (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
451 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 return KEYSYM (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
453 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
454 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
455
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
456 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
457 gtk_to_emacs_keysym (struct device *d, GdkEventKey *event, int simple_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
458 /* simple_p means don't try too hard (ASCII only) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
459 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460 if (event->length != 1)
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 /* Generate multiple emacs events */
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
463 Ichar ch;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
464 Lisp_Object instream, fb_instream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
465 Lstream *istr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
466 struct gcpro gcpro1, gcpro2;
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 fb_instream =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
469 make_fixed_buffer_input_stream ((unsigned char *) event->string, event->length);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
471 /* #### Use get_coding_system_for_text_file
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
472 (Vcomposed_input_coding_system, 0) */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
473 instream =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
474 make_coding_input_stream (XLSTREAM (fb_instream),
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
475 Qundecided, CODING_DECODE, 0);
462
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 istr = XLSTREAM (instream);
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 GCPRO2 (instream, fb_instream);
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
480 while ((ch = Lstream_get_ichar (istr)) != EOF)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
481 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
483 Lisp_Event *ev = XEVENT (emacs_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
484 ev->channel = DEVICE_CONSOLE (d);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485 ev->timestamp = event->time;
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
486 XSET_EVENT_TYPE (emacs_event, key_press_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
487 XSET_EVENT_KEY_MODIFIERS (emacs_event, 0);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
488 XSET_EVENT_KEY_KEYSYM (emacs_event, make_char (ch));
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
489 enqueue_dispatch_event (emacs_event);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
490 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 Lstream_close (istr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
492 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
493 Lstream_delete (istr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
494 Lstream_delete (XLSTREAM (fb_instream));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 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
496 return (Qnil);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
497 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
498 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
499 else
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
500 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501 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
502 return (Qnil);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
503 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
504 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 }
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
508 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
509 /* timeout events */
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
512 static int timeout_id_tick;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
513
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
514 struct GTK_timeout
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
515 {
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
516 int id;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
517 guint timeout_id;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
518 struct GTK_timeout *next;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
519 } *pending_timeouts, *completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
520
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
521 struct GTK_timeout_blocktype
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
522 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
523 Blocktype_declare (struct GTK_timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
524 } *the_GTK_timeout_blocktype;
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 /* called by the gtk main loop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
527 static gint
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
528 gtk_timeout_callback (gpointer closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
529 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
530 struct GTK_timeout *timeout = (struct GTK_timeout *) closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
531 struct GTK_timeout *t2 = pending_timeouts;
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 /* Remove this one from the list of pending timeouts */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
534 if (t2 == timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
535 pending_timeouts = pending_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
536 else
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 while (t2->next && t2->next != timeout) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
539 assert (t2->next);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
540 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
541 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
542 /* Add this one to the list of completed timeouts */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
543 timeout->next = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
544 completed_timeouts = timeout;
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
545 return FALSE;
462
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
548 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
549 emacs_gtk_add_timeout (EMACS_TIME thyme)
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 struct GTK_timeout *timeout = Blocktype_alloc (the_GTK_timeout_blocktype);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
552 EMACS_TIME current_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
553 int milliseconds;
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 timeout->id = timeout_id_tick++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
556 timeout->next = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
557 pending_timeouts = timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
558 EMACS_GET_TIME (current_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
559 EMACS_SUB_TIME (thyme, thyme, current_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
560 milliseconds = EMACS_SECS (thyme) * 1000 +
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
561 EMACS_USECS (thyme) / 1000;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
562 if (milliseconds < 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
563 milliseconds = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
564 timeout->timeout_id = gtk_timeout_add (milliseconds,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
565 gtk_timeout_callback,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
566 (gpointer) timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
567 return timeout->id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
568 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
569
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
570 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
571 emacs_gtk_remove_timeout (int id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
572 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
573 struct GTK_timeout *timeout, *t2;
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 timeout = NULL;
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 /* 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
578 if (pending_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
579 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
580 if (id == pending_timeouts->id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
581 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
582 timeout = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
583 pending_timeouts = pending_timeouts->next;
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 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
586 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
587 t2 = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
588 while (t2->next && t2->next->id != id) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
589 if ( t2->next) /*found it */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
590 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
591 timeout = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
592 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
593 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
594 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
595 /* if it was pending, we have removed it from the list */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
596 if (timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
597 gtk_timeout_remove (timeout->timeout_id);
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 /* 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
601 into an Emacs event yet */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
602 if (!timeout && completed_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
603 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
604 /* Code duplication! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
605 if (id == completed_timeouts->id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
606 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
607 timeout = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
608 completed_timeouts = completed_timeouts->next;
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 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
611 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
612 t2 = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
613 while (t2->next && t2->next->id != id) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
614 if ( t2->next) /*found it */
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 timeout = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
617 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
618 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
619 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
620 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
621
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
622 /* If we found the thing on the lists of timeouts,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
623 and removed it, deallocate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
624 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
625 if (timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
626 Blocktype_free (the_GTK_timeout_blocktype, timeout);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
629 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
630 gtk_timeout_to_emacs_event (struct Lisp_Event *emacs_event)
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 struct GTK_timeout *timeout = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
633 assert (timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
634 completed_timeouts = completed_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
635 /* timeout events have nil as channel */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
636 set_event_type (emacs_event, timeout_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
637 SET_EVENT_TIMESTAMP_ZERO (emacs_event); /* #### wrong!! */
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
638 SET_EVENT_TIMEOUT_INTERVAL_ID (emacs_event, timeout->id);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
639 SET_EVENT_TIMEOUT_FUNCTION (emacs_event, Qnil);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
640 SET_EVENT_TIMEOUT_OBJECT (emacs_event, Qnil);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
641 Blocktype_free (the_GTK_timeout_blocktype, timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
642 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
643
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
644
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
645 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
646 /* process and tty events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
647 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
648
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
649 struct what_is_ready_closure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
650 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
651 int fd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
652 Lisp_Object what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
653 gint id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
654 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
655
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
656 static Lisp_Object *filedesc_with_input;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
657 static struct what_is_ready_closure **filedesc_to_what_closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
658
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
659 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
660 init_what_input_once (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
661 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
662 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
663
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
664 filedesc_with_input = xnew_array (Lisp_Object, MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
665 filedesc_to_what_closure =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
666 xnew_array (struct what_is_ready_closure *, MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
667
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
668 for (i = 0; i < MAXDESC; i++)
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 filedesc_to_what_closure[i] = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
671 filedesc_with_input[i] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
672 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
673
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
674 process_events_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
675 tty_events_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
676 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
677
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
678 static void
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 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
681 if (NILP (filedesc_with_input[closure->fd]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
682 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
683 SELECT_TYPE temp_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
684 FD_ZERO (&temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
685 FD_SET (closure->fd, &temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
686 /* Check to make sure there's *really* input available.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
687 Sometimes things seem to get confused and this gets called
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
688 for the tty fd when there's really only input available
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
689 on some process's fd. (It will subsequently get called
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
690 for that process's fd, so returning without setting any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
691 flags will take care of it.) To see the problem, uncomment
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
692 the stderr_out below, turn NORMAL_QUIT_CHECK_TIMEOUT_MSECS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
693 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
694 and press return repeatedly. (Seen under AIX & Linux.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
695 -dkindred@cs.cmu.edu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
696 if (!poll_fds_for_input (temp_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
697 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
698 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
699 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
700 closure->fd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
701 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
702 return;
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 filedesc_with_input[closure->fd] = closure->what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
705 if (PROCESSP (closure->what))
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
706 /* Don't increment this if the current process is already marked
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
707 * as having input. */
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
708 process_events_occurred++;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
709 else
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
710 tty_events_occurred++;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
711 }
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
714 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
715 gtk_what_callback (gpointer closure, gint UNUSED (source),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
716 GdkInputCondition UNUSED (why))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
717 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
718 /* 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
719 The only purpose of this is to make XtAppProcessEvent() stop
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
720 blocking. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
721 if (closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
722 mark_what_as_being_ready ((struct what_is_ready_closure *) closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
723 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
724 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
725 fake_event_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
726 drain_signal_event_pipe ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
727 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
728 }
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 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
731 select_filedesc (int fd, Lisp_Object what)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
732 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
733 struct what_is_ready_closure *closure;
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 /* If somebody is trying to select something that's already selected
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
736 for, then something went wrong. The generic routines ought to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
737 detect this and error before here. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
738 assert (!filedesc_to_what_closure[fd]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
739
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
740 closure = xnew (struct what_is_ready_closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
741 closure->fd = fd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
742 closure->what = what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
743 closure->id = gdk_input_add (fd, GDK_INPUT_READ,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
744 (GdkInputFunction) gtk_what_callback, closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
745 filedesc_to_what_closure[fd] = closure;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
748 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
749 unselect_filedesc (int fd)
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 struct what_is_ready_closure *closure = filedesc_to_what_closure[fd];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
752
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
753 assert (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
754 if (!NILP (filedesc_with_input[fd]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
755 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
756 /* We are unselecting this process before we have drained the rest of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
757 the input from it, probably from status_notify() in the command loop.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
758 This can happen like so:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
759
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
760 - We are waiting in XtAppNextEvent()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
761 - Process generates output
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
762 - Process is marked as being ready
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
763 - Process dies, SIGCHLD gets generated before we return (!?)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
764 It could happen I guess.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
765 - sigchld_handler() marks process as dead
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
766 - Somehow we end up getting a new KeyPress event on the queue
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
767 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
768 not sure it can't either so let's assume it can...).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
769 - Key events have priority so we return that instead of the proc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
770 - Before dispatching the lisp key event we call status_notify()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
771 - Which deselects the process that SIGCHLD marked as dead.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
772
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
773 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
774 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
775 throwing away the last block of output - status_notify() has already
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
776 taken care of running the proc filter or whatever.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
777 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
778 filedesc_with_input[fd] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
779 if (PROCESSP (closure->what))
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 assert (process_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
782 process_events_occurred--;
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 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
785 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
786 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
787 tty_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
788 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
789 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
790 gdk_input_remove (closure->id);
4976
16112448d484 Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents: 4962
diff changeset
791 xfree (closure);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
792 filedesc_to_what_closure[fd] = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
793 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
794
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
795 static void
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
796 emacs_gtk_select_process (Lisp_Process *process, int doin, int doerr)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
797 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
798 Lisp_Object proc;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
799 int infd, errfd;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
800
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
801 event_stream_unixoid_select_process (process, doin, doerr, &infd, &errfd);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
802
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
803 proc = wrap_process (process);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
804 if (doin)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
805 select_filedesc (infd, proc);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
806 if (doerr)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
807 select_filedesc (errfd, proc);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
808 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
809
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
810 static void
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
811 emacs_gtk_unselect_process (Lisp_Process *process, int doin, int doerr)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
812 {
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
813 int infd, errfd;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
814
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
815 event_stream_unixoid_unselect_process (process, doin, doerr, &infd, &errfd);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
816
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
817 if (doin)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
818 unselect_filedesc (infd);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
819 if (doerr)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
820 unselect_filedesc (errfd);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
821 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
822
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
823 static void
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
824 emacs_gtk_create_io_streams (void *inhandle, void *outhandle,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
825 void *errhandle, Lisp_Object *instream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
826 Lisp_Object *outstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
827 Lisp_Object *errstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
828 USID *in_usid,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
829 USID *err_usid,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
830 int flags)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
831 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
832 event_stream_unixoid_create_io_streams
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
833 (inhandle, outhandle, errhandle, instream, outstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
834 errstream, in_usid, err_usid, flags);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
835 if (*in_usid != USID_ERROR)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
836 *in_usid = USID_DONTHASH;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
837 if (*err_usid != USID_ERROR)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
838 *err_usid = USID_DONTHASH;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
839 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
840
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
841 static void
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
842 emacs_gtk_delete_io_streams (Lisp_Object instream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
843 Lisp_Object outstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
844 Lisp_Object errstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
845 USID *in_usid,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
846 USID *err_usid)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
847 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
848 event_stream_unixoid_delete_io_streams
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
849 (instream, outstream, errstream, in_usid, err_usid);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
850 *in_usid = USID_DONTHASH;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 826
diff changeset
851 *err_usid = USID_DONTHASH;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
852 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
853
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
854 /* 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
855 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
856 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
857 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
858 debug_process_finalization (struct Lisp_Process *UNUSED (p))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
859 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
860 #if 0 /* #### */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
861 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
862 Lisp_Object instr, outstr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
863
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
864 get_process_streams (p, &instr, &outstr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
865 /* if it still has fds, then it hasn't been killed yet. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
866 assert (NILP(instr));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
867 assert (NILP(outstr));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
868 /* 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
869 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
870 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
871 Lisp_Object process = filedesc_fds_with_input [i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
872 assert (!PROCESSP (process) || XPROCESS (process) != p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
873 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
874 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
875 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
876
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
877 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
878 gtk_process_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
879 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
880 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
881
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
882 assert (process_events_occurred > 0);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
883
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
884 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
885 {
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
886 Lisp_Object process = filedesc_with_input[i];
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
887 if (PROCESSP (process))
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
888 {
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
889 filedesc_with_input[i] = Qnil;
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
890 process_events_occurred--;
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
891 /* process events have nil as channel */
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
892 set_event_type (emacs_event, process_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
893 SET_EVENT_TIMESTAMP_ZERO (emacs_event); /* #### */
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
894 SET_EVENT_PROCESS_PROCESS (emacs_event, process);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
895 return;
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
896 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
897 }
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2489
diff changeset
898 ABORT ();
462
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
901 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
902 emacs_gtk_select_console (struct console *con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
903 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
904 Lisp_Object console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
905 int infd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
906
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
907 if (CONSOLE_GTK_P (con))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
908 return; /* Gtk consoles are automatically selected for when we initialize them */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
909 infd = event_stream_unixoid_select_console (con);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
910 console = wrap_console (con);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
911 select_filedesc (infd, console);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
912 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
913
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
914 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
915 emacs_gtk_unselect_console (struct console *con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
916 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
917 Lisp_Object console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
918 int infd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
919
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
920 if (CONSOLE_GTK_P (con))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
921 return; /* X consoles are automatically selected for when we initialize them */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
922 infd = event_stream_unixoid_unselect_console (con);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
923 console = wrap_console (con);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
924 unselect_filedesc (infd);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
927 /* 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
928 if an event was available. Note that when this function is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
929 called, there should always be a tty marked as ready for input.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
930 However, the input condition might actually be EOF, so there
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
931 may not really be any input available. (In this case,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
932 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
933 to be deleted.) */
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 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
936 gtk_tty_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
937 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
938 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
939
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
940 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
941 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
942 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
943 Lisp_Object console = filedesc_with_input[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
944 if (CONSOLEP (console))
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 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
947 tty_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
948 filedesc_with_input[i] = Qnil;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
949 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
950 XCONSOLE (console)))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
951 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
952 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
953 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
954
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
955 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
956 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
957
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
958
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
959 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
960 /* Drag 'n Drop handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
961 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
962 #ifdef HAVE_DRAGNDROP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
963 #define TARGET_URI_LIST 0x00
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
964 #define TARGET_TEXT_PLAIN 0x01
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
965 #define TARGET_FILE_NAME 0x02
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
966 #define TARGET_NETSCAPE 0x03
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 static GdkAtom preferred_targets[10];
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 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
971 dragndrop_data_received (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
972 GdkDragContext *context,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
973 gint x,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
974 gint y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
975 GtkSelectionData *data,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
976 guint UNUSED (info),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
977 guint time)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
978 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
979 Lisp_Object event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
980 struct device *d = gtk_any_window_to_device (widget->window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
981 struct frame *f = gtk_any_widget_or_parent_to_frame (d, widget);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
982 struct Lisp_Event *ev = XEVENT (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
983 Lisp_Object l_type = Qnil, l_data = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
984 Lisp_Object l_dndlist = Qnil, l_item = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
985 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
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 GCPRO4 (l_type, l_data, l_dndlist, l_item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
988
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
989 set_event_type (ev, misc_user_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
990 SET_EVENT_CHANNEL (ev, wrap_frame (f));
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
991 SET_EVENT_TIMESTAMP (ev, time);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
992 SET_EVENT_MISC_USER_X (ev, x);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
993 SET_EVENT_MISC_USER_Y (ev, y);
462
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 if (data->type == preferred_targets[TARGET_URI_LIST])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
996 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
997 /* newline-separated list of URLs */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
998 int start, end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
999 const char *string_data = (char *) data->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1000
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1001 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1002
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1003 for (start = 0, end = 0; string_data && string_data[end]; end++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1004 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1005 if ((string_data[end] == '\r') && (string_data[end+1] == '\n'))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1006 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1007 l_item = make_string (&string_data[start], end - start);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1008 l_dndlist = Fcons (l_item, l_dndlist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1009 ++end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1010 start = ++end;
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1013 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1014 else if (data->type == preferred_targets[TARGET_TEXT_PLAIN])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1015 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1016 /* Arbitrary string */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1017 l_type = Qdragdrop_MIME;
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
1018 l_dndlist = list1 (list3 (list1 (build_ascstring ("text/plain")),
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
1019 build_ascstring ("8_bit"),
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
1020 make_extstring (data->data,
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1021 strlen ((char *)data->data),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1022 Qctext)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1023 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1024 else if (data->type == preferred_targets[TARGET_FILE_NAME])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1025 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1026 /* Random filename */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1027 char *hurl = dnd_url_hexify_string (data->data, "file:");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1028
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
1029 l_dndlist = list1 (make_string ((Ibyte *)hurl, strlen (hurl)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1030 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1031
4976
16112448d484 Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents: 4962
diff changeset
1032 xfree (hurl);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1033 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1034 else if (data->type == preferred_targets[TARGET_NETSCAPE])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1035 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1036 /* Single URL */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1037 l_dndlist = list1 (make_string ((Extbyte *)data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1038 strlen ((char *)data->data)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1039 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1040 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1041 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1042 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1043 /* Unknown type - what to do?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1044 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
1045 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1046 l_type = Qdragdrop_MIME;
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
1047 l_dndlist = list1 (list3 (list1 (build_cistring (gdk_atom_name (data->type))),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
1048 build_ascstring ("8bit"),
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
1049 make_extstring ((Extbyte *) data->data,
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1050 data->length, Qbinary)));
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
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1053
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1054 SET_EVENT_MISC_USER_FUNCTION (ev, Qdragdrop_drop_dispatch);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1055 SET_EVENT_MISC_USER_OBJECT (ev, Fcons (l_type, l_dndlist));
462
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 UNGCPRO;
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 gtk_drag_finish (context, TRUE, FALSE, time);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1060 enqueue_dispatch_event (event);
462
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1063 gboolean
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
1064 dragndrop_dropped (GtkWidget *UNUSED (widget),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1065 GdkDragContext *drag_context,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
1066 gint UNUSED (x),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
1067 gint UNUSED (y),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1068 guint time,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1069 gpointer user_data)
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 /* Netscape drops things like:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1072 STRING
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1073 _SGI_ICON
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1074 _SGI_ICON_TYPE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1075 SGI_FILE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1076 FILE_NAME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1077 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1078
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1079 gmc drops things like
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1080 application/x-mc-desktop-icon
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1081 text/uri-list
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1082 text/plain
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1083 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1084
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1085 We prefer:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1086 text/uri-list
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1087 text/plain
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1088 FILE_NAME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1089 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1090 first one
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1091 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1092 GdkAtom found = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1093 GList *list = drag_context->targets;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1094
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1095 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1096
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1097 if (!preferred_targets[0])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1098 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1099 preferred_targets[TARGET_URI_LIST] = gdk_atom_intern ("text/uri-list", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1100 preferred_targets[TARGET_TEXT_PLAIN] = gdk_atom_intern ("text/plain", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1101 preferred_targets[TARGET_FILE_NAME] = gdk_atom_intern ("FILE_NAME", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1102 preferred_targets[TARGET_NETSCAPE] = gdk_atom_intern ("_NETSCAPE_URL", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1103 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1104
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1105 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1106 stderr_out ("Drop info available in the following formats: \n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1107 while (list)
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 stderr_out ("\t%s\n", gdk_atom_name ((GdkAtom)list->data));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1110 list = list->next;
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 list = drag_context->targets;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1113 #endif
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 while (list && !found)
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 for (i = 0; preferred_targets[i] && !found; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1118 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1119 if ((GdkAtom) list->data == preferred_targets[i])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1120 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1121 found = (GdkAtom) list->data;
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1124 list = list->next;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1127 if (!found)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1128 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1129 found = (GdkAtom) drag_context->targets->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1130 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1131
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1132 gtk_drag_get_data (GTK_WIDGET (user_data), drag_context, found, time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1133 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1134 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1135 #endif /* HAVE_DRAGNDROP */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1136
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1137
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 /* get the next event from gtk */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1140 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1141
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1142 /* This business exists because menu events "happen" when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1143 menubar_selection_callback() is called from somewhere deep
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1144 within XtAppProcessEvent in emacs_Xt_next_event(). The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1145 callback needs to terminate the modal loop in that function
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1146 or else it will continue waiting until another event is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1147 received.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1148
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1149 Same business applies to scrollbar events. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1150
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1151 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1152 signal_special_gtk_user_event (Lisp_Object channel, Lisp_Object function,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1153 Lisp_Object object)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1154 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1155 Lisp_Object event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1156
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1157 XSET_EVENT_TYPE (event, misc_user_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1158 XSET_EVENT_CHANNEL (event, channel);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1159 XSET_EVENT_MISC_USER_FUNCTION (event, function);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1160 XSET_EVENT_MISC_USER_OBJECT (event, object);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1161 enqueue_dispatch_event (event);
462
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1164 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1165 emacs_gtk_next_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1166 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1167 we_didnt_get_an_event:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1168
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1169 while (NILP (dispatch_event_queue) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1170 !completed_timeouts &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1171 !fake_event_occurred &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1172 !process_events_occurred &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1173 !tty_events_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1174 {
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
1175 #ifdef WIN32_ANY
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
1176 mswindows_is_blocking = 1;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
1177 #endif
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
1178 gtk_main_iteration ();
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
1179 #ifdef WIN32_ANY
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
1180 mswindows_is_blocking = 0;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
1181 #endif
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1182 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1183
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1184 if (!NILP (dispatch_event_queue))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1185 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1186 Lisp_Object event, event2;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
1187 event2 = wrap_event (emacs_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1188 event = dequeue_dispatch_event ();
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1189 Fcopy_event (event, event2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1190 Fdeallocate_event (event);
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 else if (tty_events_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1193 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1194 if (!gtk_tty_to_emacs_event (emacs_event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1195 goto we_didnt_get_an_event;
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 else if (completed_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1198 gtk_timeout_to_emacs_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1199 else if (fake_event_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1200 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1201 /* 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
1202 fake_event_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1203 /* eval events have nil as channel */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1204 set_event_type (emacs_event, eval_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1205 SET_EVENT_EVAL_FUNCTION (emacs_event, Qidentity);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1206 SET_EVENT_EVAL_OBJECT (emacs_event, Qnil);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1207 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1208 else /* if (process_events_occurred) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1209 gtk_process_to_emacs_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1210 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1211
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1212 int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1213 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
1214 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1215 struct device *d = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1216 struct gtk_device *gd = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1217 gboolean accept_any_window = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1218
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
1219 /* #### Under what circumstances can this happen???? Hunt out the code that
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
1220 sets frame to 0 and fix it instead. */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1221 if (!frame)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1222 {
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
1223 frame = XFRAME (Fselected_frame (get_default_device (Qgtk)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1224 accept_any_window = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1225 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1226
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1227 d = XDEVICE (FRAME_DEVICE (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1228 gd = DEVICE_GTK_DATA (d);
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 set_last_server_timestamp (d, gdk_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1231
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1232 switch (gdk_event->type)
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 /* XEmacs handles double and triple clicking on its own, and if
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1235 we capture these events, it royally confuses the code in
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1236 ../lisp/mouse.el */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1237 case GDK_2BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1238 case GDK_3BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1239 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1240
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1241 case GDK_BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1242 case GDK_BUTTON_RELEASE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1243 /* We need to ignore button events outside our main window or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1244 things get ugly. The standard scrollbars in Gtk try to be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1245 nice and pass the button press events up to the parent
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1246 widget. This causes us no end of grief though. Effects
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1247 range from setting point to the wrong place to selecting
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1248 new windows. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1249 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1250 GdkWindow *w = gdk_window_at_pointer (NULL, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1251
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1252 /* If you press mouse button and drag it around, and release
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1253 it outside the window, you will get a NULL GdkWindow at
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1254 pointer. We need to forward these events on to XEmacs so
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1255 that the mouse selection voodoo works.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1256 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1257 if (w && (w != gdk_window_lookup (GDK_ROOT_WINDOW ())))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1258 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1259 GdkEvent ev;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1260 GtkWidget *wid = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1261
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1262 ev.any.window = w;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1263 wid = gtk_get_event_widget (&ev);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1264
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1265 if (!GTK_IS_XEMACS (wid) && !accept_any_window)
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 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1268 }
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 (!accept_any_window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1271 gtk_widget_grab_focus (FRAME_GTK_TEXT_WIDGET (frame));
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 /* Fall through */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1274 case GDK_KEY_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1275 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1276 unsigned int modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1277 int shift_p, lock_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1278 gboolean key_event_p = (gdk_event->type == GDK_KEY_PRESS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1279 unsigned int *state =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1280 key_event_p ? &gdk_event->key.state : &gdk_event->button.state;
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 /* If this is a synthetic KeyPress or Button event, and the user
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1283 has expressed a disinterest in this security hole, then drop
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1284 it on the floor. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1285 /* #### BILL!!! Should this be a generic check for ANY synthetic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1286 event? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1287 if ((gdk_event->any.send_event) && !gtk_allow_sendevents)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1288 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1289
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1290 DEVICE_GTK_MOUSE_TIMESTAMP (d) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1291 DEVICE_GTK_GLOBAL_MOUSE_TIMESTAMP (d) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1292 key_event_p ? gdk_event->key.time : gdk_event->button.time;
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 if (*state & GDK_CONTROL_MASK) modifiers |= XEMACS_MOD_CONTROL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1295 if (*state & gd->MetaMask) modifiers |= XEMACS_MOD_META;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1296 if (*state & gd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1297 if (*state & gd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1298 if (*state & gd->AltMask) modifiers |= XEMACS_MOD_ALT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1299
589
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1300 {
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1301 int numero_de_botao = -1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1302
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1303 if (!key_event_p)
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1304 numero_de_botao = gdk_event->button.button;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1305
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1306 /* 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
1307 field, but not both. */
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1308 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
1309 modifiers |= XEMACS_MOD_BUTTON1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1310 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
1311 modifiers |= XEMACS_MOD_BUTTON2;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1312 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
1313 modifiers |= XEMACS_MOD_BUTTON3;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1314 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
1315 modifiers |= XEMACS_MOD_BUTTON4;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1316 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
1317 modifiers |= XEMACS_MOD_BUTTON5;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1318 }
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1319
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1320 /* Ignore the Caps_Lock key if:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1321 - any other modifiers are down, so that Caps_Lock doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1322 turn C-x into C-X, which would suck.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1323 - the event was a mouse event. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1324 if (modifiers || ! key_event_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1325 *state &= (~GDK_LOCK_MASK);
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 shift_p = *state & GDK_SHIFT_MASK;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1328 lock_p = *state & GDK_LOCK_MASK;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1329
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1330 if (shift_p || lock_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1331 modifiers |= XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1332
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1333 if (key_event_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1334 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1335 GdkEventKey *key_event = &gdk_event->key;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1336 Lisp_Object keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1337
2081
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1338 #ifdef HAVE_MENUBARS
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1339 /* If the user wants see if the event is a menu bar accelerator.
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1340 The process of checking absorbs the event and starts menu
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1341 processing so send a null event into XEmacs to make sure it
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1342 does nothing.
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1343 */
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1344 if (!NILP (Vmenu_accelerator_enabled)
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1345 && gtk_accel_groups_activate(GTK_OBJECT (FRAME_GTK_SHELL_WIDGET(frame)),
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1346 key_event->keyval,
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1347 (GdkModifierType) *state))
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1348 {
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1349 zero_event(emacs_event);
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1350 return 1;
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1351 }
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1352 #endif
e8db6a10ad42 [xemacs-hg @ 2004-05-15 07:31:43 by malcolmp]
malcolmp
parents: 2054
diff changeset
1353
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1354 /* This used to compute the frame from the given X window and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1355 store it here, but we really don't care about the frame. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1356 emacs_event->channel = DEVICE_CONSOLE (d);
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 /* Keysym mucking has already been done inside the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1359 GdkEventKey parsing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1360 keysym = gtk_to_emacs_keysym (d, key_event, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1361
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1362 /* If the emacs keysym is nil, then that means that the X
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1363 keysym was either a Modifier or NoSymbol, which
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1364 probably means that we're in the midst of reading a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1365 Multi_key sequence, or a "dead" key prefix, or XIM
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1366 input. Ignore it. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1367 if (NILP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1368 return 0;
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 /* More Caps_Lock garbage: Caps_Lock should *only* add the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1371 shift modifier to two-case keys (that is, A-Z and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1372 related characters). So at this point (after looking up
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1373 the keysym) if the keysym isn't a dual-case alphabetic,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1374 and if the caps lock key was down but the shift key
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1375 wasn't, then turn off the shift modifier. Gag barf */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1376 /* #### type lossage: assuming equivalence of emacs and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1377 X keysyms */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1378 /* !!#### maybe fix for Mule */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1379 if (lock_p && !shift_p &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1380 ! (CHAR_OR_CHAR_INTP (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1381 && keysym_obeys_caps_lock_p
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1382 ((guint) XCHAR_OR_CHAR_INT (keysym), d)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1383 modifiers &= (~XEMACS_MOD_SHIFT);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1384
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1385 /* If this key contains two distinct keysyms, that is,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1386 "shift" generates a different keysym than the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1387 non-shifted key, then don't apply the shift modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1388 bit: it's implicit. Otherwise, if there would be no
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1389 other way to tell the difference between the shifted
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1390 and unshifted version of this key, apply the shift bit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1391 Non-graphics, like Backspace and F1 get the shift bit
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1392 in the modifiers slot. Neither the characters "a",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1393 "A", "2", nor "@" normally have the shift bit set.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1394 However, "F1" normally does. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1395 if (modifiers & XEMACS_MOD_SHIFT)
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 if (CHAR_OR_CHAR_INTP (keysym))
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 modifiers &= ~XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1400 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1401 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1402
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1403 set_event_type (emacs_event, key_press_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1404 SET_EVENT_TIMESTAMP (emacs_event, key_event->time);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1405 SET_EVENT_KEY_MODIFIERS (emacs_event, modifiers);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1406 SET_EVENT_KEY_KEYSYM (emacs_event, keysym);
462
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 else /* Mouse press/release event */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1409 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1410 GdkEventButton *button_event = &gdk_event->button;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1411
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1412 set_event_type (emacs_event,
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1413 button_event->type == GDK_BUTTON_RELEASE ?
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1414 button_release_event : button_press_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1415 SET_EVENT_CHANNEL (emacs_event, wrap_frame (frame));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1416
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1417 SET_EVENT_BUTTON_MODIFIERS (emacs_event, modifiers);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1418 SET_EVENT_TIMESTAMP (emacs_event, button_event->time);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1419 SET_EVENT_BUTTON_BUTTON (emacs_event, button_event->button);
2054
91d4c8c65a0f [xemacs-hg @ 2004-05-02 04:06:51 by malcolmp]
malcolmp
parents: 1726
diff changeset
1420 SET_EVENT_BUTTON_X (emacs_event, (int) button_event->x);
91d4c8c65a0f [xemacs-hg @ 2004-05-02 04:06:51 by malcolmp]
malcolmp
parents: 1726
diff changeset
1421 SET_EVENT_BUTTON_Y (emacs_event, (int) button_event->y);
462
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1424 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1425 case GDK_KEY_RELEASE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1426 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1427 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1428 case GDK_MOTION_NOTIFY:
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 GdkEventMotion *ev = &gdk_event->motion;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1431 unsigned int modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1432 gint x,y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1433 GdkModifierType mask;
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 /* We use MOTION_HINT_MASK, so we will get only one motion
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1436 event until the next time we call gdk_window_get_pointer or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1437 the user clicks the mouse. So call gdk_window_get_pointer
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1438 now (meaning that the event will be in sync with the server
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1439 just before Fnext_event() returns). If the mouse is still
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1440 in motion, then the server will immediately generate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1441 exactly one more motion event, which will be on the queue
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1442 waiting for us next time around. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1443 gdk_window_get_pointer (ev->window, &x, &y, &mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1444
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1445 DEVICE_GTK_MOUSE_TIMESTAMP (d) = ev->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1446
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1447 SET_EVENT_CHANNEL (emacs_event, wrap_frame (frame));
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1448 set_event_type (emacs_event, pointer_motion_event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1449 SET_EVENT_TIMESTAMP (emacs_event, ev->time);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1450 SET_EVENT_MOTION_X (emacs_event, x);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1451 SET_EVENT_MOTION_Y (emacs_event, y);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1452
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1453 if (mask & GDK_SHIFT_MASK) modifiers |= XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1454 if (mask & GDK_CONTROL_MASK) modifiers |= XEMACS_MOD_CONTROL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1455 if (mask & gd->MetaMask) modifiers |= XEMACS_MOD_META;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1456 if (mask & gd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1457 if (mask & gd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1458 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
1459 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
1460 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
1461 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
1462 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
1463 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
1464
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1465 /* Currently ignores Shift_Lock but probably shouldn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1466 (but it definitely should ignore Caps_Lock). */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1467 SET_EVENT_MOTION_MODIFIERS (emacs_event, modifiers);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1468 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1469 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1470
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1471 default: /* it's a magic event */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1472 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1473 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1474 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1475 return 1;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1478 static const char *event_name (GdkEvent *);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1479
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1480 static gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1481 generic_event_handler (GtkWidget *widget, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1482 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1483 Lisp_Object emacs_event = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1484 if (!GTK_IS_XEMACS (widget))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1485 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1486 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
1487 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1488 }
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 emacs_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1491
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1492 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
1493 {
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1494 enqueue_dispatch_event (emacs_event);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1495 return (TRUE);
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 else
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 Fdeallocate_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1500 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1501 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1502 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1503
1416
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1504 gint
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1505 emacs_gtk_key_event_handler (GtkWidget *widget, GdkEventKey *event)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1506 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1507 return (generic_event_handler (widget, (GdkEvent *) event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1508 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1509
1416
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1510 gint
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1511 emacs_gtk_button_event_handler (GtkWidget *widget, GdkEventButton *event)
462
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 return (generic_event_handler (widget, (GdkEvent *) event));
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
1416
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1516 gint
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1517 emacs_gtk_motion_event_handler (GtkWidget *widget, GdkEventMotion *event)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1518 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1519 return (generic_event_handler (widget, (GdkEvent *) event));
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1522 gboolean
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
1523 emacs_shell_event_handler (GtkWidget *UNUSED (wid),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1524 GdkEvent *event,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1525 gpointer closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1526 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1527 struct frame *frame = (struct frame *) closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1528 Lisp_Object lisp_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1529 struct Lisp_Event *emacs_event = XEVENT (lisp_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1530 GdkEvent *gdk_event_copy = &EVENT_MAGIC_GDK_EVENT (emacs_event);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1531 struct device *d = XDEVICE (FRAME_DEVICE (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1532 gboolean ignore_p = FALSE;
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 set_last_server_timestamp (d, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1535
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1536 #define FROB(event_member) gdk_event_copy->event_member = event->event_member
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 switch (event->type)
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 case GDK_SELECTION_REQUEST:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1541 case GDK_SELECTION_CLEAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1542 case GDK_SELECTION_NOTIFY: FROB(selection); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1543 case GDK_PROPERTY_NOTIFY: FROB(property); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1544 case GDK_CLIENT_EVENT: FROB(client); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1545 case GDK_MAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1546 case GDK_UNMAP: FROB(any); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1547 case GDK_CONFIGURE: FROB(configure); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1548 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1549 case GDK_LEAVE_NOTIFY: FROB(crossing); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1550 case GDK_FOCUS_CHANGE: FROB(focus_change); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1551 case GDK_VISIBILITY_NOTIFY: FROB(visibility); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1552 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1553 ignore_p = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1554 /* 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
1555 *gdk_event_copy = *event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1556 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1557 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1558 #undef FROB
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1559
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1560 emacs_event->event_type = magic_event;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
1561 emacs_event->channel = wrap_frame (frame);
462
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 if (ignore_p)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
1564 {
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1565 stderr_out ("Ignoring event... (%s)\n", event_name (event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1566 Fdeallocate_event (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1567 return (FALSE);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
1568 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1569 else
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
1570 {
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1571 enqueue_dispatch_event (lisp_event);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1572 return (TRUE);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 790
diff changeset
1573 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1574 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1575
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1576
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1577 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1578 /* input pending / C-g checking */
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1581 static void
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1582 emacs_gtk_drain_queue (void)
462
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 /* 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
1586 event queue to get empty, or the queue never gets drained. The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1587 situation is as follows. A process event gets signalled, we put
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1588 it on the queue, then we go into Fnext_event(), which calls
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1589 emacs_gtk_drain_queue(). But gtk_events_pending() will always return
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1590 TRUE if there are file-descriptor (aka our process) events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1591 pending. Using GDK_events_pending() only shows us windowing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1592 system events.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1593 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1594 if (GDK_DISPLAY ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1595 while (gdk_events_pending ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1596 gtk_main_iteration ();
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1597
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
1598 #ifdef HAVE_TTY
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1599 drain_tty_devices ();
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1600 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1601 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1602
790
755d0acc05ea [xemacs-hg @ 2002-03-21 15:47:19 by wmperry]
wmperry
parents: 789
diff changeset
1603 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2081
diff changeset
1604 emacs_gtk_force_event_pending (struct frame* UNUSED (f))
790
755d0acc05ea [xemacs-hg @ 2002-03-21 15:47:19 by wmperry]
wmperry
parents: 789
diff changeset
1605 {
755d0acc05ea [xemacs-hg @ 2002-03-21 15:47:19 by wmperry]
wmperry
parents: 789
diff changeset
1606 #if 0
755d0acc05ea [xemacs-hg @ 2002-03-21 15:47:19 by wmperry]
wmperry
parents: 789
diff changeset
1607 stderr_out ("Force event pending called on frame %p!\n", f);
755d0acc05ea [xemacs-hg @ 2002-03-21 15:47:19 by wmperry]
wmperry
parents: 789
diff changeset
1608 #endif
755d0acc05ea [xemacs-hg @ 2002-03-21 15:47:19 by wmperry]
wmperry
parents: 789
diff changeset
1609 }
755d0acc05ea [xemacs-hg @ 2002-03-21 15:47:19 by wmperry]
wmperry
parents: 789
diff changeset
1610
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1611
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1612 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1613 /* initialization */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1614 /************************************************************************/
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 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1617 syms_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1618 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
1619 DEFSYMBOL (Qsans_modifiers);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1620 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1621
1416
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1622 void
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1623 reinit_vars_of_event_gtk (void)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1624 {
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1625 gtk_event_stream = xnew_and_zero (struct event_stream);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1626 gtk_event_stream->event_pending_p = emacs_gtk_event_pending_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1627 gtk_event_stream->next_event_cb = emacs_gtk_next_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1628 gtk_event_stream->handle_magic_event_cb= emacs_gtk_handle_magic_event;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
1629 gtk_event_stream->format_magic_event_cb= emacs_gtk_format_magic_event;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
1630 gtk_event_stream->compare_magic_event_cb= emacs_gtk_compare_magic_event;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 778
diff changeset
1631 gtk_event_stream->hash_magic_event_cb = emacs_gtk_hash_magic_event;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1632 gtk_event_stream->add_timeout_cb = emacs_gtk_add_timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1633 gtk_event_stream->remove_timeout_cb = emacs_gtk_remove_timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1634 gtk_event_stream->select_console_cb = emacs_gtk_select_console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1635 gtk_event_stream->unselect_console_cb = emacs_gtk_unselect_console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1636 gtk_event_stream->select_process_cb = emacs_gtk_select_process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1637 gtk_event_stream->unselect_process_cb = emacs_gtk_unselect_process;
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1638 gtk_event_stream->drain_queue_cb = emacs_gtk_drain_queue;
876
890f3cafe600 [xemacs-hg @ 2002-06-23 09:25:11 by stephent]
stephent
parents: 872
diff changeset
1639 gtk_event_stream->create_io_streams_cb= emacs_gtk_create_io_streams;
890f3cafe600 [xemacs-hg @ 2002-06-23 09:25:11 by stephent]
stephent
parents: 872
diff changeset
1640 gtk_event_stream->delete_io_streams_cb= emacs_gtk_delete_io_streams;
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 876
diff changeset
1641 gtk_event_stream->force_event_pending_cb= emacs_gtk_force_event_pending;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1642
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1643 the_GTK_timeout_blocktype = Blocktype_new (struct GTK_timeout_blocktype);
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 /* this function only makes safe calls */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1646 init_what_input_once ();
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1649 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1650 vars_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1651 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1652 DEFVAR_BOOL ("gtk-allow-sendevents", &gtk_allow_sendevents /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1653 *Non-nil means to allow synthetic events. Nil means they are ignored.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1654 Beware: allowing emacs to process SendEvents opens a big security hole.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1655 */ );
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1656 gtk_allow_sendevents = 0;
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 last_quit_check_signal_tick_count = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1659 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1660
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1661 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1662 init_event_gtk_late (void) /* called when already initialized */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1663 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1664 timeout_id_tick = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1665 pending_timeouts = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1666 completed_timeouts = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1667
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1668 event_stream = gtk_event_stream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1669
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1670 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1671 /* Shut GDK the hell up */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1672 gdk_error_trap_push ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1673 #endif
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 gdk_input_add (signal_event_pipe[0], GDK_INPUT_READ,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1676 (GdkInputFunction) gtk_what_callback, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1677 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1678
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1679 /* Bogus utility routines */
1416
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1680 static const char *
b0c1d9dc4b08 [xemacs-hg @ 2003-04-15 17:21:34 by stephent]
stephent
parents: 1415
diff changeset
1681 event_name (GdkEvent *ev)
462
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 return (gtk_event_name (ev->any.type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1684 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1685
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1686 /* 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
1687 generic code with this X specific CRAP! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1688
4908
b3ce27ca7647 various fixes related to gtk, redisplay-xlike-inc.c
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
1689 #include "sysgdkx.h"
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1690 #include <X11/keysym.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1691 /* #### BILL!!! Fix this please! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1692
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 /* keymap handling */
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 /* X bogusly doesn't define the interpretations of any bits besides
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1699 ModControl, ModShift, and ModLock; so the Interclient Communication
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1700 Conventions Manual says that we have to bend over backwards to figure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1701 out what the other modifier bits mean. According to ICCCM:
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 - Any keycode which is assigned ModControl is a "control" key.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1704
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1705 - 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
1706 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
1707 etc.
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 - Any keypress event which contains ModControl in its state should be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1710 interpreted as a "control" character.
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 - 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
1713 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
1714 should be interpreted as a "meta" character. Likewise for Super, Hyper,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1715 etc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1716
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1717 - 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
1718 bit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1719
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1720 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
1721 "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
1722 one of the modifier bits Mod1-Mod5.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1723
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1724 Unfortunately, many keyboards don't have Meta keys in their default
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1725 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
1726 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
1727 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
1728 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
1729
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1730 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
1731 checked.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1732
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1733 Emacs detects keyboard configurations which violate the above rules, and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1734 prints an error message on the standard-error-output. (Perhaps it should
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1735 use a pop-up-window instead.)
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1738 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1739 gtk_reset_key_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1740 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1741 Display *display = GDK_DISPLAY ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1742 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1743 KeySym *keysym, *keysym_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1744 Lisp_Object hashtable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1745 int key_code_count, keysyms_per_code;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1746
2054
91d4c8c65a0f [xemacs-hg @ 2004-05-02 04:06:51 by malcolmp]
malcolmp
parents: 1726
diff changeset
1747 if (xd->x_keysym_map)
91d4c8c65a0f [xemacs-hg @ 2004-05-02 04:06:51 by malcolmp]
malcolmp
parents: 1726
diff changeset
1748 XFree ((char *) xd->x_keysym_map);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1749 XDisplayKeycodes (display,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1750 &xd->x_keysym_map_min_code,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1751 &xd->x_keysym_map_max_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1752 key_code_count = xd->x_keysym_map_max_code - xd->x_keysym_map_min_code + 1;
2054
91d4c8c65a0f [xemacs-hg @ 2004-05-02 04:06:51 by malcolmp]
malcolmp
parents: 1726
diff changeset
1753 xd->x_keysym_map =
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1754 XGetKeyboardMapping (display, xd->x_keysym_map_min_code, key_code_count,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1755 &xd->x_keysym_map_keysyms_per_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1756
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1757 hashtable = xd->x_keysym_map_hashtable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1758 if (HASH_TABLEP (hashtable))
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 Fclrhash (hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1761 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1762 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1763 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1764 xd->x_keysym_map_hashtable = hashtable =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1765 make_lisp_hash_table (128, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1766 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1767
2054
91d4c8c65a0f [xemacs-hg @ 2004-05-02 04:06:51 by malcolmp]
malcolmp
parents: 1726
diff changeset
1768 for (keysym = xd->x_keysym_map,
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1769 keysyms_per_code = xd->x_keysym_map_keysyms_per_code,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1770 keysym_end = keysym + (key_code_count * keysyms_per_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1771 keysym < keysym_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1772 keysym += keysyms_per_code)
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 int j;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1775
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1776 if (keysym[0] == NoSymbol)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1777 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1778
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1779 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1780 Extbyte *name = XKeysymToString (keysym[0]);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1781 Lisp_Object sym = gtk_keysym_to_emacs_keysym (keysym[0], 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1782 if (name)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1783 {
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
1784 Fputhash (build_extstring (name, Qx_keysym_encoding),
4834
b3ea9c582280 Use new cygwin_conv_path API with Cygwin 1.7 for converting names between Win32 and POSIX, UTF-8-aware, with attendant changes elsewhere
Ben Wing <ben@xemacs.org>
parents: 4790
diff changeset
1785 Qsans_modifiers, hashtable);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1786 Fputhash (sym, Qsans_modifiers, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1787 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1788 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1789
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1790 for (j = 1; j < keysyms_per_code; j++)
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 if (keysym[j] != keysym[0] &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1793 keysym[j] != NoSymbol)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1794 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1795 Extbyte *name = XKeysymToString (keysym[j]);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1796 Lisp_Object sym = gtk_keysym_to_emacs_keysym (keysym[j], 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1797 if (name && NILP (Fgethash (sym, hashtable, Qnil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1798 {
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
1799 Fputhash (build_extstring (name, Qx_keysym_encoding),
4834
b3ea9c582280 Use new cygwin_conv_path API with Cygwin 1.7 for converting names between Win32 and POSIX, UTF-8-aware, with attendant changes elsewhere
Ben Wing <ben@xemacs.org>
parents: 4790
diff changeset
1800 Qt, hashtable);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1801 Fputhash (sym, Qt, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1802 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1803 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1804 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1805 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1806 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1807
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1808 static const char *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1809 index_to_name (int indice)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1810 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1811 switch (indice)
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 case ShiftMapIndex: return "ModShift";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1814 case LockMapIndex: return "ModLock";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1815 case ControlMapIndex: return "ModControl";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1816 case Mod1MapIndex: return "Mod1";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1817 case Mod2MapIndex: return "Mod2";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1818 case Mod3MapIndex: return "Mod3";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1819 case Mod4MapIndex: return "Mod4";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1820 case Mod5MapIndex: return "Mod5";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1821 default: return "???";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1822 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1823 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1824
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1825 /* Boy, I really wish C had local functions... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1826 struct c_doesnt_have_closures /* #### not yet used */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1827 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1828 int warned_about_overlapping_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1829 int warned_about_predefined_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1830 int warned_about_duplicate_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1831 int meta_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1832 int hyper_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1833 int super_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1834 int alt_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1835 int mode_bit;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1838 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1839 gtk_reset_modifier_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1840 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1841 Display *display = GDK_DISPLAY ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1842 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1843 int modifier_index, modifier_key, column, mkpm;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1844 int warned_about_overlapping_modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1845 /* int warned_about_predefined_modifiers = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1846 /* int warned_about_duplicate_modifiers = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1847 int meta_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1848 int hyper_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1849 int super_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1850 int alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1851 int mode_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1852 XModifierKeymap *map = (XModifierKeymap *) xd->x_modifier_keymap;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1853
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1854 xd->lock_interpretation = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1855
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1856 if (map)
3949
33b9323388c5 [xemacs-hg @ 2007-05-12 10:59:15 by aidan]
aidan
parents: 2842
diff changeset
1857 {
33b9323388c5 [xemacs-hg @ 2007-05-12 10:59:15 by aidan]
aidan
parents: 2842
diff changeset
1858 XFreeModifiermap (xd->x_modifier_keymap);
33b9323388c5 [xemacs-hg @ 2007-05-12 10:59:15 by aidan]
aidan
parents: 2842
diff changeset
1859 /* Set it to NULL in case we receive two MappingModifier events in a
33b9323388c5 [xemacs-hg @ 2007-05-12 10:59:15 by aidan]
aidan
parents: 2842
diff changeset
1860 row, and the second is processed during some CHECK_QUITs within
33b9323388c5 [xemacs-hg @ 2007-05-12 10:59:15 by aidan]
aidan
parents: 2842
diff changeset
1861 x_reset_key_mapping. If that happens, XFreeModifierMap will be
33b9323388c5 [xemacs-hg @ 2007-05-12 10:59:15 by aidan]
aidan
parents: 2842
diff changeset
1862 called twice on the same map, and we crash. */
33b9323388c5 [xemacs-hg @ 2007-05-12 10:59:15 by aidan]
aidan
parents: 2842
diff changeset
1863 xd->x_modifier_keymap = NULL;
33b9323388c5 [xemacs-hg @ 2007-05-12 10:59:15 by aidan]
aidan
parents: 2842
diff changeset
1864 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1865
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1866 gtk_reset_key_mapping (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1867
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1868 xd->x_modifier_keymap = map = XGetModifierMapping (display);
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 /* Boy, I really wish C had local functions...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1871 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1872
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1873 #define store_modifier(name,old) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1874 old = modifier_index;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1875
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1876 mkpm = map->max_keypermod;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1877 for (modifier_index = 0; modifier_index < 8; modifier_index++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1878 for (modifier_key = 0; modifier_key < mkpm; modifier_key++) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1879 KeySym last_sym = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1880 for (column = 0; column < 4; column += 2) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1881 KeyCode code = map->modifiermap[modifier_index * mkpm
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1882 + modifier_key];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1883 KeySym sym = (code ? XKeycodeToKeysym (display, code, column) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1884 if (sym == last_sym) continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1885 last_sym = sym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1886 switch (sym) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1887 case XK_Mode_switch:store_modifier ("Mode_switch", mode_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1888 case XK_Meta_L: store_modifier ("Meta_L", meta_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1889 case XK_Meta_R: store_modifier ("Meta_R", meta_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1890 case XK_Super_L: store_modifier ("Super_L", super_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1891 case XK_Super_R: store_modifier ("Super_R", super_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1892 case XK_Hyper_L: store_modifier ("Hyper_L", hyper_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1893 case XK_Hyper_R: store_modifier ("Hyper_R", hyper_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1894 case XK_Alt_L: store_modifier ("Alt_L", alt_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1895 case XK_Alt_R: store_modifier ("Alt_R", alt_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1896 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1897 case XK_Control_L: check_modifier ("Control_L", ControlMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1898 case XK_Control_R: check_modifier ("Control_R", ControlMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1899 case XK_Shift_L: check_modifier ("Shift_L", ShiftMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1900 case XK_Shift_R: check_modifier ("Shift_R", ShiftMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1901 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1902 case XK_Shift_Lock: /* check_modifier ("Shift_Lock", LockMask); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1903 xd->lock_interpretation = XK_Shift_Lock; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1904 case XK_Caps_Lock: /* check_modifier ("Caps_Lock", LockMask); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1905 xd->lock_interpretation = XK_Caps_Lock; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1906
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1907 /* 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
1908 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
1909 assigns modifier bits to a couple of random function keys for
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1910 no reason that I can discern, so printing a warning here would
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1911 be annoying. */
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 #undef store_modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1916 #undef check_modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1917 #undef modwarn
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1918 #undef modbarf
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1919
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1920 /* 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
1921 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
1922 is not disturbed and remains an Alt key. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1923 if (! meta_bit && alt_bit)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1924 meta_bit = alt_bit, alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1925
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1926 /* mode_bit overrides everything, since it's processed down inside of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1927 XLookupString() instead of by us. If Meta and Mode_switch both
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1928 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
1929 interpret that bit as Meta, because we can't make XLookupString()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1930 not interpret it as Mode_switch; and interpreting it as both would
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1931 be totally wrong. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1932 if (mode_bit)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1933 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1934 const char *warn = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1935 if (mode_bit == meta_bit) warn = "Meta", meta_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1936 else if (mode_bit == hyper_bit) warn = "Hyper", hyper_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1937 else if (mode_bit == super_bit) warn = "Super", super_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1938 else if (mode_bit == alt_bit) warn = "Alt", alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1939 if (warn)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1940 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1941 warn_when_safe
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1942 (Qkey_mapping, Qwarning,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1943 "XEmacs: %s is being used for both Mode_switch and %s.",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1944 index_to_name (mode_bit), warn),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1945 warned_about_overlapping_modifiers = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1946 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1947 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1948 #undef index_to_name
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1949
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1950 xd->MetaMask = (meta_bit ? (1 << meta_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1951 xd->HyperMask = (hyper_bit ? (1 << hyper_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1952 xd->SuperMask = (super_bit ? (1 << super_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1953 xd->AltMask = (alt_bit ? (1 << alt_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1954 xd->ModeMask = (mode_bit ? (1 << mode_bit) : 0); /* unused */
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1957
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1958 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1959 gtk_init_modifier_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1960 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1961 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1962 gd->x_keysym_map_hashtable = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1963 gd->x_keysym_map = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1964 gd->x_modifier_keymap = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1965 gtk_reset_modifier_mapping (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1966 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1967
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1968 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1969 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1970 gtk_key_is_modifier_p (KeyCode keycode, struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1971 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1972 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1973 KeySym *syms;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1974 KeySym *map = (KeySym *) xd->x_keysym_map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1975 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1976
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1977 if (keycode < xd->x_keysym_map_min_code ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1978 keycode > xd->x_keysym_map_max_code)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1979 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1980
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1981 syms = &map [(keycode - xd->x_keysym_map_min_code) *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1982 xd->x_keysym_map_keysyms_per_code];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1983 for (i = 0; i < xd->x_keysym_map_keysyms_per_code; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1984 if (IsModifierKey (syms [i]) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1985 syms [i] == XK_Mode_switch) /* why doesn't IsModifierKey count this? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1986 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1987 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1988 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1989 #endif