annotate src/event-Xt.c @ 3062:21d92abaac3a

[xemacs-hg @ 2005-11-13 10:39:28 by ben] fix up clean targets to delete .elc's as necessary dynodump/Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. *-noconfig targets are like the base targets they're based off of, but don't delete Makefiles and certain other files needed to rebuild the Makefiles as necessary. Refactor things to be more consistent. Top-level `elcclean' is an alias for `realclean-noconfig' and is used by target `beta'. `realclean-noconfig' (and, by extension, `realclean' and `extraclean') remove the .elc files. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. common/Makefile.common: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Put in some magic cookies in comments so this file gets read as a make file by XEmacs.
author ben
date Sun, 13 Nov 2005 10:39:41 +0000
parents ee35a8fdcfcd
children 4c038e89d563
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* The event_stream interface for X11 with Xt, and/or tty frames.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1991-5, 1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
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.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #include "blocktype.h"
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
29 #include "charset.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include "console.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
31 #include "device-impl.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
32 #include "elhash.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "events.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
34 #include "file-coding.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
35 #include "frame-impl.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
36 #include "glyphs.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
37 #include "lstream.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "process.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "redisplay.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
40 #include "window.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
41
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
42 #include "console-tty.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
43
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
44 #include "console-x-impl.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
45 #include "objects-x.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
46 #include "../lwlib/lwlib.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
47 #include "EmacsFrame.h"
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
48
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
49 #include "sysproc.h" /* for MAXDESC */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 #include "systime.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #include "xintrinsicp.h" /* CoreP.h needs this */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 #include <X11/CoreP.h> /* Numerous places access the fields of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 a core widget directly. We could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 use XtGetValues(), but ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 #include <X11/ShellP.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
58 #if defined (HAVE_XIM) && defined (XIM_MOTIF)
1315
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1292
diff changeset
59 #include "xmotif.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 #ifdef HAVE_DRAGNDROP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 #include "dragdrop.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 #if defined (HAVE_OFFIX_DND)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 #include "offix.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
70 #ifdef WIN32_ANY
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
71 extern int mswindows_is_blocking;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
72 #endif
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
73
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
74 /* For Russian C-x processing. */
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
75 #define FIRST_ALPHABETIC_QWERTY_KEYCODE 24
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
76 #define LAST_ALPHABETIC_QWERTY_KEYCODE 58
2699
96036853a107 [xemacs-hg @ 2005-03-29 02:58:56 by aidan]
aidan
parents: 2500
diff changeset
77
1094
4f4c898836ab [xemacs-hg @ 2002-11-11 15:34:11 by stephent]
stephent
parents: 1040
diff changeset
78 /* used in glyphs-x.c */
4f4c898836ab [xemacs-hg @ 2002-11-11 15:34:11 by stephent]
stephent
parents: 1040
diff changeset
79 void enqueue_focus_event (Widget wants_it, Lisp_Object frame, int in_p);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 static void handle_focus_event_1 (struct frame *f, int in_p);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
81 static void handle_focus_event_2 (Window w, struct frame *f, int in_p);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 static struct event_stream *Xt_event_stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 /* With the new event model, all events go through XtDispatchEvent()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 and are picked up by an event handler that is added to each frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 widget. (This is how it's supposed to be.) In the old method,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 Emacs sucks out events directly from XtNextEvent() and only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 dispatches the events that it doesn't need to deal with. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 old way has lots of corresponding junk that is no longer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 necessary: lwlib extensions, synthetic XAnyEvents, unnecessary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 magic events, etc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 /* The one and only one application context that Emacs uses. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 XtAppContext Xt_app_con;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 /* Do we accept events sent by other clients? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 int x_allow_sendevents;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 #ifdef DEBUG_XEMACS
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 452
diff changeset
101 Fixnum debug_x_events;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 static int process_events_occurred;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 static int tty_events_occurred;
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
106 static Widget widget_with_focus;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 /* Mask of bits indicating the descriptors that we wait for input on */
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
109 extern SELECT_TYPE input_wait_mask, non_fake_input_wait_mask;
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
110 extern SELECT_TYPE process_only_mask, tty_only_mask;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
112 static const String x_fallback_resources[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 /* This file is automatically generated from the app-defaults file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 in ../etc/Emacs.ad. These resources are consulted only if no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 app-defaults file is found at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 #include <Emacs.ad.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 static Lisp_Object x_keysym_to_emacs_keysym (KeySym keysym, int simple_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 void emacs_Xt_mapping_action (Widget w, XEvent *event);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
124 void debug_process_finalization (Lisp_Process *p);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 void emacs_Xt_event_handler (Widget wid, XtPointer closure, XEvent *event,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 Boolean *continue_to_dispatch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 static int last_quit_check_signal_tick_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 Lisp_Object Qsans_modifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
132 #define THIS_IS_X
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
133 #include "event-xlike-inc.c"
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
134
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 /* keymap handling */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
140 /* See comment near character_to_event(). */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
141 static void
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
142 maybe_define_x_key_as_self_inserting_character (KeySym keysym,
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
143 Lisp_Object symbol)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
144 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
145 Lisp_Object character = x_keysym_to_character (keysym);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
146
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
147 if (CHARP (character))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
148 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
149 extern Lisp_Object Vcurrent_global_map;
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
150 extern Lisp_Object Qcharacter_of_keysym;
971
8401dcd2d43a [xemacs-hg @ 2002-08-22 11:34:20 by stephent]
stephent
parents: 960
diff changeset
151 if (NILP (Flookup_key (Vcurrent_global_map, symbol, Qnil)))
8401dcd2d43a [xemacs-hg @ 2002-08-22 11:34:20 by stephent]
stephent
parents: 960
diff changeset
152 {
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
153 Fput (symbol, Qcharacter_of_keysym, character);
971
8401dcd2d43a [xemacs-hg @ 2002-08-22 11:34:20 by stephent]
stephent
parents: 960
diff changeset
154 Fdefine_key (Vcurrent_global_map, symbol, Qself_insert_command);
8401dcd2d43a [xemacs-hg @ 2002-08-22 11:34:20 by stephent]
stephent
parents: 960
diff changeset
155 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
156 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
157 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
158
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
159 void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
160 x_has_keysym (KeySym keysym, Lisp_Object hash_table, int with_modifiers)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
161 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
162 KeySym upper_lower[2];
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
163 int j;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
164
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
165 if (keysym < 0x80) /* Optimize for ASCII keysyms */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
166 return;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
167
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
168 /* If you execute:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
169 xmodmap -e 'keysym NN = scaron'
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
170 and then press (Shift scaron), X11 will return the different
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
171 keysym `Scaron', but `xmodmap -pke' might not even mention `Scaron'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
172 So we "register" both `scaron' and `Scaron'. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
173 #ifdef HAVE_XCONVERTCASE
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
174 XConvertCase (keysym, &upper_lower[0], &upper_lower[1]);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
175 #else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
176 upper_lower[0] = upper_lower[1] = keysym;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
177 #endif
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
178
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
179 for (j = 0; j < (upper_lower[0] == upper_lower[1] ? 1 : 2); j++)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
180 {
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
181 Extbyte *name;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
182 keysym = upper_lower[j];
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
183
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
184 name = XKeysymToString (keysym);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
185 if (name)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
186 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
187 /* X guarantees NAME to be in the Host Portable Character Encoding */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
188 Lisp_Object sym = x_keysym_to_emacs_keysym (keysym, 0);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
189 Lisp_Object new_value = with_modifiers ? Qt : Qsans_modifiers;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
190 Lisp_Object old_value = Fgethash (sym, hash_table, Qnil);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
191
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
192 if (! EQ (old_value, new_value)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
193 && ! (EQ (old_value, Qsans_modifiers) &&
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
194 EQ (new_value, Qt)))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
195 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
196 maybe_define_x_key_as_self_inserting_character (keysym, sym);
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
197 Fputhash (build_ext_string (name, Qbinary), new_value,
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
198 hash_table);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
199 Fputhash (sym, new_value, hash_table);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
200 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
201 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
202 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
203 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
204
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 x_reset_key_mapping (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 Display *display = DEVICE_X_DISPLAY (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 struct x_device *xd = DEVICE_X_DATA (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 KeySym *keysym, *keysym_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 Lisp_Object hash_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 int key_code_count, keysyms_per_code;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 if (xd->x_keysym_map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 XFree ((char *) xd->x_keysym_map);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 XDisplayKeycodes (display,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 &xd->x_keysym_map_min_code,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 &xd->x_keysym_map_max_code);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 key_code_count = xd->x_keysym_map_max_code - xd->x_keysym_map_min_code + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 xd->x_keysym_map =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 XGetKeyboardMapping (display, xd->x_keysym_map_min_code, key_code_count,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 &xd->x_keysym_map_keysyms_per_code);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 hash_table = xd->x_keysym_map_hash_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 if (HASH_TABLEP (hash_table))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 Fclrhash (hash_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 xd->x_keysym_map_hash_table = hash_table =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 make_lisp_hash_table (128, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 for (keysym = xd->x_keysym_map,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 keysyms_per_code = xd->x_keysym_map_keysyms_per_code,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 keysym_end = keysym + (key_code_count * keysyms_per_code);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 keysym < keysym_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 keysym += keysyms_per_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 int j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 if (keysym[0] == NoSymbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
242 x_has_keysym (keysym[0], hash_table, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 for (j = 1; j < keysyms_per_code; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 if (keysym[j] != keysym[0] &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 keysym[j] != NoSymbol)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
248 x_has_keysym (keysym[j], hash_table, 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
253 static const Ascbyte *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 index_to_name (int indice)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 switch (indice)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 case ShiftMapIndex: return "ModShift";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 case LockMapIndex: return "ModLock";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 case ControlMapIndex: return "ModControl";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 case Mod1MapIndex: return "Mod1";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 case Mod2MapIndex: return "Mod2";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 case Mod3MapIndex: return "Mod3";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 case Mod4MapIndex: return "Mod4";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 case Mod5MapIndex: return "Mod5";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 default: return "???";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
270 /* X bogusly doesn't define the interpretations of any bits besides
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
271 ModControl, ModShift, and ModLock; so the Interclient Communication
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
272 Conventions Manual says that we have to bend over backwards to figure
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
273 out what the other modifier bits mean. According to ICCCM:
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
274
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
275 - Any keycode which is assigned ModControl is a "control" key.
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
276
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
277 - Any modifier bit which is assigned to a keycode which generates Meta_L
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
278 or Meta_R is the modifier bit meaning "meta". Likewise for Super, Hyper,
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
279 etc.
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
280
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
281 - Any keypress event which contains ModControl in its state should be
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
282 interpreted as a "control" character.
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
283
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
284 - Any keypress event which contains a modifier bit in its state which is
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
285 generated by a keycode whose corresponding keysym is Meta_L or Meta_R
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
286 should be interpreted as a "meta" character. Likewise for Super, Hyper,
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
287 etc.
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
288
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
289 - It is illegal for a keysym to be associated with more than one modifier
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
290 bit.
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
291
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
292 This means that the only thing that emacs can reasonably interpret as a
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
293 "meta" key is a key whose keysym is Meta_L or Meta_R, and which generates
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
294 one of the modifier bits Mod1-Mod5.
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
295
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
296 Unfortunately, many keyboards don't have Meta keys in their default
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
297 configuration. So, if there are no Meta keys, but there are "Alt" keys,
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
298 emacs will interpret Alt as Meta. If there are both Meta and Alt keys,
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
299 then the Meta keys mean "Meta", and the Alt keys mean "Alt" (it used to
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
300 mean "Symbol," but that just confused the hell out of way too many people).
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
301
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
302 This works with the default configurations of the 19 keyboard-types I've
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
303 checked.
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
304
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
305 Emacs detects keyboard configurations which violate the above rules, and
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
306 gives a warning. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 x_reset_modifier_mapping (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 Display *display = DEVICE_X_DISPLAY (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 struct x_device *xd = DEVICE_X_DATA (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 int modifier_index, modifier_key, column, mkpm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 int warned_about_overlapping_modifiers = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 int warned_about_predefined_modifiers = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 int warned_about_duplicate_modifiers = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 int meta_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 int hyper_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 int super_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 int alt_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 int mode_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 xd->lock_interpretation = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 if (xd->x_modifier_keymap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 XFreeModifiermap (xd->x_modifier_keymap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 x_reset_key_mapping (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 xd->x_modifier_keymap = XGetModifierMapping (display);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 /* Boy, I really wish C had local functions...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 /* The call to warn_when_safe must be on the same line as the string or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 make-msgfile won't pick it up properly (the newline doesn't confuse
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 it, but the backslash does). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 #define modwarn(name,old,other) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 warn_when_safe (Qkey_mapping, Qwarning, "XEmacs: %s (0x%x) generates %s, which is generated by %s.", \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 name, code, index_to_name (old), other), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 warned_about_overlapping_modifiers = 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 #define modbarf(name,other) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 warn_when_safe (Qkey_mapping, Qwarning, "XEmacs: %s (0x%x) generates %s, which is nonsensical.", \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 name, code, other), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 warned_about_predefined_modifiers = 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 #define check_modifier(name,mask) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 if ((1<<modifier_index) != mask) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 warn_when_safe (Qkey_mapping, Qwarning, "XEmacs: %s (0x%x) generates %s, which is nonsensical.", \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 name, code, index_to_name (modifier_index)), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 warned_about_predefined_modifiers = 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 #define store_modifier(name,old) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 if (old && old != modifier_index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 warn_when_safe (Qkey_mapping, Qwarning, "XEmacs: %s (0x%x) generates both %s and %s, which is nonsensical.",\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 name, code, index_to_name (old), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 index_to_name (modifier_index)), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 warned_about_duplicate_modifiers = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 if (modifier_index == ShiftMapIndex) modbarf (name,"ModShift"); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 else if (modifier_index == LockMapIndex) modbarf (name,"ModLock"); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 else if (modifier_index == ControlMapIndex) modbarf (name,"ModControl"); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 else if (sym == XK_Mode_switch) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 mode_bit = modifier_index; /* Mode_switch is special, see below... */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 else if (modifier_index == meta_bit && old != meta_bit) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 modwarn (name, meta_bit, "Meta"); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 else if (modifier_index == super_bit && old != super_bit) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 modwarn (name, super_bit, "Super"); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 else if (modifier_index == hyper_bit && old != hyper_bit) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 modwarn (name, hyper_bit, "Hyper"); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 else if (modifier_index == alt_bit && old != alt_bit) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 modwarn (name, alt_bit, "Alt"); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 old = modifier_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 mkpm = xd->x_modifier_keymap->max_keypermod;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 for (modifier_index = 0; modifier_index < 8; modifier_index++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 for (modifier_key = 0; modifier_key < mkpm; modifier_key++) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 KeySym last_sym = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 for (column = 0; column < 4; column += 2) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 KeyCode code = xd->x_modifier_keymap->modifiermap[modifier_index * mkpm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 + modifier_key];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 KeySym sym = (code ? XKeycodeToKeysym (display, code, column) : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 if (sym == last_sym) continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 last_sym = sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 switch (sym) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 case XK_Mode_switch:store_modifier ("Mode_switch", mode_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 case XK_Meta_L: store_modifier ("Meta_L", meta_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 case XK_Meta_R: store_modifier ("Meta_R", meta_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 case XK_Super_L: store_modifier ("Super_L", super_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 case XK_Super_R: store_modifier ("Super_R", super_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 case XK_Hyper_L: store_modifier ("Hyper_L", hyper_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 case XK_Hyper_R: store_modifier ("Hyper_R", hyper_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 case XK_Alt_L: store_modifier ("Alt_L", alt_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 case XK_Alt_R: store_modifier ("Alt_R", alt_bit); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 case XK_Control_L: check_modifier ("Control_L", ControlMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 case XK_Control_R: check_modifier ("Control_R", ControlMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 case XK_Shift_L: check_modifier ("Shift_L", ShiftMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 case XK_Shift_R: check_modifier ("Shift_R", ShiftMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 case XK_Shift_Lock: check_modifier ("Shift_Lock", LockMask);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 xd->lock_interpretation = XK_Shift_Lock; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 case XK_Caps_Lock: check_modifier ("Caps_Lock", LockMask);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 xd->lock_interpretation = XK_Caps_Lock; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 /* It probably doesn't make any sense for a modifier bit to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 assigned to a key that is not one of the above, but OpenWindows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 assigns modifier bits to a couple of random function keys for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 no reason that I can discern, so printing a warning here would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 be annoying. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 #undef store_modifier
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 #undef check_modifier
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 #undef modwarn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 #undef modbarf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 /* If there was no Meta key, then try using the Alt key instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 If there is both a Meta key and an Alt key, then the Alt key
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 is not disturbed and remains an Alt key. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 if (! meta_bit && alt_bit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 meta_bit = alt_bit, alt_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 /* mode_bit overrides everything, since it's processed down inside of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 XLookupString() instead of by us. If Meta and Mode_switch both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 generate the same modifier bit (which is an error), then we don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 interpret that bit as Meta, because we can't make XLookupString()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 not interpret it as Mode_switch; and interpreting it as both would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 be totally wrong. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 if (mode_bit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 {
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
433 const Ascbyte *warn = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 if (mode_bit == meta_bit) warn = "Meta", meta_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 else if (mode_bit == hyper_bit) warn = "Hyper", hyper_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 else if (mode_bit == super_bit) warn = "Super", super_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 else if (mode_bit == alt_bit) warn = "Alt", alt_bit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 if (warn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 warn_when_safe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 (Qkey_mapping, Qwarning,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 "XEmacs: %s is being used for both Mode_switch and %s.",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 index_to_name (mode_bit), warn),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 warned_about_overlapping_modifiers = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 #undef index_to_name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 xd->MetaMask = (meta_bit ? (1 << meta_bit) : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 xd->HyperMask = (hyper_bit ? (1 << hyper_bit) : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 xd->SuperMask = (super_bit ? (1 << super_bit) : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 xd->AltMask = (alt_bit ? (1 << alt_bit) : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 xd->ModeMask = (mode_bit ? (1 << mode_bit) : 0); /* unused */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 if (warned_about_overlapping_modifiers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 warn_when_safe (Qkey_mapping, Qwarning, "\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 " Two distinct modifier keys (such as Meta and Hyper) cannot generate\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 " the same modifier bit, because Emacs won't be able to tell which\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 " modifier was actually held down when some other key is pressed. It\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 " won't be able to tell Meta-x and Hyper-x apart, for example. Change\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 " one of these keys to use some other modifier bit. If you intend for\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 " these keys to have the same behavior, then change them to have the\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 " same keysym as well as the same modifier bit.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 if (warned_about_predefined_modifiers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 warn_when_safe (Qkey_mapping, Qwarning, "\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 " The semantics of the modifier bits ModShift, ModLock, and ModControl\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 " are predefined. It does not make sense to assign ModControl to any\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 " keysym other than Control_L or Control_R, or to assign any modifier\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 " bits to the \"control\" keysyms other than ModControl. You can't\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 " turn a \"control\" key into a \"meta\" key (or vice versa) by simply\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 " assigning the key a different modifier bit. You must also make that\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 " key generate an appropriate keysym (Control_L, Meta_L, etc).");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 /* No need to say anything more for warned_about_duplicate_modifiers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 if (warned_about_overlapping_modifiers || warned_about_predefined_modifiers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 warn_when_safe (Qkey_mapping, Qwarning, "\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 " The meanings of the modifier bits Mod1 through Mod5 are determined\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 " by the keysyms used to control those bits. Mod1 does NOT always\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 " mean Meta, although some non-ICCCM-compliant programs assume that.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 x_init_modifier_mapping (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 struct x_device *xd = DEVICE_X_DATA (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 xd->x_keysym_map_hash_table = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 xd->x_keysym_map = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 xd->x_modifier_keymap = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 x_reset_modifier_mapping (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 x_key_is_modifier_p (KeyCode keycode, struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 struct x_device *xd = DEVICE_X_DATA (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 KeySym *syms;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 if (keycode < xd->x_keysym_map_min_code ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 keycode > xd->x_keysym_map_max_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 syms = &xd->x_keysym_map [(keycode - xd->x_keysym_map_min_code) *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 xd->x_keysym_map_keysyms_per_code];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 for (i = 0; i < xd->x_keysym_map_keysyms_per_code; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 if (IsModifierKey (syms [i]) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 syms [i] == XK_Mode_switch) /* why doesn't IsModifierKey count this? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 /* key-handling code is always ugly. It just ends up working out
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 that way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 Here are some pointers:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 -- DOWN_MASK indicates which modifiers should be treated as "down"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 when the corresponding upstroke happens. It gets reset for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 a particular modifier when that modifier goes up, and reset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 for all modifiers when a non-modifier key is pressed. Example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 I press Control-A-Shift and then release Control-A-Shift.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 I want the Shift key to be sticky but not the Control key.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 -- LAST_DOWNKEY and RELEASE_TIME are used to keep track of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 auto-repeat -- see below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 -- If a modifier key is sticky, I can unstick it by pressing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 the modifier key again. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 x_handle_sticky_modifiers (XEvent *ev, struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 struct x_device *xd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 KeyCode keycode;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 int type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 if (!modifier_keys_are_sticky) /* Optimize for non-sticky modifiers */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 xd = DEVICE_X_DATA (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 keycode = ev->xkey.keycode;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 type = ev->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 if (keycode < xd->x_keysym_map_min_code ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 keycode > xd->x_keysym_map_max_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 if (! ((type == KeyPress || type == KeyRelease) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 x_key_is_modifier_p (keycode, d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 { /* Not a modifier key */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 Bool key_event_p = (type == KeyPress || type == KeyRelease);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
557 if (type == ButtonPress
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
558 || (type == KeyPress
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
559 && ((xd->last_downkey
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
560 && ((keycode != xd->last_downkey
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
561 || ev->xkey.time != xd->release_time)))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
562 || (INTP (Vmodifier_keys_sticky_time)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
563 && ev->xkey.time
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
564 > (xd->modifier_release_time
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
565 + XINT (Vmodifier_keys_sticky_time))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 xd->need_to_add_mask = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 xd->last_downkey = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 }
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
570 else if (type == KeyPress && !xd->last_downkey)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
571 xd->last_downkey = keycode;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
572
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 if (type == KeyPress)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 xd->release_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 if (type == KeyPress || type == ButtonPress)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
576 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
577 xd->down_mask = 0;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
578 xd->modifier_release_time = 0;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
579 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 if (key_event_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 ev->xkey.state |= xd->need_to_add_mask;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 ev->xbutton.state |= xd->need_to_add_mask;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 if (type == KeyRelease && keycode == xd->last_downkey)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 /* If I hold press-and-release the Control key and then press
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 and hold down the right arrow, I want it to auto-repeat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 Control-Right. On the other hand, if I do the same but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 manually press the Right arrow a bunch of times, I want
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 to see one Control-Right and then a bunch of Rights.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 This means that we need to distinguish between an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 auto-repeated key and a key pressed and released a bunch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 of times.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 Naturally, the designers of the X spec didn't see fit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 to provide an obvious way to distinguish these cases.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 So we assume that if the release and the next press
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 occur at the same time, the key was actually auto-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 repeated. Under Open-Windows, at least, this works. */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
601 xd->modifier_release_time = xd->release_time
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
602 = key_event_p ? ev->xkey.time : ev->xbutton.time;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 else /* Modifier key pressed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 KeySym *syms = &xd->x_keysym_map [(keycode - xd->x_keysym_map_min_code) *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 xd->x_keysym_map_keysyms_per_code];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 /* If a non-modifier key was pressed in the middle of a bunch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 of modifiers, then it unsticks all the modifiers that were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 previously pressed. We cannot unstick the modifiers until
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 now because we want to check for auto-repeat of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 non-modifier key. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 if (xd->last_downkey)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 xd->last_downkey = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 xd->need_to_add_mask = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
622 if (xd->modifier_release_time
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
623 && INTP (Vmodifier_keys_sticky_time)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
624 && (ev->xkey.time
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
625 > xd->modifier_release_time + XINT (Vmodifier_keys_sticky_time)))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
626 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
627 xd->need_to_add_mask = 0;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
628 xd->down_mask = 0;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
629 }
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
630
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 #define FROB(mask) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 if (type == KeyPress) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 /* If modifier key is already sticky, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 then unstick it. Note that we do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 not test down_mask to deal with the \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 unlikely but possible case that the \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 modifier key auto-repeats. */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 if (xd->need_to_add_mask & mask) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 xd->need_to_add_mask &= ~mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 xd->down_mask &= ~mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 xd->down_mask |= mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 if (xd->down_mask & mask) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 xd->down_mask &= ~mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 xd->need_to_add_mask |= mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 } \
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
656 xd->modifier_release_time = ev->xkey.time; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 for (i = 0; i < xd->x_keysym_map_keysyms_per_code; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 switch (syms[i])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 case XK_Control_L: case XK_Control_R: FROB (ControlMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 case XK_Shift_L: case XK_Shift_R: FROB (ShiftMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 case XK_Meta_L: case XK_Meta_R: FROB (xd->MetaMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 case XK_Super_L: case XK_Super_R: FROB (xd->SuperMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 case XK_Hyper_L: case XK_Hyper_R: FROB (xd->HyperMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 case XK_Alt_L: case XK_Alt_R: FROB (xd->AltMask); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 clear_sticky_modifiers (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 struct x_device *xd = DEVICE_X_DATA (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 xd->need_to_add_mask = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 xd->last_downkey = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 xd->release_time = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 xd->down_mask = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 keysym_obeys_caps_lock_p (KeySym sym, struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 struct x_device *xd = DEVICE_X_DATA (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 /* Eeeeevil hack. Don't apply Caps_Lock to things that aren't alphabetic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 characters, where "alphabetic" means something more than simply A-Z.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 That is, if Caps_Lock is down, typing ESC doesn't produce Shift-ESC.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 But if shift-lock is down, then it does. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 if (xd->lock_interpretation == XK_Shift_Lock)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 ((sym >= XK_A) && (sym <= XK_Z)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 ((sym >= XK_a) && (sym <= XK_z)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 ((sym >= XK_agrave) && (sym <= XK_odiaeresis)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 ((sym >= XK_Ooblique) && (sym <= XK_Thorn)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 ((sym >= XK_oslash) && (sym <= XK_thorn));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 /* called from EmacsFrame.c (actually from Xt itself) when a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 MappingNotify event is received. In its infinite wisdom, Xt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 decided that Xt event handlers never get MappingNotify events.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 O'Reilly Xt Programming Manual 9.1.2 says:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 MappingNotify is automatically handled by Xt, so it isn't passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 to event handlers and you don't need to worry about it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 Of course, we DO worry about it, so we need a special translation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
714 emacs_Xt_mapping_action (Widget UNUSED (w), XEvent *event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 struct device *d = get_device_from_display (event->xany.display);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 if (DEVICE_X_BEING_DELETED (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 /* nyet. Now this is handled by Xt. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 XRefreshKeyboardMapping (&event->xmapping);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 /* xmodmap generates about a billion MappingKeyboard events, followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 by a single MappingModifier event, so it might be worthwhile to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 take extra MappingKeyboard events out of the queue before requesting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 the current keymap from the server. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 switch (event->xmapping.request)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 case MappingKeyboard: x_reset_key_mapping (d); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 case MappingModifier: x_reset_modifier_mapping (d); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 case MappingPointer: /* Do something here? */ break;
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
733 default: ABORT();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 /* X to Emacs event conversion */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 x_keysym_to_emacs_keysym (KeySym keysym, int simple_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 {
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
745 Extbyte *name;
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
746 DECLARE_EISTRING(einame);
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
747
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 if (keysym >= XK_exclam && keysym <= XK_asciitilde)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 /* We must assume that the X keysym numbers for the ASCII graphic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 characters are the same as their ASCII codes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 return make_char (keysym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 switch (keysym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 /* These would be handled correctly by the default case, but by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 special-casing them here we don't garbage a string or call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 intern(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 case XK_BackSpace: return QKbackspace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 case XK_Tab: return QKtab;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 case XK_Linefeed: return QKlinefeed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 case XK_Return: return QKreturn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 case XK_Escape: return QKescape;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 case XK_space: return QKspace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 case XK_Delete: return QKdelete;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 case 0: return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 if (simple_p) return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 name = XKeysymToString (keysym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 if (!name || !name[0])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 /* This happens if there is a mismatch between the Xlib of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 XEmacs and the Xlib of the X server...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 Let's hard-code in some knowledge of common keysyms introduced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 in recent X11 releases. Snarfed from X11/keysymdef.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 Probably we should add some stuff here for X11R6. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 switch (keysym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 case 0xFF95: return KEYSYM ("kp-home");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 case 0xFF96: return KEYSYM ("kp-left");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 case 0xFF97: return KEYSYM ("kp-up");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 case 0xFF98: return KEYSYM ("kp-right");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 case 0xFF99: return KEYSYM ("kp-down");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 case 0xFF9A: return KEYSYM ("kp-prior");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 case 0xFF9B: return KEYSYM ("kp-next");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 case 0xFF9C: return KEYSYM ("kp-end");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 case 0xFF9D: return KEYSYM ("kp-begin");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 case 0xFF9E: return KEYSYM ("kp-insert");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 case 0xFF9F: return KEYSYM ("kp-delete");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 case 0x1005FF10: return KEYSYM ("SunF36"); /* labeled F11 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 case 0x1005FF11: return KEYSYM ("SunF37"); /* labeled F12 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 {
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
795 Ascbyte buf [64];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 sprintf (buf, "unknown-keysym-0x%X", (int) keysym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 return KEYSYM (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 }
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
800
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 /* If it's got a one-character name, that's good enough. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 if (!name[1])
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
803 return make_char ((Ichar)name[0]);
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
804
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
805 /* In theory the Host Portable Character Set is just ASCII, but
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
806 trusting X11 implementors to get that right is likely to lead to
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
807 tears. */
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
808 eicpy_ext(einame, name, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 /* If it's in the "Keyboard" character set, downcase it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 The case of those keysyms is too totally random for us to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 force anyone to remember them.
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
813 The case of the other character sets is significant, however. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 if ((((unsigned int) keysym) & (~0x1FF)) == ((unsigned int) 0xFE00))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 {
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
816 Ibyte *iname;
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
817 eilwr(einame);
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
818
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
819 for (iname = eidata(einame); *iname != '\0';)
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
820 {
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
821 if (*iname == '_')
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
822 {
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
823 *iname = '-';
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
824 }
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
825 INC_IBYTEPTR(iname);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 }
2837
c1ec282bb160 [xemacs-hg @ 2005-06-29 09:47:33 by crestani]
crestani
parents: 2828
diff changeset
828 return KEYSYM ((const CIbyte *) eidata (einame));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 x_to_emacs_keysym (XKeyPressedEvent *event, int simple_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 /* simple_p means don't try too hard (ASCII only) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 KeySym keysym = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 #ifdef HAVE_XIM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 int len;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
840 /* Some implementations of XmbLookupString don't return
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
841 XBufferOverflow correctly, so increase the size of the xim input
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
842 buffer from 64 to the more reasonable size 513, as Emacs has done.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
843 From Kenichi Handa. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
844 char buffer[513];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 char *bufptr = buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 int bufsiz = sizeof (buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 Status status;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 #ifdef XIM_XLIB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 XIC xic = FRAME_X_XIC (x_any_window_to_frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 (get_device_from_display (event->display),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 event->window));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 #endif /* XIM_XLIB */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 #endif /* HAVE_XIM */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 /* We use XLookupString if we're not using XIM, or are using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 XIM_XLIB but input context creation failed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 #if ! (defined (HAVE_XIM) && defined (XIM_MOTIF))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 #if defined (HAVE_XIM) && defined (XIM_XLIB)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 if (!xic)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 #endif /* XIM_XLIB */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 /* Apparently it's necessary to specify a dummy here (rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 than passing in 0) to avoid crashes on German IRIX */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 char dummy[256];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 XLookupString (event, dummy, 200, &keysym, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 return (IsModifierKey (keysym) || keysym == XK_Mode_switch )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 ? Qnil : x_keysym_to_emacs_keysym (keysym, simple_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 #endif /* ! XIM_MOTIF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 #ifdef HAVE_XIM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 Lookup_String: /* Come-From XBufferOverflow */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 #ifdef XIM_MOTIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 len = XmImMbLookupString (XtWindowToWidget (event->display, event->window),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 event, bufptr, bufsiz, &keysym, &status);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 #else /* XIM_XLIB */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 if (xic)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 len = XmbLookupString (xic, event, bufptr, bufsiz, &keysym, &status);
1494
210683f31426 [xemacs-hg @ 2003-05-22 06:09:03 by stephent]
stephent
parents: 1318
diff changeset
879 #endif /* XIM_MOTIF */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 #ifdef DEBUG_XEMACS
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
882 if (debug_x_events > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 stderr_out (" status=");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 #define print_status_when(S) if (status == S) stderr_out (#S)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 print_status_when (XLookupKeySym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 print_status_when (XLookupBoth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 print_status_when (XLookupChars);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 print_status_when (XLookupNone);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 print_status_when (XBufferOverflow);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 if (status == XLookupKeySym || status == XLookupBoth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 stderr_out (" keysym=%s", XKeysymToString (keysym));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 if (status == XLookupChars || status == XLookupBoth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 if (len != 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 int j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 stderr_out (" chars=\"");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 for (j=0; j<len; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 stderr_out ("%c", bufptr[j]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 stderr_out ("\"");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 else if (bufptr[0] <= 32 || bufptr[0] >= 127)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 stderr_out (" char=0x%x", bufptr[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 stderr_out (" char=%c", bufptr[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 stderr_out ("\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 #endif /* DEBUG_XEMACS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 switch (status)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 case XLookupKeySym:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 case XLookupBoth:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 return (IsModifierKey (keysym) || keysym == XK_Mode_switch )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 ? Qnil : x_keysym_to_emacs_keysym (keysym, simple_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 case XLookupChars:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 /* Generate multiple emacs events */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 struct device *d = get_device_from_display (event->display);
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 863
diff changeset
924 Ichar ch;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 Lisp_Object instream, fb_instream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 Lstream *istr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
929 fb_instream = make_fixed_buffer_input_stream (bufptr, len);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
930
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
931 /* #### Use get_coding_system_for_text_file (Vcomposed_input_coding_system, 0) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 instream =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
933 make_coding_input_stream
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
934 (XLSTREAM (fb_instream), Qundecided, CODING_DECODE, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 istr = XLSTREAM (instream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 GCPRO2 (instream, fb_instream);
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 863
diff changeset
939 while ((ch = Lstream_get_ichar (istr)) != EOF)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
942 Lisp_Event *ev = XEVENT (emacs_event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 ev->channel = DEVICE_CONSOLE (d);
960
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 943
diff changeset
944 ev->timestamp = event->time;
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 943
diff changeset
945 XSET_EVENT_TYPE (emacs_event, key_press_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
946 XSET_EVENT_KEY_MODIFIERS (emacs_event, 0);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
947 XSET_EVENT_KEY_KEYSYM (emacs_event, make_char (ch));
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
948 enqueue_dispatch_event (emacs_event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 Lstream_close (istr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 Lstream_delete (istr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 Lstream_delete (XLSTREAM (fb_instream));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 case XLookupNone: return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 case XBufferOverflow:
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
958 /* !!#### needs work */
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 826
diff changeset
959 bufptr = (char *) ALLOCA (len+1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 bufsiz = len+1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 goto Lookup_String;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 }
801
2b676dc88c66 [xemacs-hg @ 2002-04-01 03:58:02 by ben]
ben
parents: 800
diff changeset
963 return Qnil; /* not (usually) reached */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 #endif /* HAVE_XIM */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 set_last_server_timestamp (struct device *d, XEvent *x_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 Time t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 switch (x_event->type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 case KeyPress:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 case KeyRelease: t = x_event->xkey.time; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 case ButtonPress:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 case ButtonRelease: t = x_event->xbutton.time; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 case EnterNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 case LeaveNotify: t = x_event->xcrossing.time; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 case MotionNotify: t = x_event->xmotion.time; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 case PropertyNotify: t = x_event->xproperty.time; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 case SelectionClear: t = x_event->xselectionclear.time; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 case SelectionRequest: t = x_event->xselectionrequest.time; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 case SelectionNotify: t = x_event->xselection.time; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 default: return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 DEVICE_X_LAST_SERVER_TIMESTAMP (d) = t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 static int
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
990 x_event_to_emacs_event (XEvent *x_event, Lisp_Event *emacs_event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 Display *display = x_event->xany.display;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 struct device *d = get_device_from_display (display);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 struct x_device *xd = DEVICE_X_DATA (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 if (DEVICE_X_BEING_DELETED (d))
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
997 {
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
998 /* [[ Uh, is this 0 correct? ]]
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
999
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1000 Yup--it means emacs_Xt_event_handler, the only place that calls
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1001 this, doesn't queue the emacs_event dispatch, instead immediately
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1002 deallocating it. */
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1003 return 0;
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1004 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 set_last_server_timestamp (d, x_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 switch (x_event->type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 case KeyRelease:
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1011 {
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1012 x_handle_sticky_modifiers (x_event, d);
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1013 return 0;
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1014 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 case KeyPress:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 case ButtonPress:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 case ButtonRelease:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1019 int modifiers = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 int shift_p, lock_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 Bool key_event_p = (x_event->type == KeyPress);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 unsigned int *state =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 key_event_p ? &x_event->xkey.state : &x_event->xbutton.state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 /* If this is a synthetic KeyPress or Button event, and the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 has expressed a disinterest in this security hole, then drop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 it on the floor. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 if ((key_event_p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 ? x_event->xkey.send_event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 : x_event->xbutton.send_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 #ifdef EXTERNAL_WIDGET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 /* ben: events get sent to an ExternalShell using XSendEvent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 This is not a perfect solution. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 && !FRAME_X_EXTERNAL_WINDOW_P
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 (x_any_window_to_frame (d, x_event->xany.window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 && !x_allow_sendevents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 DEVICE_X_MOUSE_TIMESTAMP (d) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 key_event_p ? x_event->xkey.time : x_event->xbutton.time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 x_handle_sticky_modifiers (x_event, d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1046 if (*state & ControlMask) modifiers |= XEMACS_MOD_CONTROL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1047 if (*state & xd->MetaMask) modifiers |= XEMACS_MOD_META;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1048 if (*state & xd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1049 if (*state & xd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1050 if (*state & xd->AltMask) modifiers |= XEMACS_MOD_ALT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1051 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1052 int numero_de_botao = -1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1053
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1054 if (!key_event_p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1055 numero_de_botao = x_event->xbutton.button;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1056
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1057 /* the button gets noted either in the button or the modifiers
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1058 field, but not both. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1059 if (numero_de_botao != 1 && (*state & Button1Mask))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1060 modifiers |= XEMACS_MOD_BUTTON1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1061 if (numero_de_botao != 2 && (*state & Button2Mask))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1062 modifiers |= XEMACS_MOD_BUTTON2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1063 if (numero_de_botao != 3 && (*state & Button3Mask))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1064 modifiers |= XEMACS_MOD_BUTTON3;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1065 if (numero_de_botao != 4 && (*state & Button4Mask))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1066 modifiers |= XEMACS_MOD_BUTTON4;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1067 if (numero_de_botao != 5 && (*state & Button5Mask))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1068 modifiers |= XEMACS_MOD_BUTTON5;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1069 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 /* Ignore the Caps_Lock key if:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 - any other modifiers are down, so that Caps_Lock doesn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 turn C-x into C-X, which would suck.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 - the event was a mouse event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 if (modifiers || ! key_event_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 *state &= (~LockMask);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 shift_p = *state & ShiftMask;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 lock_p = *state & LockMask;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 if (shift_p || lock_p)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1082 modifiers |= XEMACS_MOD_SHIFT;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 if (key_event_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 Lisp_Object keysym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 XKeyEvent *ev = &x_event->xkey;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 /* This used to compute the frame from the given X window and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 store it here, but we really don't care about the frame. */
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1090 SET_EVENT_CHANNEL (emacs_event, DEVICE_CONSOLE (d));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 keysym = x_to_emacs_keysym (&x_event->xkey, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 /* If the emacs keysym is nil, then that means that the X
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 keysym was either a Modifier or NoSymbol, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 probably means that we're in the midst of reading a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 Multi_key sequence, or a "dead" key prefix, or XIM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 input. Ignore it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 if (NILP (keysym))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 /* More Caps_Lock garbage: Caps_Lock should *only* add the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 shift modifier to two-case keys (that is, A-Z and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 related characters). So at this point (after looking up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 the keysym) if the keysym isn't a dual-case alphabetic,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 and if the caps lock key was down but the shift key
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 wasn't, then turn off the shift modifier. Gag barf */
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1107
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 /* #### type lossage: assuming equivalence of emacs and
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1109 X keysyms
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1110
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1111 The right thing to do here is to have pass a third, pointer,
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1112 argument to x_to_emacs_keysym, where it should store the
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1113 intermediate KeySym it used to calculate the string XEmacs
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1114 keysym. Then we can call keysym_obeys_caps_lock_p with
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1115 exactly the right argument. */
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1116 /* !!#### maybe fix for Mule
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1117
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1118 Hard, in the absence of a full case infrastructure for
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1119 Mule characters. When
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1120 (downcase (make-char 'cyrillic-iso8859-5 73))
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1121 works, we should revisit it. */
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1122
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 if (lock_p && !shift_p &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 ! (CHAR_OR_CHAR_INTP (keysym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 && keysym_obeys_caps_lock_p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 ((KeySym) XCHAR_OR_CHAR_INT (keysym), d)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1127 modifiers &= (~XEMACS_MOD_SHIFT);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 /* If this key contains two distinct keysyms, that is,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 "shift" generates a different keysym than the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 non-shifted key, then don't apply the shift modifier
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 bit: it's implicit. Otherwise, if there would be no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 other way to tell the difference between the shifted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 and unshifted version of this key, apply the shift bit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 Non-graphics, like Backspace and F1 get the shift bit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 in the modifiers slot. Neither the characters "a",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 "A", "2", nor "@" normally have the shift bit set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 However, "F1" normally does. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1139 if (modifiers & XEMACS_MOD_SHIFT)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 int Mode_switch_p = *state & xd->ModeMask;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 KeySym bot = XLookupKeysym (ev, Mode_switch_p ? 2 : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 KeySym top = XLookupKeysym (ev, Mode_switch_p ? 3 : 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 if (top && bot && top != bot)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1145 modifiers &= ~XEMACS_MOD_SHIFT;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 }
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1147 set_event_type (emacs_event, key_press_event);
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1148 SET_EVENT_TIMESTAMP (emacs_event, ev->time);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1149 SET_EVENT_KEY_MODIFIERS (emacs_event, modifiers);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1150 SET_EVENT_KEY_KEYSYM (emacs_event, keysym);
2828
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1151
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1152 if (ev->keycode >= FIRST_ALPHABETIC_QWERTY_KEYCODE
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1153 && ev->keycode <= LAST_ALPHABETIC_QWERTY_KEYCODE)
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1154 {
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1155 /* This correspondence isn't guaranteed by the standards, to
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1156 my knowledge. Also, it's incomplete--doesn't include the
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1157 upper-case characters, etc--I need to get some feedback
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1158 on it once this is out in the world and actually being
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1159 used by Russians. */
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1160 static const Ascbyte qwerty_map[] =
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1161 { 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1162 '[', ']', '\015', '\014',
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1163 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1164 ';', '\'', '`', 0, '\\',
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1165 'z', 'x', 'c', 'v', 'b', 'n', 'm' };
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1166 Ichar val = qwerty_map
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1167 [ev->keycode - FIRST_ALPHABETIC_QWERTY_KEYCODE];
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1168 if (val)
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1169 {
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1170 SET_EVENT_KEY_ALT_KEYCHARS(emacs_event, KEYCHAR_QWERTY,
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1171 val);
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1172 }
a25c824ed558 [xemacs-hg @ 2005-06-26 18:04:49 by aidan]
aidan
parents: 2699
diff changeset
1173 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 else /* Mouse press/release event */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 XButtonEvent *ev = &x_event->xbutton;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 struct frame *frame = x_window_to_frame (d, ev->window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 if (! frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 return 0; /* not for us */
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1182 set_event_type (emacs_event, (x_event->type == ButtonPress) ?
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1183 button_press_event : button_release_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1184 SET_EVENT_CHANNEL (emacs_event, wrap_frame (frame));
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1185
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1186 SET_EVENT_BUTTON_MODIFIERS (emacs_event, modifiers);
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1187 SET_EVENT_TIMESTAMP (emacs_event, ev->time);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1188 SET_EVENT_BUTTON_BUTTON (emacs_event, ev->button);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1189 SET_EVENT_BUTTON_X (emacs_event, ev->x);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1190 SET_EVENT_BUTTON_Y (emacs_event, ev->y);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 /* because we don't seem to get a FocusIn event for button clicks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 when a widget-glyph is selected we will assume that we want the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 focus if a button gets pressed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 if (x_event->type == ButtonPress)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 handle_focus_event_1 (frame, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 case MotionNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 XMotionEvent *ev = &x_event->xmotion;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 struct frame *frame = x_window_to_frame (d, ev->window);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1204 int modifiers = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 XMotionEvent event2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 if (! frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 return 0; /* not for us */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 /* We use MotionHintMask, so we will get only one motion event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 until the next time we call XQueryPointer or the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 clicks the mouse. So call XQueryPointer now (meaning that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 the event will be in sync with the server just before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 Fnext_event() returns). If the mouse is still in motion,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 then the server will immediately generate exactly one more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 motion event, which will be on the queue waiting for us
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 next time around. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 event2 = *ev;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 if (XQueryPointer (event2.display, event2.window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 &event2.root, &event2.subwindow,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 &event2.x_root, &event2.y_root,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 &event2.x, &event2.y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 &event2.state))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 ev = &event2; /* only one structure copy */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 DEVICE_X_MOUSE_TIMESTAMP (d) = ev->time;
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1227 SET_EVENT_CHANNEL (emacs_event, wrap_frame (frame));
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1228 set_event_type (emacs_event, pointer_motion_event);
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1229 SET_EVENT_TIMESTAMP (emacs_event, ev->time);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1230 SET_EVENT_MOTION_X (emacs_event, ev->x);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1231 SET_EVENT_MOTION_Y (emacs_event, ev->y);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1232 if (ev->state & ShiftMask) modifiers |= XEMACS_MOD_SHIFT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1233 if (ev->state & ControlMask) modifiers |= XEMACS_MOD_CONTROL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1234 if (ev->state & xd->MetaMask) modifiers |= XEMACS_MOD_META;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1235 if (ev->state & xd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1236 if (ev->state & xd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1237 if (ev->state & xd->AltMask) modifiers |= XEMACS_MOD_ALT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1238 if (ev->state & Button1Mask) modifiers |= XEMACS_MOD_BUTTON1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1239 if (ev->state & Button2Mask) modifiers |= XEMACS_MOD_BUTTON2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1240 if (ev->state & Button3Mask) modifiers |= XEMACS_MOD_BUTTON3;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1241 if (ev->state & Button4Mask) modifiers |= XEMACS_MOD_BUTTON4;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1242 if (ev->state & Button5Mask) modifiers |= XEMACS_MOD_BUTTON5;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 /* Currently ignores Shift_Lock but probably shouldn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 (but it definitely should ignore Caps_Lock). */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1245 SET_EVENT_MOTION_MODIFIERS (emacs_event, modifiers);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 case ClientMessage:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 /* Patch bogus TAKE_FOCUS messages from MWM; CurrentTime is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 passed as the timestamp of the TAKE_FOCUS, which the ICCCM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 explicitly prohibits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 XClientMessageEvent *ev = &x_event->xclient;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 #ifdef HAVE_OFFIX_DND
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1256 if (DndIsDropMessage (x_event))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1258 unsigned int state;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1259 int modifiers = 0;
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1260 int button = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 struct frame *frame = x_any_window_to_frame (d, ev->window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 Extbyte *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 unsigned long size, dtype;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 Lisp_Object l_type = Qnil, l_data = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 Lisp_Object l_dndlist = Qnil, l_item = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 if (! frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 return 0; /* not for us */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1270
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1271 GCPRO4 (l_type, l_data, l_dndlist, l_item);
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1272 set_event_type (emacs_event, misc_user_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1273 SET_EVENT_CHANNEL (emacs_event, wrap_frame (frame));
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1274 SET_EVENT_TIMESTAMP (emacs_event,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1275 DEVICE_X_LAST_SERVER_TIMESTAMP (d));
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1276 state=DndDragButtons (x_event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1278 if (state & ShiftMask) modifiers |= XEMACS_MOD_SHIFT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1279 if (state & ControlMask) modifiers |= XEMACS_MOD_CONTROL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1280 if (state & xd->MetaMask) modifiers |= XEMACS_MOD_META;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1281 if (state & xd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1282 if (state & xd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1283 if (state & xd->AltMask) modifiers |= XEMACS_MOD_ALT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1284 if (state & Button1Mask) modifiers |= XEMACS_MOD_BUTTON1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1285 if (state & Button2Mask) modifiers |= XEMACS_MOD_BUTTON2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1286 if (state & Button3Mask) modifiers |= XEMACS_MOD_BUTTON3;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1287 if (state & Button4Mask) modifiers |= XEMACS_MOD_BUTTON4;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1288 if (state & Button5Mask) modifiers |= XEMACS_MOD_BUTTON5;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 if (state & Button5Mask) button = Button5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 if (state & Button4Mask) button = Button4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 if (state & Button3Mask) button = Button3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 if (state & Button2Mask) button = Button2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 if (state & Button1Mask) button = Button1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1296 SET_EVENT_MISC_USER_MODIFIERS (emacs_event, modifiers);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1297 SET_EVENT_MISC_USER_BUTTON (emacs_event, button);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1298
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1299 DndDropCoordinates (FRAME_X_TEXT_WIDGET (frame), x_event,
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1300 &(EVENT_MISC_USER_X (emacs_event)),
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1301 &(EVENT_MISC_USER_Y (emacs_event)));
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1302 DndGetData (x_event, &data, &size);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1303
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1304 dtype = DndDataType (x_event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 switch (dtype)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 case DndFiles: /* null terminated strings, end null */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 int len;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1310 Ibyte *hurl = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 while (*data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1314 Ibyte *dataint;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1315 len = strlen (data);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1316 EXTERNAL_TO_C_STRING (data, dataint, Qfile_name);
2956
ee35a8fdcfcd [xemacs-hg @ 2005-09-27 05:29:41 by ben]
ben
parents: 2842
diff changeset
1317 hurl = dnd_url_hexify_string (dataint,
ee35a8fdcfcd [xemacs-hg @ 2005-09-27 05:29:41 by ben]
ben
parents: 2842
diff changeset
1318 (const Ibyte *) "file:");
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1319 l_item = build_intstring (hurl);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 l_dndlist = Fcons (l_item, l_dndlist);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 data += len + 1;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1322 xfree (hurl, Ibyte *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 l_type = Qdragdrop_URL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 case DndText:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 l_type = Qdragdrop_MIME;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1329 l_dndlist = list1 (list3 (list1 (build_string ("text/plain")),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1330 build_string ("8bit"),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1331 build_ext_string (data,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1332 Qctext)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 case DndMIME:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 /* we have to parse this in some way to extract
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 content-type and params (in the tm way) and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 content encoding.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 OR: if data is string, let tm do the job
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 if data is list[2], give the first two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 to tm...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 l_type = Qdragdrop_MIME;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1343 l_dndlist = list1 (build_ext_string (data, Qbinary));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 case DndFile:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 case DndDir:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 case DndLink:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 case DndExe:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1350 Ibyte *dataint, *hurl;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1351 EXTERNAL_TO_C_STRING (data, dataint, Qfile_name);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1352 hurl = dnd_url_hexify_string (dataint, "file:");
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1353 l_dndlist = list1 (build_intstring (hurl));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1354 xfree (hurl, Ibyte *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 case DndURL:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 /* as it is a real URL it should already be escaped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 and escaping again will break them (cause % is unsave) */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1360 l_dndlist = list1 (build_ext_string (data,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1361 Qfile_name));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 l_type = Qdragdrop_URL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 default: /* Unknown, RawData and any other type */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1365 l_dndlist = list1 (list3 (list1 (build_string
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1366 ("application/octet-stream")),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1367 build_string ("8bit"),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1368 make_ext_string (data, size,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1369 Qbinary)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 l_type = Qdragdrop_MIME;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1374 SET_EVENT_MISC_USER_FUNCTION (emacs_event,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1375 Qdragdrop_drop_dispatch);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1376 SET_EVENT_MISC_USER_OBJECT (emacs_event,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1377 Fcons (l_type, l_dndlist));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 #endif /* HAVE_OFFIX_DND */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 if (ev->message_type == DEVICE_XATOM_WM_PROTOCOLS (d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 && (Atom) (ev->data.l[0]) == DEVICE_XATOM_WM_TAKE_FOCUS (d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 && (Atom) (ev->data.l[1]) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 ev->data.l[1] = DEVICE_X_LAST_SERVER_TIMESTAMP (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 /* fall through */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 default: /* it's a magic event */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 struct frame *frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 Window w;
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1397 XEvent *x_event_copy;
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1398 SET_EVENT_TYPE (emacs_event, magic_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1399 x_event_copy = &EVENT_MAGIC_X_EVENT (emacs_event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 #define FROB(event_member, window_member) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 x_event_copy->event_member = x_event->event_member; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 w = x_event->event_member.window_member
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 switch (x_event->type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 case SelectionRequest: FROB(xselectionrequest, owner); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 case SelectionClear: FROB(xselectionclear, window); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 case SelectionNotify: FROB(xselection, requestor); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 case PropertyNotify: FROB(xproperty, window); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 case ClientMessage: FROB(xclient, window); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 case ConfigureNotify: FROB(xconfigure, window); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 case Expose:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 case GraphicsExpose: FROB(xexpose, window); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 case MapNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 case UnmapNotify: FROB(xmap, window); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 case EnterNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 case LeaveNotify: FROB(xcrossing, window); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 case FocusIn:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 case FocusOut: FROB(xfocus, window); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 case VisibilityNotify: FROB(xvisibility, window); break;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1422 case CreateNotify: FROB(xcreatewindow, window); break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 w = x_event->xany.window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 *x_event_copy = *x_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 frame = x_any_window_to_frame (d, w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 if (!frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1434 SET_EVENT_CHANNEL (emacs_event, wrap_frame (frame));
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1435 SET_EVENT_MAGIC_X_EVENT (emacs_event, *x_event_copy);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 /* magic-event handling */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 handle_focus_event_1 (struct frame *f, int in_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1451 handle_focus_event_2 (XtWindow (FRAME_X_TEXT_WIDGET (f)), f, in_p);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1452 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1453
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1454 static void
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1455 handle_focus_event_2 (Window win, struct frame *f, int in_p)
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1456 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1457 /* Although this treats focus differently for all widgets (including
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1458 the frame) it seems to work ok. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1459 Widget needs_it = XtWindowToWidget (FRAME_X_DISPLAY (f), win);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1460
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 #if XtSpecificationRelease > 5
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1462 widget_with_focus = XtGetKeyboardFocusWidget (FRAME_X_TEXT_WIDGET (f));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 #ifdef HAVE_XIM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 XIM_focus_event (f, in_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 #endif /* HAVE_XIM */
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1467
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 /* On focus change, clear all memory of sticky modifiers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 to avoid non-intuitive behavior. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 clear_sticky_modifiers (XDEVICE (FRAME_DEVICE (f)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 /* We don't want to handle the focus change now, because we might
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 be in an accept-process-output, sleep-for, or sit-for. So
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 we enqueue it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 Actually, we half handle it: we handle it as far as changing the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 box cursor for redisplay, but we don't call any hooks or do any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 select-frame stuff until after the sit-for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 Unfortunately native widgets break the model because they grab
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 the keyboard focus and nothing sets it back again. I cannot find
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 any reasonable way to do this elsewhere so we assert here that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 the keyboard focus is on the emacs text widget. Menus and dialogs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 do this in their selection callback, but we don't want that since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 a button having focus is legitimate. An edit field having focus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 is mandatory. Weirdly you get a FocusOut event when you click in
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1487 a widget-glyph but you don't get a corresponding FocusIn when you
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 click in the frame. Why is this? */
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1489 if (in_p
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1490 #if XtSpecificationRelease > 5
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1491 && needs_it != widget_with_focus
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 {
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1495 lw_set_keyboard_focus (FRAME_X_SHELL_WIDGET (f), needs_it);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 }
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1497
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1498 /* If we are focusing on a native widget then record and exit. */
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1499 if (needs_it != FRAME_X_TEXT_WIDGET (f)) {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1500 widget_with_focus = needs_it;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1501 return;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1502 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1503
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1504 /* We have the focus now. See comment in
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1505 emacs_Xt_handle_widget_losing_focus (). */
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1506 if (in_p)
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1507 widget_with_focus = NULL;
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1508
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 /* do the generic event-stream stuff. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 Lisp_Object frm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 Lisp_Object conser;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1515 frm = wrap_frame (f);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 conser = Fcons (frm, Fcons (FRAME_DEVICE (f), in_p ? Qt : Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 GCPRO1 (conser);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 emacs_handle_focus_change_preliminary (conser);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 enqueue_magic_eval_event (emacs_handle_focus_change_final,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 conser);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1525 /* Create a synthetic X focus event. */
1111
184461bc8de4 [xemacs-hg @ 2002-11-18 06:52:23 by ben]
ben
parents: 1094
diff changeset
1526 void emacs_Xt_enqueue_focus_event (Widget wants_it, Lisp_Object frame,
184461bc8de4 [xemacs-hg @ 2002-11-18 06:52:23 by ben]
ben
parents: 1094
diff changeset
1527 int in_p);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1528 void
1111
184461bc8de4 [xemacs-hg @ 2002-11-18 06:52:23 by ben]
ben
parents: 1094
diff changeset
1529 emacs_Xt_enqueue_focus_event (Widget wants_it, Lisp_Object frame, int in_p)
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1530 {
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1531 Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1532 Lisp_Event *ev = XEVENT (emacs_event);
960
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 943
diff changeset
1533 XEvent *x_event;
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 943
diff changeset
1534
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 943
diff changeset
1535 XSET_EVENT_TYPE (emacs_event, magic_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1536 x_event = &EVENT_MAGIC_X_EVENT (ev);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1537
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1538 x_event->type = in_p ? FocusIn : FocusOut;
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1539 x_event->xfocus.window = XtWindow (wants_it);
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1540
960
5b372a329b97 [xemacs-hg @ 2002-08-12 08:00:01 by michaels]
michaels
parents: 943
diff changeset
1541 SET_EVENT_CHANNEL (ev, frame);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1542
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1543 enqueue_dispatch_event (emacs_event);
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1544 }
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1545
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1546 /* The idea here is that when a widget glyph gets unmapped we don't
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1547 want the focus to stay with it if it has focus - because it may
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1548 well just get deleted next and then we have lost the focus until the
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1549 user does something. So handle_focus_event_1 records the widget
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1550 with keyboard focus when FocusOut is processed, and then, when a
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1551 widget gets unmapped, it calls this function to restore focus if
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1552 appropriate. */
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
1553 void emacs_Xt_handle_widget_losing_focus (struct frame *f, Widget losing_widget);
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1554 void
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
1555 emacs_Xt_handle_widget_losing_focus (struct frame *f, Widget losing_widget)
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1556 {
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1557 if (losing_widget == widget_with_focus)
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1558 {
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1559 handle_focus_event_1 (f, 1);
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1560 }
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1561 }
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 448
diff changeset
1562
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 /* This is called from the external-widget code */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 void emacs_Xt_handle_focus_event (XEvent *event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 emacs_Xt_handle_focus_event (XEvent *event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 struct device *d = get_device_from_display (event->xany.display);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 struct frame *f;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 if (DEVICE_X_BEING_DELETED (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 * It's curious that we're using x_any_window_to_frame() instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 * of x_window_to_frame(). I don't know what the impact of this is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 f = x_any_window_to_frame (d, event->xfocus.window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 if (!f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 /* focus events are sometimes generated just before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 a frame is destroyed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 handle_focus_event_1 (f, event->type == FocusIn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 /* both MapNotify and VisibilityNotify can cause this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 JV is_visible has the same semantics as f->visible*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 change_frame_visibility (struct frame *f, int is_visible)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1592 Lisp_Object frame = wrap_frame (f);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1593
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 if (!FRAME_VISIBLE_P (f) && is_visible)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 FRAME_VISIBLE_P (f) = is_visible;
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
1598 /* [[ This improves the double flicker when uniconifying a frame
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 some. A lot of it is not showing a buffer which has changed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 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
1601 the good 'ol double redisplay structure. ]] -- comment is
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
1602 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
1603 structure (i.e. current + desired) was put back in. --ben */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 va_run_hook_with_args (Qmap_frame_hook, 1, frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 else if (FRAME_VISIBLE_P (f) && !is_visible)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 FRAME_VISIBLE_P (f) = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 va_run_hook_with_args (Qunmap_frame_hook, 1, frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 else if (FRAME_VISIBLE_P (f) * is_visible < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 FRAME_VISIBLE_P(f) = - FRAME_VISIBLE_P(f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 if (FRAME_REPAINT_P(f))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 va_run_hook_with_args (Qmap_frame_hook, 1, frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 static void
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1622 update_frame_iconify_status (struct frame *f)
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1623 {
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1624 f->iconified = (x_frame_window_state (f) == IconicState);
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1625 }
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1626
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1627 static void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 handle_map_event (struct frame *f, XEvent *event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 {
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1630
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1631 /* It seems that, given the multiplicity of window managers and X
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1632 implementations, plus the fact that X was designed without
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1633 window managers or icons in mind and this was then grafted on
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1634 with about the skill of a drunk freshman med student attempting
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1635 surgery with a rusty razor blade, we cannot treat any off
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1636 MapNotify/UnmapNotify/VisibilityNotify as more than vague hints
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1637 as to the actual situation.
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1638
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1639 So we should just query the actual status. Unfortunately, things
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1640 are worse because (a) there aren't obvious ways to query some
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1641 of these values (e.g. "totally visible"), and (b) there may be
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1642 race conditions (see below).
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1643
638
373ced43e288 [xemacs-hg @ 2001-07-26 21:10:44 by adrian]
adrian
parents: 593
diff changeset
1644 However, according to the ICCCM, there's a specific way to
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1645 ask the window manager whether the state is (a) visible,
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1646 (b) iconic, (c) withdrawn. It must be one of these three.
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1647 We already use this call to check for the iconified state.
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1648 I'd suggest we do the same for visible (i.e. NormalState),
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1649 and scrap most of the nasty code below.
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1650
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1651 --ben
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1652 */
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1653
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1654 update_frame_iconify_status (f);
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1655
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1656 /* #### Ben suggests rewriting the code below using
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1657 x_frame_window_state (f). */
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1658
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 if (event->type == MapNotify)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 XWindowAttributes xwa;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 /* Bleagh!!!!!! Apparently some window managers (e.g. MWM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 send synthetic MapNotify events when a window is first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 created, EVEN IF IT'S CREATED ICONIFIED OR INVISIBLE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 Or something like that. We initially tried a different
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 solution below, but that ran into a different window-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 manager bug.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 It seems that the only reliable way is to treat a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 MapNotify event as a "hint" that the window might or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 might not be visible, and check explicitly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 XGetWindowAttributes (event->xany.display, event->xmap.window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 &xwa);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 if (xwa.map_state != IsViewable)
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1677 return;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 FRAME_X_TOTALLY_VISIBLE_P (f) = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 /* Bleagh again!!!! We initially tried the following hack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 around the MWM problem, but it turns out that TWM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 has a race condition when you un-iconify, where it maps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 the window and then tells the server that the window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 is un-iconified. Usually, XEmacs wakes up between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 those two occurrences, and thus thinks that un-iconified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 windows are still iconified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 Ah, the joys of X. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 /* By Emacs definition, a frame that is iconified is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 visible. Marking a frame as visible will automatically cause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 frame-iconified-p to return nil, regardless of whether the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 frame is actually iconified. Therefore, we have to ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 MapNotify events on iconified frames. (It's not obvious
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 to me why these are being sent, but it happens at startup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 with frames that are initially iconified; perhaps they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 synthetic MapNotify events coming from the window manager.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 Note that `frame-iconified-p' queries the server
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 to determine whether the frame is currently iconified,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 rather than consulting some internal (and likely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 inaccurate) state flag. Therefore, ignoring the MapNotify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 is correct. */
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1704 if (!FRAME_VISIBLE_P (f) && NILP (Fframe_iconified_p (wrap_frame (f))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 change_frame_visibility (f, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 FRAME_X_TOTALLY_VISIBLE_P (f) = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 change_frame_visibility (f, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 handle_client_message (struct frame *f, XEvent *event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 struct device *d = XDEVICE (FRAME_DEVICE (f));
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1719 Lisp_Object frame = wrap_frame (f);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 if (event->xclient.message_type == DEVICE_XATOM_WM_PROTOCOLS (d) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 (Atom) (event->xclient.data.l[0]) == DEVICE_XATOM_WM_DELETE_WINDOW (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 /* WM_DELETE_WINDOW is a misc-user event, but other ClientMessages,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 such as WM_TAKE_FOCUS, are eval events. That's because delete-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 was probably executed with a mouse click, while the others could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 have been sent as a result of mouse motion or some other implicit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 action. (Call this a "heuristic"...) The reason for caring about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 this is so that clicking on the close-box will make emacs prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 using a dialog box instead of the minibuffer if there are unsaved
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 buffers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 enqueue_misc_user_event (frame, Qeval,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 list3 (Qdelete_frame, frame, Qt));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 else if (event->xclient.message_type == DEVICE_XATOM_WM_PROTOCOLS (d) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 (Atom) event->xclient.data.l[0] == DEVICE_XATOM_WM_TAKE_FOCUS (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 handle_focus_event_1 (f, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 /* If there is a dialog box up, focus on it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 #### Actually, we're raising it too, which is wrong. We should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 #### just focus on it, but lwlib doesn't currently give us an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 #### easy way to do that. This should be fixed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 unsigned long take_focus_timestamp = event->xclient.data.l[1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 Widget widget = lw_raise_all_pop_up_widgets ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 if (widget)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 /* kludge: raise_all returns bottommost widget, but we really
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 want the topmost. So just raise it for now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 XMapRaised (XtDisplay (widget), XtWindow (widget));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 /* Grab the focus with the timestamp of the TAKE_FOCUS. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 XSetInputFocus (XtDisplay (widget), XtWindow (widget),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 RevertToParent, take_focus_timestamp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1762 /* #### I'm struggling to understand how the X event loop really works.
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1763 Here is the problem:
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1764
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1765 When widgets get mapped / changed etc the actual display updates
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1766 are done asynchronously via X events being processed - this
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1767 normally happens when XtAppProcessEvent() gets called. However, if
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1768 we are executing lisp code or even doing redisplay we won't
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1769 necessarily process X events for a very long time. This has the
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1770 effect of widgets only getting updated when XEmacs only goes into
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1771 idle, or some other event causes processing of the X event queue.
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1772
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1773 XtAppProcessEvent can get called from the following places:
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1774
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1775 emacs_Xt_next_event () - this is normal event processing, almost
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1776 any non-X event will take precedence and this means that we
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1777 cannot rely on it to do the right thing at the right time for
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1778 widget display.
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1779
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1780 emacs_Xt_drain_queue () - this happens when SIGIO gets tripped,
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1781 processing the event queue allows C-g to be checked for. It gets
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1782 called from emacs_Xt_event_pending_p (). #### Update this comment.
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1783
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1784 In order to solve this I have tried introducing a list primitive -
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1785 dispatch-non-command-events - which forces processing of X events
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1786 related to display. Unfortunately this has a number of problems,
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1787 one is that it is possible for event_stream_event_pending_p to
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1788 block for ever if there isn't actually an event. I guess this can
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1789 happen if we drop the synthetic event for reason. It also relies on
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1790 SIGIO processing which makes things rather fragile.
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1791
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1792 People have seen behaviour whereby XEmacs blocks until you move the
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1793 mouse. This seems to indicate that dispatch-non-command-events is
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1794 blocking. It may be that in a SIGIO world forcing SIGIO processing
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1795 does the wrong thing.
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1796 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 static void
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
1798 emacs_Xt_force_event_pending (struct frame *f)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1799 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1800 XEvent event;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1801
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
1802 Display *dpy = DEVICE_X_DISPLAY (XDEVICE (FRAME_DEVICE (f)));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1803 event.xclient.type = ClientMessage;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1804 event.xclient.display = dpy;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1805 event.xclient.message_type = XInternAtom (dpy, "BumpQueue", False);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1806 event.xclient.format = 32;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1807 event.xclient.window = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1808
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1809 /* Send the drop message */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1810 XSendEvent(dpy, XtWindow (FRAME_X_SHELL_WIDGET (f)),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1811 True, NoEventMask, &event);
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1812 /* We rely on SIGIO and friends to realise we have generated an
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1813 event. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1814 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1815
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1816 static void
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1817 emacs_Xt_format_magic_event (Lisp_Event *event, Lisp_Object pstream)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1818 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1819 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (event));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1820 if (CONSOLE_X_P (XCONSOLE (console)))
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 801
diff changeset
1821 write_c_string
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1822 (pstream, x_event_name ((EVENT_MAGIC_X_EVENT (event)).type));
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1823 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1824
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1825 static int
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1826 emacs_Xt_compare_magic_event (Lisp_Event *e1, Lisp_Event *e2)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1827 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1828 if (CONSOLE_X_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e1)))) &&
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1829 CONSOLE_X_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e2)))))
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1830 return ((EVENT_MAGIC_X_EVENT (e1)).xany.serial ==
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1831 (EVENT_MAGIC_X_EVENT (e2)).xany.serial);
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1832 if (CONSOLE_X_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e1)))) ||
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1833 CONSOLE_X_P (XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e2)))))
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1834 return 0;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1835 return 1;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1836 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1837
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1838 static Hashcode
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1839 emacs_Xt_hash_magic_event (Lisp_Event *e)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1840 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1841 Lisp_Object console = CDFW_CONSOLE (EVENT_CHANNEL (e));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1842 if (CONSOLE_X_P (XCONSOLE (console)))
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1843 return (EVENT_MAGIC_X_EVENT (e)).xany.serial;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1844 return 0;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1845 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1846
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
1847 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1848 emacs_Xt_handle_magic_event (Lisp_Event *emacs_event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 /* This function can GC */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
1851 XEvent *event = &EVENT_MAGIC_X_EVENT (emacs_event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 struct frame *f = XFRAME (EVENT_CHANNEL (emacs_event));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 if (!FRAME_LIVE_P (f) || DEVICE_X_BEING_DELETED (XDEVICE (FRAME_DEVICE (f))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 switch (event->type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 case SelectionRequest:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 x_handle_selection_request (&event->xselectionrequest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 break;
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1862
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 case SelectionClear:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 x_handle_selection_clear (&event->xselectionclear);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 break;
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1866
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 case SelectionNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 x_handle_selection_notify (&event->xselection);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 break;
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1870
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 case PropertyNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 x_handle_property_notify (&event->xproperty);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 break;
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
1874
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 case Expose:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 if (!check_for_ignored_expose (f, event->xexpose.x, event->xexpose.y,
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1315
diff changeset
1877 event->xexpose.width,
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1315
diff changeset
1878 event->xexpose.height)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 !find_matching_subwindow (f, event->xexpose.x, event->xexpose.y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 event->xexpose.width, event->xexpose.height))
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1315
diff changeset
1882 redisplay_redraw_exposed_area (f, event->xexpose.x, event->xexpose.y,
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1315
diff changeset
1883 event->xexpose.width,
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1315
diff changeset
1884 event->xexpose.height);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 case GraphicsExpose: /* This occurs when an XCopyArea's source area was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 obscured or not available. */
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1315
diff changeset
1889 redisplay_redraw_exposed_area (f, event->xexpose.x, event->xexpose.y,
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1315
diff changeset
1890 event->xexpose.width,
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1315
diff changeset
1891 event->xexpose.height);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 case MapNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 case UnmapNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 handle_map_event (f, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 case EnterNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 if (event->xcrossing.detail != NotifyInferior)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1902 Lisp_Object frame = wrap_frame (f);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1903
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 /* FRAME_X_MOUSE_P (f) = 1; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 va_run_hook_with_args (Qmouse_enter_frame_hook, 1, frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 case LeaveNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 if (event->xcrossing.detail != NotifyInferior)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1912 Lisp_Object frame = wrap_frame (f);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
1913
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 /* FRAME_X_MOUSE_P (f) = 0; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 va_run_hook_with_args (Qmouse_leave_frame_hook, 1, frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 case FocusIn:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 case FocusOut:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 #ifdef EXTERNAL_WIDGET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 /* External widget lossage: Ben said:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 YUCK. The only way to make focus changes work properly is to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 completely ignore all FocusIn/FocusOut events and depend only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 on notifications from the ExternalClient widget. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 if (FRAME_X_EXTERNAL_WINDOW_P (f))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 #endif
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 853
diff changeset
1930 handle_focus_event_2 (event->xfocus.window, f, event->type == FocusIn);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 case ClientMessage:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 handle_client_message (f, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 case VisibilityNotify: /* window visibility has changed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 if (event->xvisibility.window == XtWindow (FRAME_X_SHELL_WIDGET (f)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 {
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1940 /* See comment in handle_map_event */
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1941 update_frame_iconify_status (f);
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1942
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1943 /* #### Ben suggests rewriting the code below using
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1944 x_frame_window_state (f). */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 FRAME_X_TOTALLY_VISIBLE_P (f) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 (event->xvisibility.state == VisibilityUnobscured);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 /* Note that the fvwm pager only sends VisibilityNotify when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 changing pages. Is this all we need to do ? JV */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 /* Nope. We must at least trigger a redisplay here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 Since this case seems similar to MapNotify, I've
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 factored out some code to change_frame_visibility().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 This triggers the necessary redisplay and runs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 (un)map-frame-hook. - dkindred@cs.cmu.edu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 /* Changed it again to support the tristate visibility flag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 change_frame_visibility (f, (event->xvisibility.state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 != VisibilityFullyObscured) ? 1 : -1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 case ConfigureNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 #ifdef HAVE_XIM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 XIM_SetGeometry (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1966 case CreateNotify:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1967 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1968
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 /* timeout events */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 static int timeout_id_tick;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 /* Xt interval id's might not fit into an int (they're pointers, as it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 happens), so we need to provide a conversion list. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 static struct Xt_timeout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 int id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 XtIntervalId interval_id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 struct Xt_timeout *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 } *pending_timeouts, *completed_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 static struct Xt_timeout_blocktype
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 Blocktype_declare (struct Xt_timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 } *the_Xt_timeout_blocktype;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 /* called by XtAppNextEvent() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
1998 Xt_timeout_callback (XtPointer closure, XtIntervalId *UNUSED (id))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 struct Xt_timeout *timeout = (struct Xt_timeout *) closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 struct Xt_timeout *t2 = pending_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 /* Remove this one from the list of pending timeouts */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 if (t2 == timeout)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 pending_timeouts = pending_timeouts->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 while (t2->next && t2->next != timeout) t2 = t2->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 assert (t2->next);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 t2->next = t2->next->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 /* Add this one to the list of completed timeouts */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 timeout->next = completed_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 completed_timeouts = timeout;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 emacs_Xt_add_timeout (EMACS_TIME thyme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 struct Xt_timeout *timeout = Blocktype_alloc (the_Xt_timeout_blocktype);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 EMACS_TIME current_time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 int milliseconds;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 timeout->id = timeout_id_tick++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 timeout->next = pending_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 pending_timeouts = timeout;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 EMACS_GET_TIME (current_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 EMACS_SUB_TIME (thyme, thyme, current_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 milliseconds = EMACS_SECS (thyme) * 1000 +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 EMACS_USECS (thyme) / 1000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 if (milliseconds < 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 milliseconds = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 timeout->interval_id = XtAppAddTimeOut (Xt_app_con, milliseconds,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 Xt_timeout_callback,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 (XtPointer) timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 return timeout->id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 emacs_Xt_remove_timeout (int id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 struct Xt_timeout *timeout, *t2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 timeout = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 /* Find the timeout on the list of pending ones, if it's still there. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 if (pending_timeouts)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 if (id == pending_timeouts->id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 timeout = pending_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 pending_timeouts = pending_timeouts->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 t2 = pending_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 while (t2->next && t2->next->id != id) t2 = t2->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 if ( t2->next) /*found it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 timeout = t2->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 t2->next = t2->next->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 /* if it was pending, we have removed it from the list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 if (timeout)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 XtRemoveTimeOut (timeout->interval_id);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 /* It could be that the Xt call back was already called but we didn't convert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 into an Emacs event yet */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 if (!timeout && completed_timeouts)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 /* Code duplication! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 if (id == completed_timeouts->id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 timeout = completed_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 completed_timeouts = completed_timeouts->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 t2 = completed_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 while (t2->next && t2->next->id != id) t2 = t2->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082 if ( t2->next) /*found it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 timeout = t2->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 t2->next = t2->next->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 /* If we found the thing on the lists of timeouts,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 and removed it, deallocate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 if (timeout)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 Blocktype_free (the_Xt_timeout_blocktype, timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2098 Xt_timeout_to_emacs_event (Lisp_Event *emacs_event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 struct Xt_timeout *timeout = completed_timeouts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 assert (timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 completed_timeouts = completed_timeouts->next;
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
2103 /* timeout events have nil as channel */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2104 set_event_type (emacs_event, timeout_event);
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
2105 SET_EVENT_TIMESTAMP_ZERO (emacs_event); /* #### wrong!! */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2106 SET_EVENT_TIMEOUT_INTERVAL_ID (emacs_event, timeout->id);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2107 SET_EVENT_TIMEOUT_FUNCTION (emacs_event, Qnil);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2108 SET_EVENT_TIMEOUT_OBJECT (emacs_event, Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 Blocktype_free (the_Xt_timeout_blocktype, timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 /* process and tty events */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 struct what_is_ready_closure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 int fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 Lisp_Object what;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 XtInputId id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 static Lisp_Object *filedesc_with_input;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 static struct what_is_ready_closure **filedesc_to_what_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 init_what_input_once (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 filedesc_with_input = xnew_array (Lisp_Object, MAXDESC);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 filedesc_to_what_closure =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 xnew_array (struct what_is_ready_closure *, MAXDESC);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 for (i = 0; i < MAXDESC; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 filedesc_to_what_closure[i] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 filedesc_with_input[i] = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 process_events_occurred = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 tty_events_occurred = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 mark_what_as_being_ready (struct what_is_ready_closure *closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 if (NILP (filedesc_with_input[closure->fd]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 SELECT_TYPE temp_mask;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 FD_ZERO (&temp_mask);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 FD_SET (closure->fd, &temp_mask);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 /* Check to make sure there's *really* input available.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 Sometimes things seem to get confused and this gets called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 for the tty fd when there's really only input available
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 on some process's fd. (It will subsequently get called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 for that process's fd, so returning without setting any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 flags will take care of it.) To see the problem, uncomment
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 the stderr_out below, turn NORMAL_QUIT_CHECK_TIMEOUT_MSECS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 down to 25, do sh -c 'xemacs -nw -q -f shell 2>/tmp/log'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 and press return repeatedly. (Seen under AIX & Linux.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 -dkindred@cs.cmu.edu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 if (!poll_fds_for_input (temp_mask))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 stderr_out ("mark_what_as_being_ready: no input available (fd=%d)\n",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 closure->fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 filedesc_with_input[closure->fd] = closure->what;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 if (PROCESSP (closure->what))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 /* Don't increment this if the current process is already marked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 * as having input. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 process_events_occurred++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 tty_events_occurred++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
2183 Xt_what_callback (void *closure, int *UNUSED (source), XtInputId *UNUSED (id))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 /* If closure is 0, then we got a fake event from a signal handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 The only purpose of this is to make XtAppProcessEvent() stop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 blocking. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 if (closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 mark_what_as_being_ready ((struct what_is_ready_closure *) closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 fake_event_occurred++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 drain_signal_event_pipe ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 select_filedesc (int fd, Lisp_Object what)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 struct what_is_ready_closure *closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 /* If somebody is trying to select something that's already selected
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 for, then something went wrong. The generic routines ought to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 detect this and error before here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 assert (!filedesc_to_what_closure[fd]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 closure = xnew (struct what_is_ready_closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 closure->fd = fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 closure->what = what;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 closure->id =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 XtAppAddInput (Xt_app_con, fd,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 (XtPointer) (XtInputReadMask /* | XtInputExceptMask */),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 Xt_what_callback, closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 filedesc_to_what_closure[fd] = closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 unselect_filedesc (int fd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 struct what_is_ready_closure *closure = filedesc_to_what_closure[fd];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 assert (closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 if (!NILP (filedesc_with_input[fd]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 /* We are unselecting this process before we have drained the rest of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 the input from it, probably from status_notify() in the command loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227 This can happen like so:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 - We are waiting in XtAppNextEvent()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 - Process generates output
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 - Process is marked as being ready
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 - Process dies, SIGCHLD gets generated before we return (!?)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 It could happen I guess.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 - sigchld_handler() marks process as dead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 - Somehow we end up getting a new KeyPress event on the queue
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 at the same time (I'm really so sure how that happens but I'm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 not sure it can't either so let's assume it can...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 - Key events have priority so we return that instead of the proc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 - Before dispatching the lisp key event we call status_notify()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 - Which deselects the process that SIGCHLD marked as dead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 Thus we never remove it from _with_input and turn it into a lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 event, so we need to do it here. But this does not mean that we're
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 throwing away the last block of output - status_notify() has already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 taken care of running the proc filter or whatever.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 filedesc_with_input[fd] = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 if (PROCESSP (closure->what))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 assert (process_events_occurred > 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 process_events_occurred--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 assert (tty_events_occurred > 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 tty_events_occurred--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 XtRemoveInput (closure->id);
1726
a8d8f419b459 [xemacs-hg @ 2003-09-30 15:26:34 by james]
james
parents: 1494
diff changeset
2260 xfree (closure, struct what_is_ready_closure *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 filedesc_to_what_closure[fd] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 static void
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2265 emacs_Xt_select_process (Lisp_Process *process, int doin, int doerr)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2267 Lisp_Object proc;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2268 int infd, errfd;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2269
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2270 event_stream_unixoid_select_process (process, doin, doerr, &infd, &errfd);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2271
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2272 proc = wrap_process (process);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2273 if (doin)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2274 select_filedesc (infd, proc);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2275 if (doerr)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2276 select_filedesc (errfd, proc);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2277 }
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2278
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2279 static void
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2280 emacs_Xt_unselect_process (Lisp_Process *process, int doin, int doerr)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2281 {
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2282 int infd, errfd;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2283
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2284 event_stream_unixoid_unselect_process (process, doin, doerr, &infd, &errfd);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2285
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2286 if (doin)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2287 unselect_filedesc (infd);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2288 if (doerr)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2289 unselect_filedesc (errfd);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 static void
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2293 emacs_Xt_create_io_streams (void *inhandle, void *outhandle,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2294 void *errhandle, Lisp_Object *instream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2295 Lisp_Object *outstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2296 Lisp_Object *errstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2297 USID *in_usid,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2298 USID *err_usid,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2299 int flags)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2301 event_stream_unixoid_create_io_streams
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2302 (inhandle, outhandle, errhandle, instream, outstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2303 errstream, in_usid, err_usid, flags);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2304 if (*in_usid != USID_ERROR)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2305 *in_usid = USID_DONTHASH;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2306 if (*err_usid != USID_ERROR)
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2307 *err_usid = USID_DONTHASH;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2310 static void
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2311 emacs_Xt_delete_io_streams (Lisp_Object instream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2312 Lisp_Object outstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2313 Lisp_Object errstream,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2314 USID *in_usid,
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2315 USID *err_usid)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2317 event_stream_unixoid_delete_io_streams
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2318 (instream, outstream, errstream, in_usid, err_usid);
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2319 *in_usid = USID_DONTHASH;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2320 *err_usid = USID_DONTHASH;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 /* This is called from GC when a process object is about to be freed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 If we've still got pointers to it in this file, we're gonna lose hard.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
2327 debug_process_finalization (Lisp_Process *UNUSED (p))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 #if 0 /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 int i;
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2331 Lisp_Object instr, outstr, errstr;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2332
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2333 get_process_streams (p, &instr, &outstr, &errstr);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334 /* if it still has fds, then it hasn't been killed yet. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 assert (NILP(instr));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 assert (NILP(outstr));
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
2337 assert (NILP(errstr));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 /* Better not still be in the "with input" table; we know it's got no fds. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 for (i = 0; i < MAXDESC; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341 Lisp_Object process = filedesc_fds_with_input [i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342 assert (!PROCESSP (process) || XPROCESS (process) != p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2348 Xt_process_to_emacs_event (Lisp_Event *emacs_event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 assert (process_events_occurred > 0);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
2353
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 for (i = 0; i < MAXDESC; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
2356 Lisp_Object process = filedesc_with_input[i];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 if (PROCESSP (process))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
2358 {
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
2359 filedesc_with_input[i] = Qnil;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
2360 process_events_occurred--;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
2361 /* process events have nil as channel */
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
2362 set_event_type (emacs_event, process_event);
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
2363 SET_EVENT_TIMESTAMP_ZERO (emacs_event); /* #### */
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2364 SET_EVENT_PROCESS_PROCESS (emacs_event, process);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
2365 return;
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
2366 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 }
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
2368 ABORT ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 emacs_Xt_select_console (struct console *con)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 Lisp_Object console;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 int infd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377 if (CONSOLE_X_P (con))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 return; /* X consoles are automatically selected for when we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 initialize them in Xt */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380 infd = event_stream_unixoid_select_console (con);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
2381 console = wrap_console (con);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 select_filedesc (infd, console);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 emacs_Xt_unselect_console (struct console *con)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 int infd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 if (CONSOLE_X_P (con))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 return; /* X consoles are automatically selected for when we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 initialize them in Xt */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 infd = event_stream_unixoid_unselect_console (con);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 unselect_filedesc (infd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 /* read an event from a tty, if one is available. Returns non-zero
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 if an event was available. Note that when this function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 called, there should always be a tty marked as ready for input.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 However, the input condition might actually be EOF, so there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 may not really be any input available. (In this case,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 read_event_from_tty_or_stream_desc() will arrange for the TTY device
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 to be deleted.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 static int
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2406 Xt_tty_to_emacs_event (Lisp_Event *emacs_event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 assert (tty_events_occurred > 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 for (i = 0; i < MAXDESC; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 Lisp_Object console = filedesc_with_input[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 if (CONSOLEP (console))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 assert (tty_events_occurred > 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417 tty_events_occurred--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 filedesc_with_input[i] = Qnil;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2419 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
2420 XCONSOLE (console)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 /* debugging functions to decipher an event */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 #ifdef DEBUG_XEMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 #include "xintrinsicp.h" /* only describe_event() needs this */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 #include <X11/Xproto.h> /* only describe_event() needs this */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 static void
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2438 describe_event_window (Window window, Display *display, Lisp_Object pstream)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 struct frame *f;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 Widget w;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2442 write_fmt_string (pstream, " window: 0x%lx", (unsigned long) window);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443 w = XtWindowToWidget (display, window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 if (w)
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2445 write_fmt_string (pstream, " %s",
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2446 w->core.widget_class->core_class.class_name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 f = x_any_window_to_frame (get_device_from_display (display), window);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 if (f)
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2449 write_fmt_string_lisp (pstream, " \"%s\"", 1, f->name);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2450 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2453 static const char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 XEvent_mode_to_string (int mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 switch (mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 case NotifyNormal: return "Normal";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 case NotifyGrab: return "Grab";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 case NotifyUngrab: return "Ungrab";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 case NotifyWhileGrabbed: return "WhileGrabbed";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 default: return "???";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2466 static const char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 XEvent_detail_to_string (int detail)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 switch (detail)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 case NotifyAncestor: return "Ancestor";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 case NotifyInferior: return "Inferior";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473 case NotifyNonlinear: return "Nonlinear";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 case NotifyNonlinearVirtual: return "NonlinearVirtual";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 case NotifyPointer: return "Pointer";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 case NotifyPointerRoot: return "PointerRoot";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477 case NotifyDetailNone: return "DetailNone";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478 default: return "???";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2482 static const char *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 XEvent_visibility_to_string (int state)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 switch (state)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 case VisibilityFullyObscured: return "FullyObscured";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 case VisibilityPartiallyObscured: return "PartiallyObscured";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 case VisibilityUnobscured: return "Unobscured";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 default: return "???";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 static void
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2495 describe_event (XEvent *event, Lisp_Object pstream)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 char buf[100];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 struct device *d = get_device_from_display (event->xany.display);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 sprintf (buf, "%s%s", x_event_name (event->type),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 event->xany.send_event ? " (send)" : "");
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2502 write_fmt_string (pstream, "%-30s", buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 switch (event->type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 case FocusIn:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 case FocusOut:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 XFocusChangeEvent *ev = &event->xfocus;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2509 describe_event_window (ev->window, ev->display, pstream);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2510 write_fmt_string (pstream, " mode: %s\n",
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2511 XEvent_mode_to_string (ev->mode));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2512 write_fmt_string (pstream, " detail: %s\n",
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2513 XEvent_detail_to_string (ev->detail));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 case KeyPress:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 XKeyEvent *ev = &event->xkey;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 unsigned int state = ev->state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2522 describe_event_window (ev->window, ev->display, pstream);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2523 write_fmt_string (pstream, " subwindow: %ld\n", ev->subwindow);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2524 write_fmt_string (pstream, " state: ");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 /* Complete list of modifier key masks */
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2526 if (state & ShiftMask) write_fmt_string (pstream, "Shift ");
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2527 if (state & LockMask) write_fmt_string (pstream, "Lock ");
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2528 if (state & ControlMask) write_fmt_string (pstream, "Control ");
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2529 if (state & Mod1Mask) write_fmt_string (pstream, "Mod1 ");
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2530 if (state & Mod2Mask) write_fmt_string (pstream, "Mod2 ");
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2531 if (state & Mod3Mask) write_fmt_string (pstream, "Mod3 ");
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2532 if (state & Mod4Mask) write_fmt_string (pstream, "Mod4 ");
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2533 if (state & Mod5Mask) write_fmt_string (pstream, "Mod5 ");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 if (! state)
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2536 write_fmt_string (pstream, "vanilla\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 else
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2538 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 if (x_key_is_modifier_p (ev->keycode, d))
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2540 write_fmt_string (pstream, " Modifier key");
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2541 write_fmt_string (pstream, " keycode: 0x%x\n", ev->keycode);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 case Expose:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2546 if (debug_x_events > 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 XExposeEvent *ev = &event->xexpose;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2549 describe_event_window (ev->window, ev->display, pstream);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2550 write_fmt_string (pstream,
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2551 " region: x=%d y=%d width=%d height=%d\n",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 ev->x, ev->y, ev->width, ev->height);
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2553 write_fmt_string (pstream, " count: %d\n", ev->count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555 else
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2556 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2557 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 case GraphicsExpose:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2560 if (debug_x_events > 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2561 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 XGraphicsExposeEvent *ev = &event->xgraphicsexpose;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2563 describe_event_window (ev->drawable, ev->display, pstream);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2564 write_fmt_string (pstream, " major: %s\n",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565 (ev ->major_code == X_CopyArea ? "CopyArea" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 (ev->major_code == X_CopyPlane ? "CopyPlane" : "?")));
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2567 write_fmt_string (pstream,
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2568 " region: x=%d y=%d width=%d height=%d\n",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 ev->x, ev->y, ev->width, ev->height);
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2570 write_fmt_string (pstream, " count: %d\n", ev->count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572 else
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2573 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 case EnterNotify:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577 case LeaveNotify:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2578 if (debug_x_events > 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 XCrossingEvent *ev = &event->xcrossing;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2581 describe_event_window (ev->window, ev->display, pstream);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 #if 0
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2583 write_fmt_string (pstream, " subwindow: 0x%x\n", ev->subwindow);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2584 write_fmt_string (pstream, " pos: %d %d\n", ev->x, ev->y);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2585 write_fmt_string (pstream, " root pos: %d %d\n", ev->x_root,
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2586 ev->y_root);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 #endif
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2588 write_fmt_string (pstream, " mode: %s\n",
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2589 XEvent_mode_to_string(ev->mode));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2590 write_fmt_string (pstream, " detail: %s\n",
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2591 XEvent_detail_to_string(ev->detail));
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2592 write_fmt_string (pstream, " focus: %d\n", ev->focus);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 #if 0
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2594 write_fmt_string (pstream, " state: 0x%x\n", ev->state);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 else
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2598 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 case ConfigureNotify:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2602 if (debug_x_events > 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 XConfigureEvent *ev = &event->xconfigure;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2605 describe_event_window (ev->window, ev->display, pstream);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2606 write_fmt_string (pstream, " above: 0x%lx\n", ev->above);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2607 write_fmt_string (pstream, " size: %d %d %d %d\n", ev->x, ev->y,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 ev->width, ev->height);
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2609 write_fmt_string (pstream, " redirect: %d\n",
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2610 ev->override_redirect);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 else
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2613 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 case VisibilityNotify:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2617 if (debug_x_events > 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 XVisibilityEvent *ev = &event->xvisibility;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2620 describe_event_window (ev->window, ev->display, pstream);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2621 write_fmt_string (pstream, " state: %s\n",
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2622 XEvent_visibility_to_string (ev->state));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624 else
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2625 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 case ClientMessage:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630 XClientMessageEvent *ev = &event->xclient;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 char *name = XGetAtomName (ev->display, ev->message_type);
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2632 write_fmt_string (pstream, "%s", name);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2633 if (!strcmp (name, "WM_PROTOCOLS"))
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2634 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2635 char *protname = XGetAtomName (ev->display, ev->data.l[0]);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2636 write_fmt_string (pstream, "(%s)", protname);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2637 XFree (protname);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2638 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 XFree (name);
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2640 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 default:
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2645 write_fmt_string (pstream, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 fflush (stdout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 #endif /* include describe_event definition */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 /* get the next event from Xt */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 /* This business exists because menu events "happen" when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 menubar_selection_callback() is called from somewhere deep
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 within XtAppProcessEvent in emacs_Xt_next_event(). The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 callback needs to terminate the modal loop in that function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 or else it will continue waiting until another event is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 received.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 Same business applies to scrollbar events. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 signal_special_Xt_user_event (Lisp_Object channel, Lisp_Object function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 Lisp_Object object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 Lisp_Object event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
2674 XSET_EVENT_TYPE (event, misc_user_event);
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
2675 XSET_EVENT_CHANNEL (event, channel);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2676 XSET_EVENT_MISC_USER_FUNCTION (event, function);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2677 XSET_EVENT_MISC_USER_OBJECT (event, object);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2678 enqueue_dispatch_event (event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2682 emacs_Xt_next_event (Lisp_Event *emacs_event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 we_didnt_get_an_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686 while (NILP (dispatch_event_queue) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687 !completed_timeouts &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 !fake_event_occurred &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 !process_events_occurred &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 !tty_events_occurred)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 {
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2692 if (in_modal_loop)
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2693 {
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2694 /* in_modal_loop gets set when we are in the process of
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2695 dispatching an event (more specifically, when we are inside of
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2696 a menu callback -- if we get here, it means we called a filter
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2697 and the filter did something that tried to fetch an event,
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2698 e.g. sit-for). In such a case, we cannot safely dispatch any
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2699 more events. This is because those dispatching those events
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2700 could cause lwlib to be entered reentranty, specifically if
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2701 they are menu events. lwlib is not designed for this and will
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2702 crash. We used to see this crash constantly as a result of
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2703 QUIT checking, but QUIT will not now function in a modal loop.
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2704 However, we can't just not process any events at all, because
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2705 that will make sit-for etc. hang. So we go ahead and process
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2706 the non-X kinds of events. */
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2707 #ifdef WIN32_ANY
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2708 mswindows_is_blocking = 1;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2709 #endif
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2710 XtAppProcessEvent (Xt_app_con, XtIMTimer | XtIMAlternateInput);
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2711 #ifdef WIN32_ANY
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2712 mswindows_is_blocking = 0;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2713 #endif
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2714 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 {
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2717 /* Stupid logic in XtAppProcessEvent() dictates that, if process
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2718 events and X events are both available, the process event gets
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2719 taken first. This will cause an infinite loop if we're being
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2720 called from Fdiscard_input().
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2721 */
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2722
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2723 if (XtAppPending (Xt_app_con) & XtIMXEvent)
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2724 XtAppProcessEvent (Xt_app_con, XtIMXEvent);
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2725 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 {
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2727 Lisp_Object devcons, concons;
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2728
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2729 /* We're about to block. Xt has a bug in it (big surprise,
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2730 there) in that it blocks using select() and doesn't
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2731 flush the Xlib output buffers (XNextEvent() does this
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2732 automatically before blocking). So it's necessary
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2733 for us to do this ourselves. If we don't do it, then
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2734 display output may not be seen until the next time
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2735 an X event is received. (This happens esp. with
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2736 subprocess output that gets sent to a visible buffer.)
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2737
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2738 #### The above comment may not have any validity. */
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2739
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2740 DEVICE_LOOP_NO_BREAK (devcons, concons)
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2741 {
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2742 struct device *d;
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2743 d = XDEVICE (XCAR (devcons));
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2744
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2745 if (DEVICE_X_P (d) && DEVICE_X_DISPLAY (d))
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2746 /* emacs may be exiting */
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2747 XFlush (DEVICE_X_DISPLAY (d));
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2748 }
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2749 #ifdef WIN32_ANY
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2750 mswindows_is_blocking = 1;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2751 #endif
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2752 XtAppProcessEvent (Xt_app_con, XtIMAll);
1292
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2753 #ifdef WIN32_ANY
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2754 mswindows_is_blocking = 0;
f3437b56874d [xemacs-hg @ 2003-02-13 09:57:04 by ben]
ben
parents: 1268
diff changeset
2755 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 if (!NILP (dispatch_event_queue))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 Lisp_Object event, event2;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
2763 event2 = wrap_event (emacs_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2764 event = dequeue_dispatch_event ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 Fcopy_event (event, event2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 Fdeallocate_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 else if (tty_events_occurred)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 if (!Xt_tty_to_emacs_event (emacs_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 goto we_didnt_get_an_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 else if (completed_timeouts)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 Xt_timeout_to_emacs_event (emacs_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 else if (fake_event_occurred)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 /* A dummy event, so that a cycle of the command loop will occur. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 fake_event_occurred = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 /* eval events have nil as channel */
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
2780 set_event_type (emacs_event, eval_event);
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2781 SET_EVENT_EVAL_FUNCTION (emacs_event, Qidentity);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2782 SET_EVENT_EVAL_OBJECT (emacs_event, Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 else /* if (process_events_occurred) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 Xt_process_to_emacs_event (emacs_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787 /* No need to call XFilterEvent; Xt does it for us */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
2791 emacs_Xt_event_handler (Widget UNUSED (wid),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
2792 XtPointer UNUSED (closure),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 XEvent *event,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
2794 Boolean *UNUSED (continue_to_dispatch))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 #ifdef DEBUG_XEMACS
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2799 if (debug_x_events > 0)
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
2800 describe_event (event, Qexternal_debugging_output);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 #endif /* DEBUG_XEMACS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802 if (x_event_to_emacs_event (event, XEVENT (emacs_event)))
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2803 enqueue_dispatch_event (emacs_event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805 Fdeallocate_event (emacs_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 /************************************************************************/
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2810 /* input pending */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 static void
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2814 emacs_Xt_drain_queue (void)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 Lisp_Object devcons, concons;
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2817 if (!in_modal_loop)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 {
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2819 CONSOLE_LOOP (concons)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 {
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2821 struct console *con = XCONSOLE (XCAR (concons));
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2822 if (!con->input_enabled)
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2823 continue;
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2824
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2825 CONSOLE_DEVICE_LOOP (devcons, con)
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2826 {
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2827 struct device *d;
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2828 Display *display;
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2829 d = XDEVICE (XCAR (devcons));
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2830 if (DEVICE_X_P (d) && DEVICE_X_DISPLAY (d))
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2831 {
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2832 display = DEVICE_X_DISPLAY (d);
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2833 while (XEventsQueued (display, QueuedAfterReading))
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2834 XtAppProcessEvent (Xt_app_con, XtIMXEvent);
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2835 }
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2836 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 }
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2838 /*
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2839 while (XtAppPending (Xt_app_con) & XtIMXEvent)
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2840 XtAppProcessEvent (Xt_app_con, XtIMXEvent);
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2841 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 }
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2843
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
2844 #ifdef HAVE_TTY
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2845 drain_tty_devices ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2849 int
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2850 check_if_pending_expose_event (struct device *dev)
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2851 {
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2852 Display *d = DEVICE_X_DISPLAY (dev);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2853 Lisp_Object event;
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2854
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2855 emacs_Xt_drain_queue ();
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2856
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2857 EVENT_CHAIN_LOOP (event, dispatch_event_queue)
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2858 if (XEVENT_TYPE (event) == magic_event)
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2859 {
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2860 XEvent *xev = &XEVENT_MAGIC_X_EVENT (event);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2861 if (xev->type == Expose &&
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2862 xev->xexpose.display == d)
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2863 return 1;
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2864 }
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2865
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2866 return 0;
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2867 }
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
2868
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2869 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2870 emacs_Xt_current_event_timestamp (struct console *c)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2871 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2872 /* semi-yuck. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2873 Lisp_Object devs = CONSOLE_DEVICE_LIST (c);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2874
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2875 if (NILP (devs))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2876 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2877 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2878 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2879 struct device *d = XDEVICE (XCAR (devs));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2880 return DEVICE_X_LAST_SERVER_TIMESTAMP (d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2881 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2882 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2883
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 /* replacement for standard string-to-pixel converter */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 /* This was constructed by ripping off the standard string-to-pixel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 converter from Converters.c in the Xt source code and modifying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 appropriately. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 /* This is exported by the Xt library (at least by mine). If this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 isn't the case somewhere, rename this appropriately and remove
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 the '#if 0'. Note, however, that I got "unknown structure"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 errors when I tried this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 XtConvertArgRec Const colorConvertArgs[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2900 { XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2901 sizeof (Screen *) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2902 { XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
2903 sizeof (Colormap) }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 #define done(type, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 if (toVal->addr != NULL) { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 if (toVal->size < sizeof(type)) { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 toVal->size = sizeof(type); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 return False; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 *(type*)(toVal->addr) = (value); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 } else { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 static type static_val; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917 static_val = (value); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 toVal->addr = (XPointer)&static_val; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920 toVal->size = sizeof(type); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 return True /* Caller supplies `;' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 /* JH: We use this because I think there's a possibility this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 is called before the device is properly set up, in which case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 I don't want to abort. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 extern struct device *get_device_from_display_1 (Display *dpy);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 Boolean EmacsXtCvtStringToPixel (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 Display *dpy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 XrmValuePtr args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 Cardinal *num_args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 XrmValuePtr fromVal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 XrmValuePtr toVal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 XtPointer *closure_ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937 String str = (String)fromVal->addr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 XColor screenColor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 XColor exactColor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 Screen *screen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 Colormap colormap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 Visual *visual;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 struct device *d;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 Status status;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 String params[1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 Cardinal num_params = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 XtAppContext the_app_con = XtDisplayToApplicationContext (dpy);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 if (*num_args != 2) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 XtAppWarningMsg(the_app_con, "wrongParameters", "cvtStringToPixel",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 "XtToolkitError",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 "String to pixel conversion needs screen and colormap arguments",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 (String *)NULL, (Cardinal *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 return False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 screen = *((Screen **) args[0].addr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 colormap = *((Colormap *) args[1].addr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 /* The original uses the private function CompareISOLatin1().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 Use XmuCompareISOLatin1() if you want, but I don't think it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 makes any difference here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 if (strcmp(str, XtDefaultBackground) == 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 *closure_ret = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 /* This refers to the display's "*reverseVideo" resource.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 These display resources aren't documented anywhere that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 I can find, so I'm going to ignore this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 /* if (pd->rv) done(Pixel, BlackPixelOfScreen(screen)) else */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 done(Pixel, WhitePixelOfScreen(screen));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 if (strcmp(str, XtDefaultForeground) == 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 *closure_ret = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 /* if (pd->rv) done(Pixel, WhitePixelOfScreen(screen)) else */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 done(Pixel, BlackPixelOfScreen(screen));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 /* Originally called XAllocNamedColor() here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 if ((d = get_device_from_display_1(dpy))) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 visual = DEVICE_X_VISUAL(d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 if (colormap != DEVICE_X_COLORMAP(d)) {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2981 XtAppWarningMsg(the_app_con, "weirdColormap", "cvtStringToPixel",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 "XtToolkitWarning",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2983 "The colormap passed to cvtStringToPixel doesn't match the one registered to the device.\n",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985 status = XAllocNamedColor(dpy, colormap, (char*)str, &screenColor, &exactColor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 status = XParseColor (dpy, colormap, (char*)str, &screenColor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 if (status) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 status = allocate_nearest_color (dpy, colormap, visual, &screenColor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 /* We haven't set up this device totally yet, so just punt */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 status = XAllocNamedColor(dpy, colormap, (char*)str, &screenColor, &exactColor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 if (status == 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 params[0] = str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 /* Server returns a specific error code but Xlib discards it. Ugh */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 if (XLookupColor(DisplayOfScreen(screen), colormap, (char*) str,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 &exactColor, &screenColor)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 XtAppWarningMsg(the_app_con, "noColormap", "cvtStringToPixel",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 "XtToolkitError",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 "Cannot allocate colormap entry for \"%s\"",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 params, &num_params);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 XtAppWarningMsg(the_app_con, "badValue", "cvtStringToPixel",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 "XtToolkitError",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 "Color name \"%s\" is not defined", params, &num_params);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 *closure_ret = False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 return False;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 *closure_ret = (char*)True;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 done(Pixel, screenColor.pixel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 /* ARGSUSED */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 static void EmacsFreePixel (
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 XtAppContext app,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 XrmValuePtr toVal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 XtPointer closure,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 XrmValuePtr args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 Cardinal *num_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 if (*num_args != 2) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 XtAppWarningMsg(app, "wrongParameters","freePixel","XtToolkitError",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030 "Freeing a pixel requires screen and colormap arguments",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 (String *)NULL, (Cardinal *)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 if (closure) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 Screen *screen = *((Screen **) args[0].addr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 Colormap colormap = *((Colormap *) args[1].addr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 XFreeColors(DisplayOfScreen(screen), colormap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 (unsigned long*)toVal->addr, 1, (unsigned long)0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 /************************************************************************/
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3045 /* handle focus changes for native widgets */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3046 /************************************************************************/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3047 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3048 emacs_Xt_event_widget_focus_in (Widget w,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3049 XEvent *event,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
3050 String *UNUSED (params),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
3051 Cardinal *UNUSED (num_params))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3052 {
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
3053 struct frame *f =
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3054 x_any_widget_or_parent_to_frame (get_device_from_display (event->xany.display), w);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3055
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3056 XtSetKeyboardFocus (FRAME_X_SHELL_WIDGET (f), w);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3057 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3058
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3059 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
3060 emacs_Xt_event_widget_focus_out (Widget UNUSED (w),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
3061 XEvent *UNUSED (event),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
3062 String *UNUSED (params),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2237
diff changeset
3063 Cardinal *UNUSED (num_params))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3064 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3065 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3066
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3067 static XtActionsRec widgetActionsList[] =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3068 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3069 {"widget-focus-in", emacs_Xt_event_widget_focus_in },
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3070 {"widget-focus-out", emacs_Xt_event_widget_focus_out },
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3071 };
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3072
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3073 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3074 emacs_Xt_event_add_widget_actions (XtAppContext ctx)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3075 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3076 XtAppAddActions (ctx, widgetActionsList, 2);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3077 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3078
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3079
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3080 /************************************************************************/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 syms_of_event_Xt (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 502
diff changeset
3087 DEFSYMBOL (Qsans_modifiers);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 502
diff changeset
3088 DEFSYMBOL (Qself_insert_command);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 reinit_vars_of_event_Xt (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093 {
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
3094 Xt_event_stream = xnew_and_zero (struct event_stream);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 Xt_event_stream->event_pending_p = emacs_Xt_event_pending_p;
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
3096 Xt_event_stream->force_event_pending_cb= emacs_Xt_force_event_pending;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 Xt_event_stream->next_event_cb = emacs_Xt_next_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 Xt_event_stream->handle_magic_event_cb = emacs_Xt_handle_magic_event;
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
3099 Xt_event_stream->format_magic_event_cb = emacs_Xt_format_magic_event;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
3100 Xt_event_stream->compare_magic_event_cb= emacs_Xt_compare_magic_event;
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
3101 Xt_event_stream->hash_magic_event_cb = emacs_Xt_hash_magic_event;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 Xt_event_stream->add_timeout_cb = emacs_Xt_add_timeout;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3103 Xt_event_stream->remove_timeout_cb = emacs_Xt_remove_timeout;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 Xt_event_stream->select_console_cb = emacs_Xt_select_console;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 Xt_event_stream->unselect_console_cb = emacs_Xt_unselect_console;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 Xt_event_stream->select_process_cb = emacs_Xt_select_process;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107 Xt_event_stream->unselect_process_cb = emacs_Xt_unselect_process;
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 1111
diff changeset
3108 Xt_event_stream->drain_queue_cb = emacs_Xt_drain_queue;
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
3109 Xt_event_stream->create_io_streams_cb = emacs_Xt_create_io_streams;
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 851
diff changeset
3110 Xt_event_stream->delete_io_streams_cb = emacs_Xt_delete_io_streams;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3111 Xt_event_stream->current_event_timestamp_cb =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3112 emacs_Xt_current_event_timestamp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114 the_Xt_timeout_blocktype = Blocktype_new (struct Xt_timeout_blocktype);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 last_quit_check_signal_tick_count = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 /* this function only makes safe calls */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 init_what_input_once ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 vars_of_event_Xt (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 DEFVAR_BOOL ("x-allow-sendevents", &x_allow_sendevents /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 *Non-nil means to allow synthetic events. Nil means they are ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127 Beware: allowing emacs to process SendEvents opens a big security hole.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 x_allow_sendevents = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 #ifdef DEBUG_XEMACS
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3132 DEFVAR_INT ("debug-x-events", &debug_x_events /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 If non-zero, display debug information about X events that XEmacs sees.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134 Information is displayed on stderr. Currently defined values are:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 1 == non-verbose output
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 2 == verbose output
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138 */ );
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3139 debug_x_events = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 /* This mess is a hack that patches the shell widget to treat visual inheritance
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 the same as colormap and depth inheritance */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 static XtInitProc orig_shell_init_proc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147
2956
ee35a8fdcfcd [xemacs-hg @ 2005-09-27 05:29:41 by ben]
ben
parents: 2842
diff changeset
3148 static void ShellVisualPatch(Widget wanted, Widget new_,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 ArgList args, Cardinal *num_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 Widget p;
2956
ee35a8fdcfcd [xemacs-hg @ 2005-09-27 05:29:41 by ben]
ben
parents: 2842
diff changeset
3152 ShellWidget w = (ShellWidget) new_;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 /* first, call the original setup */
2956
ee35a8fdcfcd [xemacs-hg @ 2005-09-27 05:29:41 by ben]
ben
parents: 2842
diff changeset
3155 (*orig_shell_init_proc)(wanted, new_, args, num_args);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 /* if the visual isn't explicitly set, grab it from the nearest shell ancestor */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 if (w->shell.visual == CopyFromParent) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 p = XtParent(w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 while (p && !XtIsShell(p)) p = XtParent(p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 if (p) w->shell.visual = ((ShellWidget)p)->shell.visual;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 init_event_Xt_late (void) /* called when already initialized */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 timeout_id_tick = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169 pending_timeouts = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 completed_timeouts = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 event_stream = Xt_event_stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 XtToolkitInitialize ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 Xt_app_con = XtCreateApplicationContext ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 XtAppSetFallbackResources (Xt_app_con, (String *) x_fallback_resources);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3178 /* In select-x.c */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179 x_selection_timeout = (XtAppGetSelectionTimeout (Xt_app_con) / 1000);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180 XSetErrorHandler (x_error_handler);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 XSetIOErrorHandler (x_IO_error_handler);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3183 #ifndef WIN32_NATIVE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 XtAppAddInput (Xt_app_con, signal_event_pipe[0],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 (XtPointer) (XtInputReadMask /* | XtInputExceptMask */),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 Xt_what_callback, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189 XtAppSetTypeConverter (Xt_app_con, XtRString, XtRPixel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 EmacsXtCvtStringToPixel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 (XtConvertArgList) colorConvertArgs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 2, XtCacheByDisplay, EmacsFreePixel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 #ifdef XIM_XLIB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195 XtAppSetTypeConverter (Xt_app_con, XtRString, XtRXimStyles,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 EmacsXtCvtStringToXIMStyles,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 NULL, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198 XtCacheByDisplay, EmacsFreeXIMStyles);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199 #endif /* XIM_XLIB */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3200 /* Add extra actions to native widgets to handle focus and friends. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3201 emacs_Xt_event_add_widget_actions (Xt_app_con);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 /* insert the visual inheritance patch/hack described above */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 orig_shell_init_proc = shellClassRec.core_class.initialize;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 shellClassRec.core_class.initialize = ShellVisualPatch;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 }