annotate src/event-Xt.c @ 1318:b531bf8658e9

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