annotate src/event-stream.c @ 826:6728e641994e

[xemacs-hg @ 2002-05-05 11:30:15 by ben] syntax cache, 8-bit-format, lots of code cleanup README.packages: Update info about --package-path. i.c: Create an inheritable event and pass it on to XEmacs, so that ^C can be handled properly. Intercept ^C and signal the event. "Stop Build" in VC++ now works. bytecomp-runtime.el: Doc string changes. compat.el: Some attempts to redo this to make it truly useful and fix the "multiple versions interacting with each other" problem. Not yet done. Currently doesn't work. files.el: Use with-obsolete-variable to avoid warnings in new revert-buffer code. xemacs.mak: Split up CFLAGS into a version without flags specifying the C library. The problem seems to be that minitar depends on zlib, which depends specifically on libc.lib, not on any of the other C libraries. Unless you compile with libc.lib, you get errors -- specifically, no _errno in the other libraries, which must make it something other than an int. (#### But this doesn't seem to obtain in XEmacs, which also uses zlib, and can be linked with any of the C libraries. Maybe zlib is used differently and doesn't need errno, or maybe XEmacs provides an int errno; ... I don't understand. Makefile.in.in: Fix so that packages are around when testing. abbrev.c, alloc.c, buffer.c, buffer.h, bytecode.c, callint.c, casefiddle.c, casetab.c, casetab.h, charset.h, chartab.c, chartab.h, cmds.c, console-msw.h, console-stream.c, console-x.c, console.c, console.h, data.c, device-msw.c, device.c, device.h, dialog-msw.c, dialog-x.c, dired-msw.c, dired.c, doc.c, doprnt.c, dumper.c, editfns.c, elhash.c, emacs.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, events.c, events.h, extents.c, extents.h, faces.c, file-coding.c, file-coding.h, fileio.c, fns.c, font-lock.c, frame-gtk.c, frame-msw.c, frame-x.c, frame.c, frame.h, glade.c, glyphs-gtk.c, glyphs-msw.c, glyphs-msw.h, glyphs-x.c, glyphs.c, glyphs.h, gui-msw.c, gui-x.c, gui.h, gutter.h, hash.h, indent.c, insdel.c, intl-win32.c, intl.c, keymap.c, lisp-disunion.h, lisp-union.h, lisp.h, lread.c, lrecord.h, lstream.c, lstream.h, marker.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, minibuf.c, mule-ccl.c, mule-charset.c, mule-coding.c, mule-wnnfns.c, nas.c, objects-msw.c, objects-x.c, opaque.c, postgresql.c, print.c, process-nt.c, process-unix.c, process.c, process.h, profile.c, rangetab.c, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-x.c, redisplay.c, redisplay.h, regex.c, regex.h, scrollbar-msw.c, search.c, select-x.c, specifier.c, specifier.h, symbols.c, symsinit.h, syntax.c, syntax.h, syswindows.h, tests.c, text.c, text.h, tooltalk.c, ui-byhand.c, ui-gtk.c, unicode.c, win32.c, window.c: Another big Ben patch. -- FUNCTIONALITY CHANGES: add partial support for 8-bit-fixed, 16-bit-fixed, and 32-bit-fixed formats. not quite done yet. (in particular, needs functions to actually convert the buffer.) NOTE: lots of changes to regex.c here. also, many new *_fmt() inline funs that take an Internal_Format argument. redo syntax cache code. make the cache per-buffer; keep the cache valid across calls to functions that use it. also keep it valid across insertions/deletions and extent changes, as much as is possible. eliminate the junky regex-reentrancy code by passing in the relevant lisp info to the regex routines as local vars. add general mechanism in extents code for signalling extent changes. fix numerous problems with the case-table implementation; yoshiki never properly transferred many algorithms from old-style to new-style case tables. redo char tables to support a default argument, so that mapping only occurs over changed args. change many chartab functions to accept Lisp_Object instead of Lisp_Char_Table *. comment out the code in font-lock.c by default, because font-lock.el no longer uses it. we should consider eliminating it entirely. Don't output bell as ^G in console-stream when not a TTY. add -mswindows-termination-handle to interface with i.c, so we can properly kill a build. add more error-checking to buffer/string macros. add some additional buffer_or_string_() funs. -- INTERFACE CHANGES AFFECTING MORE CODE: switch the arguments of write_c_string and friends to be consistent with write_fmt_string, which must have printcharfun first. change BI_* macros to BYTE_* for increased clarity; similarly for bi_* local vars. change VOID_TO_LISP to be a one-argument function. eliminate no-longer-needed CVOID_TO_LISP. -- char/string macro changes: rename MAKE_CHAR() to make_emchar() for slightly less confusion with make_char(). (The former generates an Emchar, the latter a Lisp object. Conceivably we should rename make_char() -> wrap_char() and similarly for make_int(), make_float().) Similar changes for other *CHAR* macros -- we now consistently use names with `emchar' whenever we are working with Emchars. Any remaining name with just `char' always refers to a Lisp object. rename macros with XSTRING_* to string_* except for those that reference actual fields in the Lisp_String object, following conventions used elsewhere. rename set_string_{data,length} macros (the only ones to work with a Lisp_String_* instead of a Lisp_Object) to set_lispstringp_* to make the difference clear. try to be consistent about caps vs. lowercase in macro/inline-fun names for chars and such, which wasn't the case before. we now reserve caps either for XFOO_ macros that reference object fields (e.g. XSTRING_DATA) or for things that have non-function semantics, e.g. directly modifying an arg (BREAKUP_EMCHAR) or evaluating an arg (any arg) more than once. otherwise, use lowercase. here is a summary of most of the macros/inline funs changed by all of the above changes: BYTE_*_P -> byte_*_p XSTRING_BYTE -> string_byte set_string_data/length -> set_lispstringp_data/length XSTRING_CHAR_LENGTH -> string_char_length XSTRING_CHAR -> string_emchar INTBYTE_FIRST_BYTE_P -> intbyte_first_byte_p INTBYTE_LEADING_BYTE_P -> intbyte_leading_byte_p charptr_copy_char -> charptr_copy_emchar LEADING_BYTE_* -> leading_byte_* CHAR_* -> EMCHAR_* *_CHAR_* -> *_EMCHAR_* *_CHAR -> *_EMCHAR CHARSET_BY_ -> charset_by_* BYTE_SHIFT_JIS* -> byte_shift_jis* BYTE_BIG5* -> byte_big5* REP_BYTES_BY_FIRST_BYTE -> rep_bytes_by_first_byte char_to_unicode -> emchar_to_unicode valid_char_p -> valid_emchar_p Change intbyte_strcmp -> qxestrcmp_c (duplicated functionality). -- INTERFACE CHANGES AFFECTING LESS CODE: use DECLARE_INLINE_HEADER in various places. remove '#ifdef emacs' from XEmacs-only files. eliminate CHAR_TABLE_VALUE(), which duplicated the functionality of get_char_table(). add BUFFER_TEXT_LOOP to simplify iterations over buffer text. define typedefs for signed and unsigned types of fixed sizes (INT_32_BIT, UINT_32_BIT, etc.). create ALIGN_FOR_TYPE as a higher-level interface onto ALIGN_SIZE; fix code to use it. add charptr_emchar_len to return the text length of the character pointed to by a ptr; use it in place of charcount_to_bytecount(..., 1). add emchar_len to return the text length of a given character. add types Bytexpos and Charxpos to generalize Bytebpos/Bytecount and Charbpos/Charcount, in code (particularly, the extents code and redisplay code) that works with either kind of index. rename redisplay struct params with names such as `charbpos' to e.g. `charpos' when they are e.g. a Charxpos, not a Charbpos. eliminate xxDEFUN in place of DEFUN; no longer necessary with changes awhile back to doc.c. split up big ugly combined list of EXFUNs in lisp.h on a file-by-file basis, since other prototypes are similarly split. rewrite some "*_UNSAFE" macros as inline funs and eliminate the _UNSAFE suffix. move most string code from lisp.h to text.h; the string code and text.h code is now intertwined in such a fashion that they need to be in the same place and partially interleaved. (you can't create forward references for inline funs) automated/lisp-tests.el, automated/symbol-tests.el, automated/test-harness.el: Fix test harness to output FAIL messages to stderr when in batch mode. Fix up some problems in lisp-tests/symbol-tests that were causing spurious failures.
author ben
date Sun, 05 May 2002 11:33:57 +0000
parents a634e3b7acc8
children e7ee5f8bde58
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 portable interface to event streams.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Board of Trustees, University of Illinois.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 Copyright (C) 1995 Sun Microsystems, Inc.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
5 Copyright (C) 1995, 1996, 2001, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 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
11 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 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
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
26 /* Authorship:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
27
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
28 Created 1991 by Jamie Zawinski.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
29 A great deal of work over the ages by Ben Wing (Mule-ization for 19.12,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
30 device abstraction for 19.12/19.13, async timers for 19.14,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
31 rewriting of focus code for 19.12, pre-idle hook for 19.12,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
32 redoing of signal and quit handling for 19.9 and 19.12,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
33 misc-user events to clean up menu/scrollbar handling for 19.11,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
34 function-key-map/key-translation-map/keyboard-translate-table for
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
35 19.13/19.14, open-dribble-file for 19.13, much other cleanup).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
36 focus-follows-mouse from Chuck Thompson, 1995.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
37 XIM stuff by Martin Buchholz, c. 1996?.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
38 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
39
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 /* This file has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 * DANGER!!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 * If you ever change ANYTHING in this file, you MUST run the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 * testcases at the end to make sure that you haven't changed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 * the semantics of recent-keys, last-input-char, or keyboard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 * macros. You'd be surprised how easy it is to break this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 */
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 /* TODO:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 This stuff is way too hard to maintain - needs rework.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 The command builder should deal only with key and button events.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Other command events should be able to come in the MIDDLE of a key
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 sequence, without disturbing the key sequence composition, or the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 command builder structure representing it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 Someone should rethink universal-argument and figure out how an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 arbitrary command can influence the next command (universal-argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 or universal-coding-system-argument) or the next key (hyperify).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 Both C-h and Help in the middle of a key sequence should trigger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 prefix-help-command. help-char is stupid. Maybe we need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 keymap-of-last-resort?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 After prefix-help is run, one should be able to CONTINUE TYPING,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 instead of RETYPING, the key sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 #include "blocktype.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 #include "commands.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 #include "device.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 #include "elhash.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 #include "events.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 #include "insdel.h" /* for buffer_reset_changes */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 #include "keymap.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 #include "lstream.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 #include "macros.h" /* for defining_keyboard_macro */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
86 #include "menubar.h" /* #### for evil kludges. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 #include "process.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 #include "window.h"
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 #include "sysdep.h" /* init_poll_for_quit() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 #include "syssignal.h" /* SIGCHLD, etc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 #include "sysfile.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 #include "systime.h" /* to set Vlast_input_time */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 #include "file-coding.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 #include <errno.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 /* The number of keystrokes between auto-saves. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 452
diff changeset
100 static Fixnum auto_save_interval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 Lisp_Object Qundefined_keystroke_sequence;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
103 Lisp_Object Qinvalid_key_binding;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 Lisp_Object Qcommand_event_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 /* Hooks to run before and after each command. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 Lisp_Object Vpre_command_hook, Vpost_command_hook;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 Lisp_Object Qpre_command_hook, Qpost_command_hook;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
111 /* See simple.el */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
112 Lisp_Object Qhandle_pre_motion_command, Qhandle_post_motion_command;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
113
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 /* Hook run when XEmacs is about to be idle. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 Lisp_Object Qpre_idle_hook, Vpre_idle_hook;
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 /* Control gratuitous keyboard focus throwing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 int focus_follows_mouse;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
120 /* When true, modifier keys are sticky. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
121 int modifier_keys_are_sticky;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
122 /* Modifier keys are sticky for this many milliseconds. */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
123 Lisp_Object Vmodifier_keys_sticky_time;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
124
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
125 /* Here FSF Emacs 20.7 defines Vpost_command_idle_hook,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
126 post_command_idle_delay, Vdeferred_action_list, and
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
127 Vdeferred_action_function, but we don't because that stuff is crap,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
128 and we're smarter than them, and their momas are fat. */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
129
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
130 /* FSF Emacs 20.7 also defines Vinput_method_function,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
131 Qinput_method_exit_on_first_char and Qinput_method_use_echo_area.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
132 I don't know this should be imported or not. */
428
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 /* Non-nil disable property on a command means
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 do not execute it; call disabled-command-hook's value instead. */
733
b1f74adcc1ff [xemacs-hg @ 2002-01-22 20:40:00 by janv]
janv
parents: 707
diff changeset
136 Lisp_Object Qdisabled;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 EXFUN (Fnext_command_event, 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 static void pre_command_hook (void);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 static void post_command_hook (void);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 /* Last keyboard or mouse input event read as a command. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 Lisp_Object Vlast_command_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 /* The nearest ASCII equivalent of the above. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 Lisp_Object Vlast_command_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 /* Last keyboard or mouse event read for any purpose. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 Lisp_Object Vlast_input_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 /* The nearest ASCII equivalent of the above. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 Lisp_Object Vlast_input_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 Lisp_Object Vcurrent_mouse_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 /* This is fbound in cmdloop.el, see the commentary there */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 Lisp_Object Qcancel_mode_internal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 /* If not Qnil, event objects to be read as the next command input */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 Lisp_Object Vunread_command_events;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 Lisp_Object Vunread_command_event; /* obsoleteness support */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 static Lisp_Object Qunread_command_events, Qunread_command_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 /* Previous command, represented by a Lisp object.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
167 Does not include prefix commands and arg setting commands. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 Lisp_Object Vlast_command;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
170 /* Contents of this-command-properties for the last command. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
171 Lisp_Object Vlast_command_properties;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
172
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 /* If a command sets this, the value goes into
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
174 last-command for the next command. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 Lisp_Object Vthis_command;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
177 /* If a command sets this, the value goes into
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
178 last-command-properties for the next command. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
179 Lisp_Object Vthis_command_properties;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
180
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 /* The value of point when the last command was executed. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 593
diff changeset
182 Charbpos last_point_position;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 /* The frame that was current when the last command was started. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 Lisp_Object Vlast_selected_frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 /* The buffer that was current when the last command was started. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 Lisp_Object last_point_position_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 /* A (16bit . 16bit) representation of the time of the last-command-event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 Lisp_Object Vlast_input_time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 /* A (16bit 16bit usec) representation of the time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 of the last-command-event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 Lisp_Object Vlast_command_event_time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 /* Character to recognize as the help char. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 Lisp_Object Vhelp_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 /* Form to execute when help char is typed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 Lisp_Object Vhelp_form;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 /* Command to run when the help character follows a prefix key. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 Lisp_Object Vprefix_help_command;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 /* Flag to tell QUIT that some interesting occurrence (e.g. a keypress)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 may have happened. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 volatile int something_happened;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 /* Hash table to translate keysyms through */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 Lisp_Object Vkeyboard_translate_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 /* If control-meta-super-shift-X is undefined, try control-meta-super-x */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 Lisp_Object Vretry_undefined_key_binding_unshifted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 Lisp_Object Qretry_undefined_key_binding_unshifted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
217 #ifdef MULE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 /* If composed input is undefined, use self-insert-char */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 Lisp_Object Vcomposed_character_default_binding;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
220 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 /* Console that corresponds to our controlling terminal */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 Lisp_Object Vcontrolling_terminal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 /* An event (actually an event chain linked through event_next) or Qnil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 Lisp_Object Vthis_command_keys;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 Lisp_Object Vthis_command_keys_tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 /* #### kludge! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 Lisp_Object Qauto_show_make_point_visible;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 /* File in which we write all commands we read; an lstream */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 static Lisp_Object Vdribble_file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 /* Recent keys ring location; a vector of events or nil-s */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 Lisp_Object Vrecent_keys_ring;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 int recent_keys_ring_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 int recent_keys_ring_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 /* Boolean specifying whether keystrokes should be added to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 recent-keys. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 int inhibit_input_event_recording;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
245 Lisp_Object Qself_insert_defer_undo;
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
246
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 /* this is in keymap.c */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 extern Lisp_Object Fmake_keymap (Lisp_Object name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 #ifdef DEBUG_XEMACS
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 452
diff changeset
251 Fixnum debug_emacs_events;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 external_debugging_print_event (char *event_description, Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 {
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
256 write_c_string (Qexternal_debugging_output, "(");
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
257 write_c_string (Qexternal_debugging_output, event_description);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
258 write_c_string (Qexternal_debugging_output, ") ");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 print_internal (event, Qexternal_debugging_output, 1);
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
260 write_c_string (Qexternal_debugging_output, "\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 #define DEBUG_PRINT_EMACS_EVENT(event_description, event) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 if (debug_emacs_events) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 external_debugging_print_event (event_description, event); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 #define DEBUG_PRINT_EMACS_EVENT(string, event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 /* The callback routines for the window system or terminal driver */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 struct event_stream *event_stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 static void echo_key_event (struct command_builder *, Lisp_Object event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 static void maybe_kbd_translate (Lisp_Object event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 /* This structure is basically a typeahead queue: things like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 wait-reading-process-output will delay the execution of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 keyboard and mouse events by pushing them here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 Chained through event_next()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 command_event_queue_tail is a pointer to the last-added element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 static Lisp_Object command_event_queue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 static Lisp_Object command_event_queue_tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 /* Nonzero means echo unfinished commands after this many seconds of pause. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 static Lisp_Object Vecho_keystrokes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 /* The number of keystrokes since the last auto-save. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 static int keystrokes_since_auto_save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 /* Used by the C-g signal handler so that it will never "hard quit"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 when waiting for an event. Otherwise holding down C-g could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 cause a suspension back to the shell, which is generally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 undesirable. (#### This doesn't fully work.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 int emacs_is_blocking;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 /* Handlers which run during sit-for, sleep-for and accept-process-output
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 are not allowed to recursively call these routines. We record here
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 if we are in that situation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 static Lisp_Object recursive_sit_for;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 /* Command-builder object */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 #define XCOMMAND_BUILDER(x) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 XRECORD (x, command_builder, struct command_builder)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
314 #define wrap_command_builder(p) wrap_record (p, command_builder)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 #define COMMAND_BUILDERP(x) RECORDP (x, command_builder)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 #define CHECK_COMMAND_BUILDER(x) CHECK_RECORD (x, command_builder)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
317 #define CONCHECK_COMMAND_BUILDER(x) CONCHECK_RECORD (x, command_builder)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
318
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
319 static Lisp_Object Vcommand_builder_free_list;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 mark_command_builder (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 struct command_builder *builder = XCOMMAND_BUILDER (obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 mark_object (builder->current_events);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 mark_object (builder->most_current_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 mark_object (builder->last_non_munged_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 mark_object (builder->munge_me[0].first_mungeable_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 mark_object (builder->munge_me[1].first_mungeable_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 return builder->console;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 finalize_command_builder (void *header, int for_disksave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 if (!for_disksave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
338 struct command_builder *b = (struct command_builder *) header;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
339 if (b->echo_buf)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
340 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
341 xfree (b->echo_buf);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
342 b->echo_buf = 0;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
343 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 DEFINE_LRECORD_IMPLEMENTATION ("command-builder", command_builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 mark_command_builder, internal_object_printer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 finalize_command_builder, 0, 0, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 struct command_builder);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
351
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 reset_command_builder_event_chain (struct command_builder *builder)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 builder->current_events = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 builder->most_current_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 builder->last_non_munged_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 builder->munge_me[0].first_mungeable_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 builder->munge_me[1].first_mungeable_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 Lisp_Object
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
363 allocate_command_builder (Lisp_Object console, int with_echo_buf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
365 Lisp_Object builder_obj =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
366 allocate_managed_lcrecord (Vcommand_builder_free_list);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
367 struct command_builder *builder = XCOMMAND_BUILDER (builder_obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 builder->console = console;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 reset_command_builder_event_chain (builder);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
371 if (with_echo_buf)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
372 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
373 /* #### This badly needs to be turned into a Dynarr */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
374 builder->echo_buf_length = 300; /* #### Kludge */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
375 builder->echo_buf = xnew_array (Intbyte, builder->echo_buf_length);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
376 builder->echo_buf[0] = 0;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
377 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
378 else
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
379 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
380 builder->echo_buf_length = 0;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
381 builder->echo_buf = NULL;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
382 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 builder->echo_buf_index = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 builder->self_insert_countdown = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 return builder_obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
389 /* Copy or clone COLLAPSING (copy to NEW_BUILDINGS if non-zero,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
390 otherwise clone); but don't copy the echo-buf stuff. (The calling
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
391 routines don't need it and will reset it, and we would rather avoid
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
392 malloc.) */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
393
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
394 static Lisp_Object
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
395 copy_command_builder (struct command_builder *collapsing,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
396 struct command_builder *new_buildings)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
397 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
398 if (!new_buildings)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
399 new_buildings = XCOMMAND_BUILDER (allocate_command_builder (Qnil, 0));
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
400
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
401 new_buildings->self_insert_countdown = collapsing->self_insert_countdown;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
402
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
403 deallocate_event_chain (new_buildings->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
404 new_buildings->current_events =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
405 copy_event_chain (collapsing->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
406
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
407 new_buildings->most_current_event =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
408 transfer_event_chain_pointer (collapsing->most_current_event,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
409 collapsing->current_events,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
410 new_buildings->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
411 new_buildings->last_non_munged_event =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
412 transfer_event_chain_pointer (collapsing->last_non_munged_event,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
413 collapsing->current_events,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
414 new_buildings->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
415 new_buildings->munge_me[0].first_mungeable_event =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
416 transfer_event_chain_pointer (collapsing->munge_me[0].
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
417 first_mungeable_event,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
418 collapsing->current_events,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
419 new_buildings->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
420 new_buildings->munge_me[1].first_mungeable_event =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
421 transfer_event_chain_pointer (collapsing->munge_me[1].
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
422 first_mungeable_event,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
423 collapsing->current_events,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
424 new_buildings->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
425
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
426 return wrap_command_builder (new_buildings);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
427 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
428
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
429 static void
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
430 free_command_builder (struct command_builder *builder)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
431 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
432 if (builder->echo_buf)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
433 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
434 xfree (builder->echo_buf);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
435 builder->echo_buf = NULL;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
436 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
437 free_managed_lcrecord (Vcommand_builder_free_list,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
438 wrap_command_builder (builder));
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
439 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
440
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 command_builder_append_event (struct command_builder *builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 assert (EVENTP (event));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
447 event = Fcopy_event (event, Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 if (EVENTP (builder->most_current_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 XSET_EVENT_NEXT (builder->most_current_event, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 builder->current_events = event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 builder->most_current_event = event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 if (NILP (builder->munge_me[0].first_mungeable_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 builder->munge_me[0].first_mungeable_event = event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 if (NILP (builder->munge_me[1].first_mungeable_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 builder->munge_me[1].first_mungeable_event = event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 /* Low-level interfaces onto event methods */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 /**********************************************************************/
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 enum event_stream_operation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 EVENT_STREAM_PROCESS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 EVENT_STREAM_TIMEOUT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 EVENT_STREAM_CONSOLE,
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
470 EVENT_STREAM_READ,
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
471 EVENT_STREAM_NOTHING,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 };
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 check_event_stream_ok (enum event_stream_operation op)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 if (!event_stream && noninteractive)
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
478 /* See comment in init_event_stream() */
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
479 init_event_stream ();
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
480 else assert (event_stream);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 event_stream_event_pending_p (int user)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 return event_stream && event_stream->event_pending_p (user);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
489 static void
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
490 event_stream_force_event_pending (struct frame *f)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
491 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
492 if (event_stream->force_event_pending)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
493 event_stream->force_event_pending (f);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
494 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
495
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 static int
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
497 maybe_read_quit_event (Lisp_Event *event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 /* A C-g that came from `sigint_happened' will always come from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 controlling terminal. If that doesn't exist, however, then the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 user manually sent us a SIGINT, and we pretend the C-g came from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 the selected console. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 struct console *con;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 if (CONSOLEP (Vcontrolling_terminal) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 CONSOLE_LIVE_P (XCONSOLE (Vcontrolling_terminal)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 con = XCONSOLE (Vcontrolling_terminal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 con = XCONSOLE (Fselected_console ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 if (sigint_happened)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 int ch = CONSOLE_QUIT_CHAR (con);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 sigint_happened = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 character_to_event (ch, event, con, 1, 1);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
517 event->channel = wrap_console (con);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
524 event_stream_next_event (Lisp_Event *event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 Lisp_Object event_obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 check_event_stream_ok (EVENT_STREAM_READ);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
530 event_obj = wrap_event (event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 zero_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 /* If C-g was pressed, treat it as a character to be read.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 Note that if C-g was pressed while we were blocking,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 the SIGINT signal handler will be called. It will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 set Vquit_flag and write a byte on our "fake pipe",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 which will unblock us. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 if (maybe_read_quit_event (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 DEBUG_PRINT_EMACS_EVENT ("SIGINT", event_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 /* If a longjmp() happens in the callback, we're screwed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 Let's hope it doesn't. I think the code here is fairly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 clean and doesn't do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 emacs_is_blocking = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 event_stream->next_event_cb (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 emacs_is_blocking = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 #ifdef DEBUG_XEMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 /* timeout events have more info set later, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 print the event out in next_event_internal(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 if (event->event_type != timeout_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 DEBUG_PRINT_EMACS_EVENT ("real", event_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 maybe_kbd_translate (event_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 }
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 void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
560 event_stream_handle_magic_event (Lisp_Event *event)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 check_event_stream_ok (EVENT_STREAM_READ);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 event_stream->handle_magic_event_cb (event);
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
788
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
566 void
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
567 event_stream_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
568 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
569 check_event_stream_ok (EVENT_STREAM_NOTHING);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
570 event_stream->format_magic_event_cb (event, pstream);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
571 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
572
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
573 int
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
574 event_stream_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
575 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
576 check_event_stream_ok (EVENT_STREAM_NOTHING);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
577 return event_stream->compare_magic_event_cb (e1, e2);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
578 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
579
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
580 Hashcode
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
581 event_stream_hash_magic_event (Lisp_Event *e)
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
582 {
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
583 check_event_stream_ok (EVENT_STREAM_NOTHING);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
584 return event_stream->hash_magic_event_cb (e);
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
585 }
026c5bf9c134 [xemacs-hg @ 2002-03-21 07:29:57 by ben]
ben
parents: 771
diff changeset
586
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 event_stream_add_timeout (EMACS_TIME timeout)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 check_event_stream_ok (EVENT_STREAM_TIMEOUT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 return event_stream->add_timeout_cb (timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 event_stream_remove_timeout (int id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 check_event_stream_ok (EVENT_STREAM_TIMEOUT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 event_stream->remove_timeout_cb (id);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 event_stream_select_console (struct console *con)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 check_event_stream_ok (EVENT_STREAM_CONSOLE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 if (!con->input_enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 event_stream->select_console_cb (con);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 con->input_enabled = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 event_stream_unselect_console (struct console *con)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 check_event_stream_ok (EVENT_STREAM_CONSOLE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 if (con->input_enabled)
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 event_stream->unselect_console_cb (con);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 con->input_enabled = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
624 event_stream_select_process (Lisp_Process *proc)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 check_event_stream_ok (EVENT_STREAM_PROCESS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 if (!get_process_selected_p (proc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 event_stream->select_process_cb (proc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 set_process_selected_p (proc, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 }
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 void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
635 event_stream_unselect_process (Lisp_Process *proc)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 check_event_stream_ok (EVENT_STREAM_PROCESS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 if (get_process_selected_p (proc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 event_stream->unselect_process_cb (proc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 set_process_selected_p (proc, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 USID
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
646 event_stream_create_stream_pair (void *inhandle, void *outhandle,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
647 Lisp_Object *instream, Lisp_Object *outstream, int flags)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 check_event_stream_ok (EVENT_STREAM_PROCESS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 return event_stream->create_stream_pair_cb
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 (inhandle, outhandle, instream, outstream, flags);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 }
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 USID
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 event_stream_delete_stream_pair (Lisp_Object instream, Lisp_Object outstream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 check_event_stream_ok (EVENT_STREAM_PROCESS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 return event_stream->delete_stream_pair_cb (instream, outstream);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 event_stream_quit_p (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 if (event_stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 event_stream->quit_p_cb ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
668 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
669 event_stream_current_event_timestamp (struct console *c)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
670 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
671 if (event_stream && event_stream->current_event_timestamp_cb)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
672 return event_stream->current_event_timestamp_cb (c);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
673 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
674 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
675 }
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 /* Character prompting */
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 echo_key_event (struct command_builder *command_builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 /* This function can GC */
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
687 DECLARE_EISTRING_MALLOC (buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 Bytecount buf_index = command_builder->echo_buf_index;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 593
diff changeset
689 Intbyte *e;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 Bytecount len;
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 (buf_index < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 buf_index = 0; /* We're echoing now */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 clear_echo_area (selected_frame (), Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 format_event_object (buf, XEVENT (event), 1);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
699 len = eilen (buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 if (len + buf_index + 4 > command_builder->echo_buf_length)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
702 {
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
703 eifree (buf);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
704 return;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
705 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 e = command_builder->echo_buf + buf_index;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
707 memcpy (e, eidata (buf), len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 e += len;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
709 eifree (buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 e[0] = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 e[1] = '-';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 e[2] = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 e[3] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 command_builder->echo_buf_index = buf_index + len + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 regenerate_echo_keys_from_this_command_keys (struct command_builder *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 builder)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 Lisp_Object event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 builder->echo_buf_index = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 EVENT_CHAIN_LOOP (event, Vthis_command_keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 echo_key_event (builder, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 maybe_echo_keys (struct command_builder *command_builder, int no_snooze)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 double echo_keystrokes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 struct frame *f = selected_frame ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 /* Message turns off echoing unless more keystrokes turn it on again. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 if (echo_area_active (f) && !EQ (Qcommand, echo_area_status (f)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 if (INTP (Vecho_keystrokes) || FLOATP (Vecho_keystrokes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 echo_keystrokes = extract_float (Vecho_keystrokes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 echo_keystrokes = 0;
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 if (minibuf_level == 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 && echo_keystrokes > 0.0
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
748 #if defined (HAVE_X_WINDOWS) && defined (LWLIB_MENUBARS_LUCID)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
749 && !x_kludge_lw_menu_active ()
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
750 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
751 )
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 if (!no_snooze)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 /* #### C-g here will cause QUIT. Setting dont_check_for_quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 doesn't work. See check_quit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 if (NILP (Fsit_for (Vecho_keystrokes, Qnil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 /* input came in, so don't echo. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 return;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 echo_area_message (f, command_builder->echo_buf, Qnil, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 /* not echo_buf_index. That doesn't include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 the terminating " - ". */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 strlen ((char *) command_builder->echo_buf),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 Qcommand);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 reset_key_echo (struct command_builder *command_builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 int remove_echo_area_echo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 struct frame *f = selected_frame ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776
757
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
777 if (command_builder)
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
778 command_builder->echo_buf_index = -1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 if (remove_echo_area_echo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 clear_echo_area (f, Qcommand, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783
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 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 /* random junk */
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 maybe_kbd_translate (Lisp_Object event)
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 Emchar c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 int did_translate = 0;
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 if (XEVENT_TYPE (event) != key_press_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 if (!HASH_TABLEP (Vkeyboard_translate_table))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 if (EQ (Fhash_table_count (Vkeyboard_translate_table), Qzero))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 return;
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 c = event_to_character (XEVENT (event), 0, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 if (c != -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 Lisp_Object traduit = Fgethash (make_char (c), Vkeyboard_translate_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 if (!NILP (traduit) && SYMBOLP (traduit))
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 XEVENT (event)->event.key.keysym = traduit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 XEVENT (event)->event.key.modifiers = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 did_translate = 1;
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 else if (CHARP (traduit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
815 Lisp_Event ev2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 /* This used to call Fcharacter_to_event() directly into EVENT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 but that can eradicate timestamps and other such stuff.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 This way is safer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 zero_event (&ev2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 character_to_event (XCHAR (traduit), &ev2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 XCONSOLE (EVENT_CHANNEL (XEVENT (event))), 1, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 XEVENT (event)->event.key.keysym = ev2.event.key.keysym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 XEVENT (event)->event.key.modifiers = ev2.event.key.modifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 did_translate = 1;
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 if (!did_translate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 Lisp_Object traduit = Fgethash (XEVENT (event)->event.key.keysym,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 Vkeyboard_translate_table, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 if (!NILP (traduit) && SYMBOLP (traduit))
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 XEVENT (event)->event.key.keysym = traduit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 did_translate = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
838 else if (CHARP (traduit))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
839 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
840 Lisp_Event ev2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
841
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
842 zero_event (&ev2);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
843 character_to_event (XCHAR (traduit), &ev2,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
844 XCONSOLE (EVENT_CHANNEL (XEVENT (event))), 1, 1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
845 XEVENT (event)->event.key.keysym = ev2.event.key.keysym;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
846 XEVENT (event)->event.key.modifiers |= ev2.event.key.modifiers;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
847 did_translate = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
848 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 #ifdef DEBUG_XEMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 if (did_translate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 DEBUG_PRINT_EMACS_EVENT ("->keyboard-translate-table", event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 #endif
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 /* NB: The following auto-save stuff is in keyboard.c in FSFmacs, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 keystrokes_since_auto_save is equivalent to the difference between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 num_nonmacro_input_chars and last_auto_save. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
861 /* When an auto-save happens, record the number of keystrokes, and
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
862 don't do again soon. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 record_auto_save (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 keystrokes_since_auto_save = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 /* Make an auto save happen as soon as possible at command level. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 force_auto_save_soon (void)
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 keystrokes_since_auto_save = 1 + max (auto_save_interval, 20);
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 maybe_do_auto_save (void)
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 /* This function can call lisp */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 keystrokes_since_auto_save++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 if (auto_save_interval > 0 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 keystrokes_since_auto_save > max (auto_save_interval, 20) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 !detect_input_pending ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 Fdo_auto_save (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 record_auto_save ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 print_help (Lisp_Object object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 Fprinc (object, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 execute_help_form (struct command_builder *command_builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 Lisp_Object help = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 Bytecount buf_index = command_builder->echo_buf_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 Lisp_Object echo = ((buf_index <= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 ? Qnil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 : make_string (command_builder->echo_buf,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 buf_index));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 GCPRO2 (echo, help);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 record_unwind_protect (save_window_excursion_unwind,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 Fcurrent_window_configuration (Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 reset_key_echo (command_builder, 1);
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 help = Feval (Vhelp_form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 if (STRINGP (help))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 internal_with_output_to_temp_buffer (build_string ("*Help*"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 print_help, help, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 Fnext_command_event (event, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 /* Remove the help from the frame */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
924 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 /* Hmmmm. Tricky. The unbind restores an old window configuration,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 apparently bypassing any setting of windows_structure_changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 So we need to set it so that things get redrawn properly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 /* #### This is massive overkill. Look at doing it better once the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 new redisplay is fully in place. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 Lisp_Object frmcons, devcons, concons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
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 struct frame *f = XFRAME (XCAR (frmcons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 }
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 redisplay ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 if (event_matches_key_specifier_p (XEVENT (event), make_char (' ')))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 /* Discard next key if it is a space */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 reset_key_echo (command_builder, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 Fnext_command_event (event, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 command_builder->echo_buf_index = buf_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 if (buf_index > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 memcpy (command_builder->echo_buf,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 XSTRING_DATA (echo), buf_index + 1); /* terminating 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 /* input pending */
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 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 detect_input_pending (void)
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 /* Always call the event_pending_p hook even if there's an unread
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 character, because that might do some needed ^G detection (on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 systems without SIGIO, for example).
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 if (event_stream_event_pending_p (1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 if (!NILP (Vunread_command_events) || !NILP (Vunread_command_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 if (!NILP (command_event_queue))
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 Lisp_Object event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 EVENT_CHAIN_LOOP (event, command_event_queue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 if (XEVENT_TYPE (event) != eval_event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 && XEVENT_TYPE (event) != magic_eval_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 DEFUN ("input-pending-p", Finput_pending_p, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 Return t if command input is currently available with no waiting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 Actually, the value is nil only if we can be sure that no input is available.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 return detect_input_pending () ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 /* timeouts */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
998 /* NOTE: "Low-level" or "interval" timeouts are one-shot timeouts that
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
999 measure single intervals. "High-level timeouts" or "wakeups" are
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1000 the objects generated by `add-timeout' or `add-async-timout' --
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1001 they can fire repeatedly (and in fact can have a different initial
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1002 time and resignal time). Given the nature of both setitimer() and
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1003 select() -- i.e. all we get is a single one-shot timer -- we have
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1004 to decompose all high-level timeouts into a series of intervals or
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1005 low-level timeouts.
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1006
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1007 Low-level timeouts are of two varieties: synchronous and asynchronous.
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1008 The former are handled at the window-system level, the latter in
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1009 signal.c.
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1010 */
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1011
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1012 /**** Low-level timeout helper functions. ****
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 These functions maintain a sorted list of one-shot timeouts (where
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1015 the timeouts are in absolute time so we never lose any time as a
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1016 result of the delay between noting an interval and firing the next
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1017 one). They are intended for use by functions that need to convert
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1018 a list of absolute timeouts into a series of intervals to wait
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1019 for. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 /* We ensure that 0 is never a valid ID, so that a value of 0 can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 used to indicate an absence of a timer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 static int low_level_timeout_id_tick;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 static struct low_level_timeout_blocktype
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 Blocktype_declare (struct low_level_timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 } *the_low_level_timeout_blocktype;
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 /* Add a one-shot timeout at time TIME to TIMEOUT_LIST. Return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 a unique ID identifying the timeout. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 add_low_level_timeout (struct low_level_timeout **timeout_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 EMACS_TIME thyme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 struct low_level_timeout *tm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 struct low_level_timeout *t, **tt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 /* Allocate a new time struct. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 tm = Blocktype_alloc (the_low_level_timeout_blocktype);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 tm->next = NULL;
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1044 /* Don't just use ++low_level_timeout_id_tick, for the (admittedly
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1045 rare) case in which numbers wrap around. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 if (low_level_timeout_id_tick == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 low_level_timeout_id_tick++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 tm->id = low_level_timeout_id_tick++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 tm->time = thyme;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 /* Add it to the queue. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 tt = timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 t = *tt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 while (t && EMACS_TIME_EQUAL_OR_GREATER (tm->time, t->time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 tt = &t->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 t = *tt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 tm->next = t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 *tt = tm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 return tm->id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 /* Remove the low-level timeout identified by ID from TIMEOUT_LIST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 If the timeout is not there, do nothing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 remove_low_level_timeout (struct low_level_timeout **timeout_list, int id)
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 struct low_level_timeout *t, *prev;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 /* find it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 for (t = *timeout_list, prev = NULL; t && t->id != id; t = t->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 prev = t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 if (!t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 return; /* couldn't find it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 if (!prev)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 *timeout_list = t->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 else prev->next = t->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 Blocktype_free (the_low_level_timeout_blocktype, t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 /* If there are timeouts on TIMEOUT_LIST, store the relative time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 interval to the first timeout on the list into INTERVAL and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 return 1. Otherwise, return 0. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 get_low_level_timeout_interval (struct low_level_timeout *timeout_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 EMACS_TIME *interval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 if (!timeout_list) /* no timer events; block indefinitely */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 EMACS_TIME current_time;
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 /* The time to block is the difference between the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 (earliest) timer on the queue and the current time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 If that is negative, then the timer will fire immediately
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 but we still have to call select(), with a zero-valued
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 timeout: user events must have precedence over timer events. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 EMACS_GET_TIME (current_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 if (EMACS_TIME_GREATER (timeout_list->time, current_time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 EMACS_SUB_TIME (*interval, timeout_list->time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 current_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 EMACS_SET_SECS_USECS (*interval, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 /* Pop the first (i.e. soonest) timeout off of TIMEOUT_LIST and return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 its ID. Also, if TIME_OUT is not 0, store the absolute time of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 timeout into TIME_OUT. */
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 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 pop_low_level_timeout (struct low_level_timeout **timeout_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 EMACS_TIME *time_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 struct low_level_timeout *tm = *timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 int id;
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 assert (tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 id = tm->id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 if (time_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 *time_out = tm->time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 *timeout_list = tm->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 Blocktype_free (the_low_level_timeout_blocktype, tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 return id;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1139 /**** High-level timeout functions. **** */
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1140
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1141 /* We ensure that 0 is never a valid ID, so that a value of 0 can be
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1142 used to indicate an absence of a timer. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 static int timeout_id_tick;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 static Lisp_Object pending_timeout_list, pending_async_timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 static Lisp_Object Vtimeout_free_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 mark_timeout (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1152 Lisp_Timeout *tm = XTIMEOUT (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 mark_object (tm->function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 return tm->object;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 static const struct lrecord_description timeout_description[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1158 { XD_LISP_OBJECT, offsetof (Lisp_Timeout, function) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1159 { XD_LISP_OBJECT, offsetof (Lisp_Timeout, object) },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 DEFINE_LRECORD_IMPLEMENTATION ("timeout", timeout,
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
1164 mark_timeout, internal_object_printer,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1165 0, 0, 0, timeout_description, Lisp_Timeout);
428
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 /* Generate a timeout and return its ID. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 event_stream_generate_wakeup (unsigned int milliseconds,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 unsigned int vanilliseconds,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 Lisp_Object function, Lisp_Object object,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 int async_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 Lisp_Object op = allocate_managed_lcrecord (Vtimeout_free_list);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1176 Lisp_Timeout *timeout = XTIMEOUT (op);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 EMACS_TIME current_time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 EMACS_TIME interval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1180 /* Don't just use ++timeout_id_tick, for the (admittedly rare) case
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1181 in which numbers wrap around. */
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1182 if (timeout_id_tick == 0)
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1183 timeout_id_tick++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 timeout->id = timeout_id_tick++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 timeout->resignal_msecs = vanilliseconds;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 timeout->function = function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 timeout->object = object;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 EMACS_GET_TIME (current_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 EMACS_SET_SECS_USECS (interval, milliseconds / 1000,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 1000 * (milliseconds % 1000));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 EMACS_ADD_TIME (timeout->next_signal_time, current_time, interval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 if (async_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 timeout->interval_id =
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1197 signal_add_async_interval_timeout (timeout->next_signal_time);
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1198 pending_async_timeout_list =
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1199 noseeum_cons (op, pending_async_timeout_list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 timeout->interval_id =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 event_stream_add_timeout (timeout->next_signal_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 pending_timeout_list = noseeum_cons (op, pending_timeout_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 return timeout->id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 /* Given the INTERVAL-ID of a timeout just signalled, resignal the timeout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 as necessary and return the timeout's ID and function and object slots.
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 This should be called as a result of receiving notice that a timeout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 has fired. INTERVAL-ID is *not* the timeout's ID, but is the ID that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 identifies this particular firing of the timeout. INTERVAL-ID's and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 timeout ID's are in separate number spaces and bear no relation to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 each other. The INTERVAL-ID is all that the event callback routines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 work with: they work only with one-shot intervals, not with timeouts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 that may fire repeatedly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 NOTE: The returned FUNCTION and OBJECT are *not* GC-protected at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1224 int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 event_stream_resignal_wakeup (int interval_id, int async_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 Lisp_Object *function, Lisp_Object *object)
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 Lisp_Object op = Qnil, rest;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1229 Lisp_Timeout *timeout;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 Lisp_Object *timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 int id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 GCPRO1 (op); /* just in case ... because it's removed from the list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 for awhile. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 timeout_list = async_p ? &pending_async_timeout_list : &pending_timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 /* Find the timeout on the list of pending ones. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 LIST_LOOP (rest, *timeout_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 timeout = XTIMEOUT (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 if (timeout->interval_id == interval_id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 assert (!NILP (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 op = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 timeout = XTIMEOUT (op);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 /* We make sure to snarf the data out of the timeout object before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 we free it with free_managed_lcrecord(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 id = timeout->id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 *function = timeout->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 *object = timeout->object;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 /* Remove this one from the list of pending timeouts */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 *timeout_list = delq_no_quit_and_free_cons (op, *timeout_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 /* If this timeout wants to be resignalled, do it now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 if (timeout->resignal_msecs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 EMACS_TIME current_time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 EMACS_TIME interval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 /* Determine the time that the next resignalling should occur.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 We do that by adding the interval time to the last signalled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 time until we get a time that's current.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 (This way, it doesn't matter if the timeout was signalled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 exactly when we asked for it, or at some time later.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 EMACS_GET_TIME (current_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 EMACS_SET_SECS_USECS (interval, timeout->resignal_msecs / 1000,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 1000 * (timeout->resignal_msecs % 1000));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 EMACS_ADD_TIME (timeout->next_signal_time, timeout->next_signal_time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 interval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 } while (EMACS_TIME_GREATER (current_time, timeout->next_signal_time));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 if (async_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 timeout->interval_id =
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1283 signal_add_async_interval_timeout (timeout->next_signal_time);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 timeout->interval_id =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 event_stream_add_timeout (timeout->next_signal_time);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 /* Add back onto the list. Note that the effect of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 is to move frequently-hit timeouts to the front of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 list, which is a good thing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 *timeout_list = noseeum_cons (op, *timeout_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 free_managed_lcrecord (Vtimeout_free_list, op);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 return id;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 event_stream_disable_wakeup (int id, int async_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1302 Lisp_Timeout *timeout = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 Lisp_Object *timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 if (async_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 timeout_list = &pending_async_timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 timeout_list = &pending_timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 /* 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
1312 LIST_LOOP (rest, *timeout_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 timeout = XTIMEOUT (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 if (timeout->id == id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 /* If we found it, remove it from the list and disable the pending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 one-shot. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 if (!NILP (rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 Lisp_Object op = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 *timeout_list =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 delq_no_quit_and_free_cons (op, *timeout_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 if (async_p)
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 563
diff changeset
1327 signal_remove_async_interval_timeout (timeout->interval_id);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 event_stream_remove_timeout (timeout->interval_id);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 free_managed_lcrecord (Vtimeout_free_list, op);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 event_stream_wakeup_pending_p (int id, int async_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1337 Lisp_Timeout *timeout;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 Lisp_Object timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 int found = 0;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 if (async_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 timeout_list = pending_async_timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 timeout_list = pending_timeout_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 /* Find the element on the list of pending ones, if it's still there. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 LIST_LOOP (rest, timeout_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 timeout = XTIMEOUT (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 if (timeout->id == id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 found = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 }
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 return found;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 /**** Lisp-level timeout functions. ****/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 static unsigned long
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 lisp_number_to_milliseconds (Lisp_Object secs, int allow_0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 #ifdef LISP_FLOAT_TYPE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 double fsecs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 CHECK_INT_OR_FLOAT (secs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 fsecs = XFLOATINT (secs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 long fsecs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 CHECK_INT (secs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 fsecs = XINT (secs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 if (fsecs < 0)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
1378 invalid_argument ("timeout is negative", secs);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 if (!allow_0 && fsecs == 0)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
1380 invalid_argument ("timeout is non-positive", secs);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 if (fsecs >= (((unsigned int) 0xFFFFFFFF) / 1000))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
1382 invalid_argument
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 ("timeout would exceed 32 bits when represented in milliseconds", secs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 return (unsigned long) (1000 * fsecs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 DEFUN ("add-timeout", Fadd_timeout, 3, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 Add a timeout, to be signaled after the timeout period has elapsed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 SECS is a number of seconds, expressed as an integer or a float.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 FUNCTION will be called after that many seconds have elapsed, with one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 argument, the given OBJECT. If the optional RESIGNAL argument is provided,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 then after this timeout expires, `add-timeout' will automatically be called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 again with RESIGNAL as the first argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 This function returns an object which is the id number of this particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 timeout. You can pass that object to `disable-timeout' to turn off the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 timeout before it has been signalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 NOTE: Id numbers as returned by this function are in a distinct namespace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 from those returned by `add-async-timeout'. This means that the same id
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 number could refer to a pending synchronous timeout and a different pending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 asynchronous timeout, and that you cannot pass an id from `add-timeout'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 to `disable-async-timeout', or vice-versa.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 The number of seconds may be expressed as a floating-point number, in which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 case some fractional part of a second will be used. Caveat: the usable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 timeout granularity will vary from system to system.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 Adding a timeout causes a timeout event to be returned by `next-event', and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 the function will be invoked by `dispatch-event,' so if emacs is in a tight
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 loop, the function will not be invoked until the next call to sit-for or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 until the return to top-level (the same is true of process filters).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 If you need to have a timeout executed even when XEmacs is in the midst of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 running Lisp code, use `add-async-timeout'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 WARNING: if you are thinking of calling add-timeout from inside of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 callback function as a way of resignalling a timeout, think again. There
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 is a race condition. That's why the RESIGNAL argument exists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 (secs, function, object, resignal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 unsigned long msecs = lisp_number_to_milliseconds (secs, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 unsigned long msecs2 = (NILP (resignal) ? 0 :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 lisp_number_to_milliseconds (resignal, 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 int id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 Lisp_Object lid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 id = event_stream_generate_wakeup (msecs, msecs2, function, object, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 lid = make_int (id);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 if (id != XINT (lid)) abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 return lid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 DEFUN ("disable-timeout", Fdisable_timeout, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 Disable a timeout from signalling any more.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 ID should be a timeout id number as returned by `add-timeout'. If ID
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 corresponds to a one-shot timeout that has already signalled, nothing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 will happen.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 It will not work to call this function on an id number returned by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 `add-async-timeout'. Use `disable-async-timeout' for that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 (id))
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 CHECK_INT (id);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 event_stream_disable_wakeup (XINT (id), 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 DEFUN ("add-async-timeout", Fadd_async_timeout, 3, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 Add an asynchronous timeout, to be signaled after an interval has elapsed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 SECS is a number of seconds, expressed as an integer or a float.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 FUNCTION will be called after that many seconds have elapsed, with one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 argument, the given OBJECT. If the optional RESIGNAL argument is provided,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 then after this timeout expires, `add-async-timeout' will automatically be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 called again with RESIGNAL as the first argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 This function returns an object which is the id number of this particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 timeout. You can pass that object to `disable-async-timeout' to turn off
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 the timeout before it has been signalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 NOTE: Id numbers as returned by this function are in a distinct namespace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 from those returned by `add-timeout'. This means that the same id number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 could refer to a pending synchronous timeout and a different pending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 asynchronous timeout, and that you cannot pass an id from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 `add-async-timeout' to `disable-timeout', or vice-versa.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 The number of seconds may be expressed as a floating-point number, in which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 case some fractional part of a second will be used. Caveat: the usable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 timeout granularity will vary from system to system.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 Adding an asynchronous timeout causes the function to be invoked as soon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 as the timeout occurs, even if XEmacs is in the midst of executing some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 other code. (This is unlike the synchronous timeouts added with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 `add-timeout', where the timeout will only be signalled when XEmacs is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 waiting for events, i.e. the next return to top-level or invocation of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 `sit-for' or related functions.) This means that the function that is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 called *must* not signal an error or change any global state (e.g. switch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 buffers or windows) except when locking code is in place to make sure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 that race conditions don't occur in the interaction between the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 asynchronous timeout function and other code.
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 Under most circumstances, you should use `add-timeout' instead, as it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 much safer. Asynchronous timeouts should only be used when such behavior
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 is really necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 Asynchronous timeouts are blocked and will not occur when `inhibit-quit'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 is non-nil. As soon as `inhibit-quit' becomes nil again, any pending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 asynchronous timeouts will get called immediately. (Multiple occurrences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 of the same asynchronous timeout are not queued, however.) While the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 callback function of an asynchronous timeout is invoked, `inhibit-quit'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 is automatically bound to non-nil, and thus other asynchronous timeouts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 will be blocked unless the callback function explicitly sets `inhibit-quit'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 to nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 WARNING: if you are thinking of calling `add-async-timeout' from inside of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 callback function as a way of resignalling a timeout, think again. There
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 is a race condition. That's why the RESIGNAL argument exists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 (secs, function, object, resignal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 unsigned long msecs = lisp_number_to_milliseconds (secs, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 unsigned long msecs2 = (NILP (resignal) ? 0 :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 lisp_number_to_milliseconds (resignal, 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 int id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 Lisp_Object lid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 id = event_stream_generate_wakeup (msecs, msecs2, function, object, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 lid = make_int (id);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 if (id != XINT (lid)) abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 return lid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 DEFUN ("disable-async-timeout", Fdisable_async_timeout, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 Disable an asynchronous timeout from signalling any more.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 ID should be a timeout id number as returned by `add-async-timeout'. If ID
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 corresponds to a one-shot timeout that has already signalled, nothing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 will happen.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 It will not work to call this function on an id number returned by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 `add-timeout'. Use `disable-timeout' for that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 (id))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 CHECK_INT (id);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 event_stream_disable_wakeup (XINT (id), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 return Qnil;
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
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 /* enqueuing and dequeuing events */
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 /* Add an event to the back of the command-event queue: it will be the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 event read after all pending events. This only works on keyboard,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 mouse-click, misc-user, and eval events.
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 enqueue_command_event (Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 enqueue_event (event, &command_event_queue, &command_event_queue_tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 dequeue_command_event (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 return dequeue_event (&command_event_queue, &command_event_queue_tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 /* put the event on the typeahead queue, unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 the event is the quit char, in which case the `QUIT'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 which will occur on the next trip through this loop is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 all the processing we should do - leaving it on the queue
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 would cause the quit to be processed twice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 enqueue_command_event_1 (Lisp_Object event_to_copy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 /* do not call check_quit() here. Vquit_flag was set in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 next_event_internal. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 if (NILP (Vquit_flag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 enqueue_command_event (Fcopy_event (event_to_copy, Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 enqueue_magic_eval_event (void (*fun) (Lisp_Object), Lisp_Object object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 Lisp_Object event = Fmake_event (Qnil, Qnil);
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 XEVENT (event)->event_type = magic_eval_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 /* channel for magic_eval events is nil */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 XEVENT (event)->event.magic_eval.internal_function = fun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 XEVENT (event)->event.magic_eval.object = object;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 enqueue_command_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 DEFUN ("enqueue-eval-event", Fenqueue_eval_event, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 Add an eval event to the back of the eval event queue.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 When this event is dispatched, FUNCTION (which should be a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 of one argument) will be called with OBJECT as its argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 See `next-event' for a description of event types and how events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 are received.
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 (function, object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 Lisp_Object event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 XEVENT (event)->event_type = eval_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 /* channel for eval events is nil */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 XEVENT (event)->event.eval.function = function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 XEVENT (event)->event.eval.object = object;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 enqueue_command_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 return event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 enqueue_misc_user_event (Lisp_Object channel, Lisp_Object function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 Lisp_Object object)
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 event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 XEVENT (event)->event_type = misc_user_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 XEVENT (event)->channel = channel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 XEVENT (event)->event.misc.function = function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 XEVENT (event)->event.misc.object = object;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 XEVENT (event)->event.misc.button = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 XEVENT (event)->event.misc.modifiers = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 XEVENT (event)->event.misc.x = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 XEVENT (event)->event.misc.y = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 enqueue_command_event (event);
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 return event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 enqueue_misc_user_event_pos (Lisp_Object channel, Lisp_Object function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 Lisp_Object object,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 int button, int modifiers, int x, int y)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 Lisp_Object event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 XEVENT (event)->event_type = misc_user_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 XEVENT (event)->channel = channel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 XEVENT (event)->event.misc.function = function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 XEVENT (event)->event.misc.object = object;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 XEVENT (event)->event.misc.button = button;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 XEVENT (event)->event.misc.modifiers = modifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 XEVENT (event)->event.misc.x = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 XEVENT (event)->event.misc.y = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 enqueue_command_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 return event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 /* focus-event handling */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 Ben's capsule lecture on focus:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 In FSFmacs `select-frame' never changes the window-manager frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 focus. All it does is change the "selected frame". This is similar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 to what happens when we call `select-device' or `select-console'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 Whenever an event comes in (including a keyboard event), its frame is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 selected; therefore, evaluating `select-frame' in *scratch* won't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 cause any effects because the next received event (in the same frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 will cause a switch back to the frame displaying *scratch*.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 Whenever a focus-change event is received from the window manager, it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 generates a `switch-frame' event, which causes the Lisp function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 `handle-switch-frame' to get run. This basically just runs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 `select-frame' (see below, however).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 In FSFmacs, if you want to have an operation run when a frame is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 selected, you supply an event binding for `switch-frame' (and then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 maybe call `handle-switch-frame', or something ...).
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 In XEmacs, we *do* change the window-manager frame focus as a result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 of `select-frame', but not until the next time an event is received,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 so that a function that momentarily changes the selected frame won't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 cause WM focus flashing. (#### There's something not quite right here;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 this is causing the wrong-cursor-focus problems that you occasionally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 see. But the general idea is correct.) This approach is winning for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 people who use the explicit-focus model, but is trickier to implement.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 We also don't make the `switch-frame' event visible but instead have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 `select-frame-hook', which is a better approach.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 There is the problem of surrogate minibuffers, where when we enter the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 minibuffer, you essentially want to temporarily switch the WM focus to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 the frame with the minibuffer, and switch it back when you exit the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 FSFmacs solves this with the crockish `redirect-frame-focus', which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 says "for keyboard events received from FRAME, act like they're
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 coming from FOCUS-FRAME". I think what this means is that, when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 a keyboard event comes in and the event manager is about to select the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 event's frame, if that frame has its focus redirected, the redirected-to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 frame is selected instead. That way, if you're in a minibufferless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 frame and enter the minibuffer, then all Lisp functions that run see
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 the selected frame as the minibuffer's frame rather than the minibufferless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 frame you came from, so that (e.g.) your typing actually appears in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 the minibuffer's frame and things behave sanely.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 There's also some weird logic that switches the redirected frame focus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 from one frame to another if Lisp code explicitly calls `select-frame'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 \(but not if `handle-switch-frame' is called), and saves and restores
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 the frame focus in window configurations, etc. etc. All of this logic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 is heavily #if 0'd, with lots of comments saying "No, this approach
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 doesn't seem to work, so I'm trying this ... is it reasonable?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 Well, I'm not sure ..." that are a red flag indicating crockishness.
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 Because of our way of doing things, we can avoid all this crock.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 Keyboard events never cause a select-frame (who cares what frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 they're associated with? They come from a console, only). We change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 the actual WM focus to a surrogate minibuffer frame, so we don't have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 to do any internal redirection. In order to get the focus back,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 I took the approach in minibuf.el of just checking to see if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 frame we moved to is still the selected frame, and move back to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 old one if so. Conceivably we might have to do the weird "tracking"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 that FSFmacs does when `select-frame' is called, but I don't think
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 so. If the selected frame moved from the minibuffer frame, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 we just leave it there, figuring that someone knows what they're
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 doing. Because we don't have any redirection recorded anywhere,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 it's safe to do this, and we don't end up with unwanted redirection.
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 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 run_select_frame_hook (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 run_hook (Qselect_frame_hook);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 run_deselect_frame_hook (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 run_hook (Qdeselect_frame_hook);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 /* When select-frame is called and focus_follows_mouse is false, we want
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 to tell the window system that the focus should be changed to point to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 the new frame. However,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 sometimes Lisp functions will temporarily change the selected frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 (e.g. to call a function that operates on the selected frame),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 and it's annoying if this focus-change happens exactly when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 select-frame is called, because then you get some flickering of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 window-manager border and perhaps other undesirable results. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 really only want to change the focus when we're about to retrieve
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 an event from the user. To do this, we keep track of the frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 where the window-manager focus lies on, and just before waiting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 for user events, check the currently selected frame and change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 the focus as necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 On the other hand, if focus_follows_mouse is true, we need to switch the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 selected frame back to the frame with window manager focus just before we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 execute the next command in Fcommand_loop_1, just as the selected buffer is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 reverted after a set-buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 Both cases are handled by this function. It must be called as appropriate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 from these two places, depending on the value of focus_follows_mouse. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 investigate_frame_change (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 Lisp_Object devcons, concons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 /* if the selected frame was changed, change the window-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 focus to the new frame. We don't do it when select-frame was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 called, to avoid flickering and other unwanted side effects when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 the frame is just changed temporarily. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 DEVICE_LOOP_NO_BREAK (devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 struct device *d = XDEVICE (XCAR (devcons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 Lisp_Object sel_frame = DEVICE_SELECTED_FRAME (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 /* You'd think that maybe we should use FRAME_WITH_FOCUS_REAL,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 but that can cause us to end up in an infinite loop focusing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 between two frames. It seems that since the call to `select-frame'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 in emacs_handle_focus_change_final() is based on the _FOR_HOOKS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 value, we need to do so too. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 if (!NILP (sel_frame) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 !EQ (DEVICE_FRAME_THAT_OUGHT_TO_HAVE_FOCUS (d), sel_frame) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 !NILP (DEVICE_FRAME_WITH_FOCUS_FOR_HOOKS (d)) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 !EQ (DEVICE_FRAME_WITH_FOCUS_FOR_HOOKS (d), sel_frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 /* At this point, we know that the frame has been changed. Now, if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 * focus_follows_mouse is not set, we finish off the frame change,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 * so that user events will now come from the new frame. Otherwise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 * if focus_follows_mouse is set, no gratuitous frame changing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 * should take place. Set the focus back to the frame which was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 * originally selected for user input.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 if (!focus_follows_mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 /* prevent us from issuing the same request more than once */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 DEVICE_FRAME_THAT_OUGHT_TO_HAVE_FOCUS (d) = sel_frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 MAYBE_DEVMETH (d, focus_on_frame, (XFRAME (sel_frame)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 Lisp_Object old_frame = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 /* #### Do we really want to check OUGHT ??
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 * It seems to make sense, though I have never seen us
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 * get here and have it be non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 if (FRAMEP (DEVICE_FRAME_THAT_OUGHT_TO_HAVE_FOCUS (d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 old_frame = DEVICE_FRAME_THAT_OUGHT_TO_HAVE_FOCUS (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 else if (FRAMEP (DEVICE_FRAME_WITH_FOCUS_FOR_HOOKS (d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 old_frame = DEVICE_FRAME_WITH_FOCUS_FOR_HOOKS (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 /* #### Can old_frame ever be NIL? play it safe.. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 if (!NILP (old_frame))
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 /* Fselect_frame is not really the right thing: it frobs the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 * buffer stack. But there's no easy way to do the right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 * thing, and this code already had this problem anyway.
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 Fselect_frame (old_frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 }
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 }
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 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 cleanup_after_missed_defocusing (Lisp_Object frame)
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 if (FRAMEP (frame) && FRAME_LIVE_P (XFRAME (frame)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 Fselect_frame (frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 emacs_handle_focus_change_preliminary (Lisp_Object frame_inp_and_dev)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 Lisp_Object frame = Fcar (frame_inp_and_dev);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 Lisp_Object device = Fcar (Fcdr (frame_inp_and_dev));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 int in_p = !NILP (Fcdr (Fcdr (frame_inp_and_dev)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 struct device *d;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 if (!DEVICE_LIVE_P (XDEVICE (device)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831 d = XDEVICE (device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 /* Any received focus-change notifications render invalid any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 pending focus-change requests. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 DEVICE_FRAME_THAT_OUGHT_TO_HAVE_FOCUS (d) = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 if (in_p)
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 Lisp_Object focus_frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 if (!FRAME_LIVE_P (XFRAME (frame)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 focus_frame = DEVICE_FRAME_WITH_FOCUS_REAL (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 /* Mark the minibuffer as changed to make sure it gets updated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 properly if the echo area is active. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 struct window *w = XWINDOW (FRAME_MINIBUF_WINDOW (XFRAME (frame)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 MARK_WINDOWS_CHANGED (w);
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
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 446
diff changeset
1852 if (FRAMEP (focus_frame) && FRAME_LIVE_P (XFRAME (focus_frame))
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 446
diff changeset
1853 && !EQ (frame, focus_frame))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 /* Oops, we missed a focus-out event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 DEVICE_FRAME_WITH_FOCUS_REAL (d) = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 redisplay_redraw_cursor (XFRAME (focus_frame), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 DEVICE_FRAME_WITH_FOCUS_REAL (d) = frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 if (!EQ (frame, focus_frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 redisplay_redraw_cursor (XFRAME (frame), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 /* We ignore the frame reported in the event. If it's different
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 from where we think the focus was, oh well -- we messed up.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 Nonetheless, we pretend we were right, for sensible behavior. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 frame = DEVICE_FRAME_WITH_FOCUS_REAL (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 if (!NILP (frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 DEVICE_FRAME_WITH_FOCUS_REAL (d) = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 if (FRAME_LIVE_P (XFRAME (frame)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 redisplay_redraw_cursor (XFRAME (frame), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 /* Called from the window-system-specific code when we receive a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 notification that the focus lies on a particular frame.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 Argument is a cons: (frame . (device . in-p)) where in-p is non-nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 for focus-in.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 emacs_handle_focus_change_final (Lisp_Object frame_inp_and_dev)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 Lisp_Object frame = Fcar (frame_inp_and_dev);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 Lisp_Object device = Fcar (Fcdr (frame_inp_and_dev));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 int in_p = !NILP (Fcdr (Fcdr (frame_inp_and_dev)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 struct device *d;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 int count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 if (!DEVICE_LIVE_P (XDEVICE (device)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 d = XDEVICE (device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 if (in_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 Lisp_Object focus_frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 if (!FRAME_LIVE_P (XFRAME (frame)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 focus_frame = DEVICE_FRAME_WITH_FOCUS_FOR_HOOKS (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 DEVICE_FRAME_WITH_FOCUS_FOR_HOOKS (d) = frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 if (FRAMEP (focus_frame) && !EQ (frame, focus_frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 /* Oops, we missed a focus-out event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 Fselect_frame (focus_frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 /* Do an unwind-protect in case an error occurs in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 the deselect-frame-hook */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 count = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 record_unwind_protect (cleanup_after_missed_defocusing, frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 run_deselect_frame_hook ();
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
1919 unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 /* the cleanup method changed the focus frame to nil, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 we need to reflect this */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 focus_frame = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 Fselect_frame (frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 if (!EQ (frame, focus_frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 run_select_frame_hook ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 /* We ignore the frame reported in the event. If it's different
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 from where we think the focus was, oh well -- we messed up.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 Nonetheless, we pretend we were right, for sensible behavior. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 frame = DEVICE_FRAME_WITH_FOCUS_FOR_HOOKS (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 if (!NILP (frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 DEVICE_FRAME_WITH_FOCUS_FOR_HOOKS (d) = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 run_deselect_frame_hook ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 }
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943
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 /* retrieving the next event */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 /**********************************************************************/
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 static int in_single_console;
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 /* #### These functions don't currently do anything. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 single_console_state (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 in_single_console = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 any_console_state (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 in_single_console = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 in_single_console_state (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 return in_single_console;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 /* the number of keyboard characters read. callint.c wants this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 Charcount num_input_chars;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 next_event_internal (Lisp_Object target_event, int allow_queued)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 /* QUIT; This is incorrect - the caller must do this because some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 callers (ie, Fnext_event()) do not want to QUIT. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 assert (NILP (XEVENT_NEXT (target_event)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 GCPRO1 (target_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 /* When focus_follows_mouse is nil, if a frame change took place, we need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 * to actually switch window manager focus to the selected window now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 if (!focus_follows_mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 investigate_frame_change ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 if (allow_queued && !NILP (command_event_queue))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 Lisp_Object event = dequeue_command_event ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 Fcopy_event (event, target_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 Fdeallocate_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 DEBUG_PRINT_EMACS_EVENT ("command event queue", target_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1998 Lisp_Event *e = XEVENT (target_event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 /* The command_event_queue was empty. Wait for an event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 event_stream_next_event (e);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 /* If this was a timeout, then we need to extract some data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 out of the returned closure and might need to resignal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 if (e->event_type == timeout_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 Lisp_Object tristan, isolde;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 e->event.timeout.id_number =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 event_stream_resignal_wakeup (e->event.timeout.interval_id, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 &tristan, &isolde);
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 e->event.timeout.function = tristan;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 e->event.timeout.object = isolde;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 /* next_event_internal() doesn't print out timeout events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 because of the extra info we just set. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 DEBUG_PRINT_EMACS_EVENT ("real, timeout", target_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 /* If we read a ^G, then set quit-flag but do not discard the ^G.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 The callers of next_event_internal() will do one of two things:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 -- set Vquit_flag to Qnil. (next-event does this.) This will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 cause the ^G to be treated as a normal keystroke.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 -- not change Vquit_flag but attempt to enqueue the ^G, at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 which point it will be discarded. The next time QUIT is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 called, it will notice that Vquit_flag was set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 if (e->event_type == key_press_event &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 event_matches_key_specifier_p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 (e, make_char (CONSOLE_QUIT_CHAR (XCONSOLE (EVENT_CHANNEL (e))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 Vquit_flag = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 run_pre_idle_hook (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 if (!NILP (Vpre_idle_hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 && !detect_input_pending ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 safe_run_hook_trapping_errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 ("Error in `pre-idle-hook' (setting hook to nil)",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 Qpre_idle_hook, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 static void push_this_command_keys (Lisp_Object event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 static void push_recent_keys (Lisp_Object event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 static void dribble_out_event (Lisp_Object event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 static void execute_internal_event (Lisp_Object event);
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
2055 static int is_scrollbar_event (Lisp_Object event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 DEFUN ("next-event", Fnext_event, 0, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 Return the next available event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 Pass this object to `dispatch-event' to handle it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 In most cases, you will want to use `next-command-event', which returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 the next available "user" event (i.e. keypress, button-press,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 button-release, or menu selection) instead of this function.
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 If EVENT is non-nil, it should be an event object and will be filled in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 and returned; otherwise a new event object will be created and returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 If PROMPT is non-nil, it should be a string and will be displayed in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 echo area while this function is waiting for an event.
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 The next available event will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 -- any events in `unread-command-events' or `unread-command-event'; else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 -- the next event in the currently executing keyboard macro, if any; else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2073 -- an event queued by `enqueue-eval-event', if any, or any similar event
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2074 queued internally, such as a misc-user event. (For example, when an item
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2075 is selected from a menu or from a `question'-type dialog box, the item's
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2076 callback is not immediately executed, but instead a misc-user event
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2077 is generated and placed onto this queue; when it is dispatched, the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2078 callback is executed.) Else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 -- the next available event from the window system or terminal driver.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 In the last case, this function will block until an event is available.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 The returned event will be one of the following types:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 -- a key-press event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086 -- a button-press or button-release event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 -- a misc-user-event, meaning the user selected an item on a menu or used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 the scrollbar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 -- a process event, meaning that output from a subprocess is available.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 -- a timeout event, meaning that a timeout has elapsed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 -- an eval event, which simply causes a function to be executed when the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 event is dispatched. Eval events are generated by `enqueue-eval-event'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 or by certain other conditions happening.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 -- a magic event, indicating that some window-system-specific event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 happened (such as a focus-change notification) that must be handled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 synchronously with other events. `dispatch-event' knows what to do with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 these events.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 (event, prompt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 /* This function can call lisp */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 /* #### We start out using the selected console before an event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 is received, for echoing the partially completed command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 This is most definitely wrong -- there needs to be a separate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 echo area for each console! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 struct console *con = XCONSOLE (Vselected_console);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 struct command_builder *command_builder =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 XCOMMAND_BUILDER (con->command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 int store_this_key = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 GCPRO1 (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 /* DO NOT do QUIT anywhere within this function or the functions it calls.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 We want to read the ^G as an event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 #ifdef LWLIB_MENUBARS_LUCID
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 * #### Fix the menu code so this isn't necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 * We cannot allow the lwmenu code to be reentered, because the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 * code is not written to be reentrant and will crash. Therefore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 * paths from the menu callbacks back into the menu code have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 * be blocked. Fnext_event is the normal path into the menu code,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 * so we signal an error here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 if (in_menu_callback)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
2127 invalid_operation ("Attempt to call next-event inside menu callback",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
2128 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 #endif /* LWLIB_MENUBARS_LUCID */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 if (NILP (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 CHECK_LIVE_EVENT (event);
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 if (!NILP (prompt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 Bytecount len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 CHECK_STRING (prompt);
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 len = XSTRING_LENGTH (prompt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 if (command_builder->echo_buf_length < len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 len = command_builder->echo_buf_length - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 memcpy (command_builder->echo_buf, XSTRING_DATA (prompt), len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 command_builder->echo_buf[len] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 command_builder->echo_buf_index = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 echo_area_message (XFRAME (CONSOLE_SELECTED_FRAME (con)),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 command_builder->echo_buf,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 Qnil, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 command_builder->echo_buf_index,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 Qcommand);
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 start_over_and_avoid_hosage:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 /* If there is something in unread-command-events, simply return it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 But do some error checking to make sure the user hasn't put something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 in the unread-command-events that they shouldn't have.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 This does not update this-command-keys and recent-keys.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 if (!NILP (Vunread_command_events))
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 if (!CONSP (Vunread_command_events))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 Vunread_command_events = Qnil;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
2166 signal_error_1 (Qwrong_type_argument,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 list3 (Qconsp, Vunread_command_events,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 Qunread_command_events));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 Lisp_Object e = XCAR (Vunread_command_events);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 Vunread_command_events = XCDR (Vunread_command_events);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 if (!EVENTP (e) || !command_event_p (e))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
2175 signal_error_1 (Qwrong_type_argument,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 list3 (Qcommand_event_p, e, Qunread_command_events));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 redisplay ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 if (!EQ (e, event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 Fcopy_event (e, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 DEBUG_PRINT_EMACS_EVENT ("unread-command-events", event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 }
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 /* Do similar for unread-command-event (obsoleteness support). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 else if (!NILP (Vunread_command_event))
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 Lisp_Object e = Vunread_command_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 Vunread_command_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 if (!EVENTP (e) || !command_event_p (e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
2192 signal_error_1 (Qwrong_type_argument,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 list3 (Qeventp, e, Qunread_command_event));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 if (!EQ (e, event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 Fcopy_event (e, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 redisplay ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 DEBUG_PRINT_EMACS_EVENT ("unread-command-event", event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 /* If we're executing a keyboard macro, take the next event from that,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 and update this-command-keys and recent-keys.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 Note that the unread-command-events take precedence over kbd macros.
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 else
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 if (!NILP (Vexecuting_macro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 redisplay ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 pop_kbd_macro_event (event); /* This throws past us at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 end-of-macro. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 store_this_key = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 DEBUG_PRINT_EMACS_EVENT ("keyboard macro", event);
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 /* Otherwise, read a real event, possibly from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 command_event_queue, and update this-command-keys and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 recent-keys. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 run_pre_idle_hook ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 redisplay ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 next_event_internal (event, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 Vquit_flag = Qnil; /* Read C-g as an event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 store_this_key = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 status_notify (); /* Notice process change */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 #ifdef C_ALLOCA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 alloca (0); /* Cause a garbage collection now */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 /* Since we can free the most stuff here
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 * (since this is typically called from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 * the command-loop top-level). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 #endif /* C_ALLOCA */
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 if (object_dead_p (XEVENT (event)->channel))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 /* event_console_or_selected may crash if the channel is dead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 Best just to eat it and get the next event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 goto start_over_and_avoid_hosage;
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 /* OK, now we can stop the selected-console kludge and use the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 actual console from the event. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 con = event_console_or_selected (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 command_builder = XCOMMAND_BUILDER (con->command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 switch (XEVENT_TYPE (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 goto RETURN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 case button_release_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 case misc_user_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 /* don't echo menu accelerator keys */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 reset_key_echo (command_builder, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 goto EXECUTE_KEY;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 case button_press_event: /* key or mouse input can trigger prompting */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 goto STORE_AND_EXECUTE_KEY;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 case key_press_event: /* any key input can trigger autosave */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 maybe_do_auto_save ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 num_input_chars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 STORE_AND_EXECUTE_KEY:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 if (store_this_key)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 echo_key_event (command_builder, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 EXECUTE_KEY:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 /* Store the last-input-event. The semantics of this is that it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 the thing most recently returned by next-command-event. It need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 not have come from the keyboard or a keyboard macro, it may have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 come from unread-command-events. It's always a command-event (a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 key, click, or menu selection), never a motion or process event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 if (!EVENTP (Vlast_input_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 Vlast_input_event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 if (XEVENT_TYPE (Vlast_input_event) == dead_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 Vlast_input_event = Fmake_event (Qnil, Qnil);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
2282 invalid_state ("Someone deallocated last-input-event!", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 if (! EQ (event, Vlast_input_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 Fcopy_event (event, Vlast_input_event);
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 /* last-input-char and last-input-time are derived from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 last-input-event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 Note that last-input-char will never have its high-bit set, in an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 effort to sidestep the ambiguity between M-x and oslash.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 Vlast_input_char = Fevent_to_character (Vlast_input_event,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 Qnil, Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295 EMACS_TIME t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296 EMACS_GET_TIME (t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2297 if (!CONSP (Vlast_input_time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298 Vlast_input_time = Fcons (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 XCAR (Vlast_input_time) = make_int ((EMACS_SECS (t) >> 16) & 0xffff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 XCDR (Vlast_input_time) = make_int ((EMACS_SECS (t) >> 0) & 0xffff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 if (!CONSP (Vlast_command_event_time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302 Vlast_command_event_time = list3 (Qnil, Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 XCAR (Vlast_command_event_time) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 make_int ((EMACS_SECS (t) >> 16) & 0xffff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 XCAR (XCDR (Vlast_command_event_time)) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 make_int ((EMACS_SECS (t) >> 0) & 0xffff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 XCAR (XCDR (XCDR (Vlast_command_event_time)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 = make_int (EMACS_USECS (t));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 /* If this key came from the keyboard or from a keyboard macro, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 it goes into the recent-keys and this-command-keys vectors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 If this key came from the keyboard, and we're defining a keyboard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313 macro, then it goes into the macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 if (store_this_key)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 {
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
2317 if (!is_scrollbar_event (event)) /* #### not quite right, see
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
2318 comment in execute_command_event */
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
2319 push_this_command_keys (event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 if (!inhibit_input_event_recording)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321 push_recent_keys (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 dribble_out_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 if (!NILP (con->defining_kbd_macro) && NILP (Vexecuting_macro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 if (!EVENTP (command_builder->current_events))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 finalize_kbd_macro_chars (con);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 store_kbd_macro_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 /* If this is the help char and there is a help form, then execute the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 help form and swallow this character. This is the only place where
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 calling Fnext_event() can cause arbitrary lisp code to run. Note
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 that execute_help_form() calls Fnext_command_event(), which calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334 this function, as well as Fdispatch_event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 if (!NILP (Vhelp_form) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 event_matches_key_specifier_p (XEVENT (event), Vhelp_char))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 execute_help_form (command_builder, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 RETURN:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342 return event;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 DEFUN ("next-command-event", Fnext_command_event, 0, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 Return the next available "user" event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 Pass this object to `dispatch-event' to handle it.
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 If EVENT is non-nil, it should be an event object and will be filled in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 and returned; otherwise a new event object will be created and returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 If PROMPT is non-nil, it should be a string and will be displayed in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 echo area while this function is waiting for an event.
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 The event returned will be a keyboard, mouse press, or mouse release event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 If there are non-command events available (mouse motion, sub-process output,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356 etc) then these will be executed (with `dispatch-event') and discarded. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 function is provided as a convenience; it is roughly equivalent to the lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 (while (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360 (next-event event prompt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 (not (or (key-press-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 (button-press-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 (button-release-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 (misc-user-event-p event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 (dispatch-event event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 but it also makes a provision for displaying keystrokes in the echo area.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 (event, prompt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 GCPRO1 (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 maybe_echo_keys (XCOMMAND_BUILDER
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 (XCONSOLE (Vselected_console)->
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376 command_builder), 0); /* #### This sucks bigtime */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 event = Fnext_event (event, prompt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380 if (command_event_p (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2381 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 execute_internal_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 return event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2389 DEFUN ("dispatch-non-command-events", Fdispatch_non_command_events, 0, 0, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2390 Dispatch any pending "magic" events.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2391
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2392 This function is useful for forcing the redisplay of native
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2393 widgets. Normally these are redisplayed through a native window-system
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2394 event encoded as magic event, rather than by the redisplay code. This
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2395 function does not call redisplay or do any of the other things that
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2396 `next-event' does.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2397 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2398 ())
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2399 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2400 /* This function can GC */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2401 Lisp_Object event = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2402 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2403 GCPRO1 (event);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2404 event = Fmake_event (Qnil, Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2405
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2406 /* Make sure that there will be something in the native event queue
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2407 so that externally managed things (e.g. widgets) get some CPU
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2408 time. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2409 event_stream_force_event_pending (selected_frame ());
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2410
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2411 while (event_stream_event_pending_p (0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2412 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2413 QUIT; /* next_event_internal() does not QUIT. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2414
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2415 /* We're a generator of the command_event_queue, so we can't be a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2416 consumer as well. Also, we have no reason to consult the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2417 command_event_queue; there are only user and eval-events there,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2418 and we'd just have to put them back anyway.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2419 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2420 next_event_internal (event, 0); /* blocks */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2421 /* See the comment in accept-process-output about Vquit_flag */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2422 if (XEVENT_TYPE (event) == magic_event ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2423 XEVENT_TYPE (event) == timeout_event ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2424 XEVENT_TYPE (event) == process_event ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2425 XEVENT_TYPE (event) == pointer_motion_event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2426 execute_internal_event (event);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2427 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2428 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2429 enqueue_command_event_1 (event);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2430 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2431 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2432 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2433
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2434 Fdeallocate_event (event);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2435 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2436 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2437 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2438
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 reset_current_events (struct command_builder *command_builder)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 Lisp_Object event = command_builder->current_events;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443 reset_command_builder_event_chain (command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 if (EVENTP (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 deallocate_event_chain (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 DEFUN ("discard-input", Fdiscard_input, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 Discard any pending "user" events.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 Also cancel any kbd macro being defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451 A user event is a key press, button press, button release, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452 "misc-user" event (menu selection or scrollbar action).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 /* This throws away user-input on the queue, but doesn't process any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 events. Calling dispatch_event() here leads to a race condition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 Lisp_Object event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 Lisp_Object head = Qnil, tail = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 Lisp_Object oiq = Vinhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 /* #### not correct here with Vselected_console? Should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 discard-input take a console argument, or maybe map over
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 all consoles? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 struct console *con = XCONSOLE (Vselected_console);
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 /* next_event_internal() can cause arbitrary Lisp code to be evalled */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 GCPRO2 (event, oiq);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 Vinhibit_quit = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 /* If a macro was being defined then we have to mark the modeline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 has changed to ensure that it gets updated correctly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473 if (!NILP (con->defining_kbd_macro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 MARK_MODELINE_CHANGED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 con->defining_kbd_macro = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 reset_current_events (XCOMMAND_BUILDER (con->command_builder));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478 while (!NILP (command_event_queue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 || event_stream_event_pending_p (1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481 /* This will take stuff off the command_event_queue, or read it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 from the event_stream, but it will not block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 next_event_internal (event, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 Vquit_flag = Qnil; /* Treat C-g as a user event (ignore it).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 It is vitally important that we reset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 Vquit_flag here. Otherwise, if we're
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 reading from a TTY console,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 maybe_read_quit_event() will notice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 that C-g has been set and send us
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 another C-g. That will cause us
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 to get right back here, and read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 another C-g, ad infinitum ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 /* If the event is a user event, ignore it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 if (!command_event_p (event))
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 /* Otherwise, chain the event onto our list of events not to ignore,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 and keep reading until the queue is empty. This does not mean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 that if a subprocess is generating an infinite amount of output,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 we will never terminate (*provided* that the behavior of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 next_event_cb() is correct -- see the comment in events.h),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 because this loop ends as soon as there are no more user events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 on the command_event_queue or event_stream.
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 enqueue_event (Fcopy_event (event, Qnil), &head, &tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 if (!NILP (command_event_queue) || !NILP (command_event_queue_tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 /* Now tack our chain of events back on to the front of the queue.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 Actually, since the queue is now drained, we can just replace it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 The effect of this will be that we have deleted all user events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 from the input stream without changing the relative ordering of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 any other events. (Some events may have been taken from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 event_stream and added to the command_event_queue, however.)
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 At this time, the command_event_queue will contain only eval_events.
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 command_event_queue = head;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 command_event_queue_tail = tail;
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 Fdeallocate_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 Vinhibit_quit = oiq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 /* pausing until an action occurs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 /* This is used in accept-process-output, sleep-for and sit-for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 Before running any process_events in these routines, we set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 recursive_sit_for to Qt, and use this unwind protect to reset it to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 Qnil upon exit. When recursive_sit_for is Qt, calling sit-for will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 cause it to return immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544 All of these routines install timeouts, so we clear the installed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 timeout as well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 Note: It's very easy to break the desired behaviors of these
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 3 routines. If you make any changes to anything in this area, run
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 the regression tests at the bottom of the file. -- dmoore */
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 sit_for_unwind (Lisp_Object timeout_id)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555 if (!NILP(timeout_id))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556 Fdisable_timeout (timeout_id);
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 recursive_sit_for = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560 }
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 /* #### Is (accept-process-output nil 3) supposed to be like (sleep-for 3)?
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565 DEFUN ("accept-process-output", Faccept_process_output, 0, 3, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 Allow any pending output from subprocesses to be read by Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 It is read into the process' buffers or given to their filter functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568 Non-nil arg PROCESS means do not return until some output has been received
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 from PROCESS. Nil arg PROCESS means do not return until some output has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570 been received from any process.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 If the second arg is non-nil, it is the maximum number of seconds to wait:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572 this function will return after that much time even if no input has arrived
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 from PROCESS. This argument may be a float, meaning wait some fractional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 part of a second.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575 If the third arg is non-nil, it is a number of milliseconds that is added
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 to the second arg. (This exists only for compatibility.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577 Return non-nil iff we received any output before the timeout expired.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 (process, timeout_secs, timeout_msecs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 Lisp_Object event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584 Lisp_Object result = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 int timeout_id = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 int timeout_enabled = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 int done = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 struct buffer *old_buffer = current_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 int count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 /* We preserve the current buffer but nothing else. If a focus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 change alters the selected window then the top level event loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 will eventually alter current_buffer to match. In the mean time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 we don't want to mess up whatever called this function. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 if (!NILP (process))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 CHECK_PROCESS (process);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 GCPRO2 (event, process);
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 if (!NILP (timeout_secs) || !NILP (timeout_msecs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 unsigned long msecs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 if (!NILP (timeout_secs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 msecs = lisp_number_to_milliseconds (timeout_secs, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 if (!NILP (timeout_msecs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 CHECK_NATNUM (timeout_msecs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2609 msecs += XINT (timeout_msecs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 if (msecs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 timeout_id = event_stream_generate_wakeup (msecs, 0, Qnil, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 timeout_enabled = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 count = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 record_unwind_protect (sit_for_unwind,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 timeout_enabled ? make_int (timeout_id) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 recursive_sit_for = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 while (!done &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 ((NILP (process) && timeout_enabled) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 (NILP (process) && event_stream_event_pending_p (0)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 (!NILP (process))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 /* Calling detect_input_pending() is the wrong thing here, because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630 that considers the Vunread_command_events and command_event_queue.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 We don't need to look at the command_event_queue because we are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 only interested in process events, which don't go on that. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 fact, we can't read from it anyway, because we put stuff on it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 Note that event_stream->event_pending_p must be called in such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 a way that it says whether any events *of any kind* are ready,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637 not just user events, or (accept-process-output nil) will fail
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 to dispatch any process events that may be on the queue. It is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 not clear to me that this is important, because the top-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640 loop will process it, and I don't think that there is ever a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 time when one calls accept-process-output with a nil argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642 and really need the processes to be handled. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 /* If our timeout has arrived, we move along. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645 if (timeout_enabled && !event_stream_wakeup_pending_p (timeout_id, 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 timeout_enabled = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 done = 1; /* We're done. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 continue; /* Don't call next_event_internal */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 QUIT; /* next_event_internal() does not QUIT, so check for ^G
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 before reading output from the process - this makes it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 less likely that the filter will actually be aborted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657 next_event_internal (event, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 /* If C-g was pressed while we were waiting, Vquit_flag got
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 set and next_event_internal() also returns C-g. When
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 we enqueue the C-g below, it will get discarded. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 next time through, QUIT will be called and will signal a quit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 switch (XEVENT_TYPE (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 case process_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 if (NILP (process) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 EQ (XEVENT (event)->event.process.process, process))
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 done = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 /* RMS's version always returns nil when proc is nil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 and only returns t if input ever arrived on proc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 result = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 execute_internal_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 case timeout_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 /* We execute the event even if it's ours, and notice that it's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 happened above. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 case pointer_motion_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 case magic_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 execute_internal_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 enqueue_command_event_1 (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 }
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
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
2695 unbind_to_1 (count, timeout_enabled ? make_int (timeout_id) : Qnil);
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 Fdeallocate_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 current_buffer = old_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 DEFUN ("sleep-for", Fsleep_for, 1, 1, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2704 Pause, without updating display, for SECONDS seconds.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2705 SECONDS may be a float, allowing pauses for fractional parts of a second.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707 It is recommended that you never call sleep-for from inside of a process
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2708 filter function or timer event (either synchronous or asynchronous).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710 (seconds))
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 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 unsigned long msecs = lisp_number_to_milliseconds (seconds, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 int id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 Lisp_Object event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 int count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 GCPRO1 (event);
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 id = event_stream_generate_wakeup (msecs, 0, Qnil, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 count = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725 record_unwind_protect (sit_for_unwind, make_int (id));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 recursive_sit_for = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 /* If our timeout has arrived, we move along. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 if (!event_stream_wakeup_pending_p (id, 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 goto DONE_LABEL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 QUIT; /* next_event_internal() does not QUIT, so check for ^G
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735 before reading output from the process - this makes it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 less likely that the filter will actually be aborted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 /* We're a generator of the command_event_queue, so we can't be a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 consumer as well. We don't care about command and eval-events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 anyway.
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 next_event_internal (event, 0); /* blocks */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 /* See the comment in accept-process-output about Vquit_flag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 switch (XEVENT_TYPE (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 case timeout_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 /* We execute the event even if it's ours, and notice that it's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748 happened above. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 case process_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750 case pointer_motion_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 case magic_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 execute_internal_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 enqueue_command_event_1 (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 break;
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 DONE_LABEL:
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
2764 unbind_to_1 (count, make_int (id));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 Fdeallocate_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 DEFUN ("sit-for", Fsit_for, 1, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2771 Perform redisplay, then wait SECONDS seconds or until user input is available.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2772 SECONDS may be a float, meaning a fractional part of a second.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2773 Optional second arg NODISPLAY non-nil means don't redisplay; just wait.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 Redisplay is preempted as always if user input arrives, and does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 happen if input is available before it starts.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 Value is t if waited the full time with no input arriving.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 If sit-for is called from within a process filter function or timer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 event (either synchronous or asynchronous) it will return immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781 (seconds, nodisplay))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 unsigned long msecs = lisp_number_to_milliseconds (seconds, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 Lisp_Object event, result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787 int id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 int count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 /* The unread-command-events count as pending input */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791 if (!NILP (Vunread_command_events) || !NILP (Vunread_command_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 /* If the command-builder already has user-input on it (not eval events)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 then that means we're done too.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 if (!NILP (command_event_queue))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799 EVENT_CHAIN_LOOP (event, command_event_queue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 if (command_event_p (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 /* If we're in a macro, or noninteractive, or early in temacs, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 don't wait. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808 if (noninteractive || !NILP (Vexecuting_macro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 /* Recursive call from a filter function or timeout handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 if (!NILP(recursive_sit_for))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 if (!event_stream_event_pending_p (1) && NILP (nodisplay))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 run_pre_idle_hook ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817 redisplay ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 /* Otherwise, start reading events from the event_stream.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 Do this loop at least once even if (sit-for 0) so that we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 redisplay when no input pending.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 GCPRO1 (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 /* Generate the wakeup even if MSECS is 0, so that existing timeout/etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 events get processed. The old (pre-19.12) code special-cased this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 and didn't generate a wakeup, but the resulting behavior was less than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833 ideal; viz. the occurrence of (sit-for 0.001) scattered throughout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 the E-Lisp universe. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 id = event_stream_generate_wakeup (msecs, 0, Qnil, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 count = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 record_unwind_protect (sit_for_unwind, make_int (id));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 recursive_sit_for = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 /* If there is no user input pending, then redisplay.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 if (!event_stream_event_pending_p (1) && NILP (nodisplay))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 run_pre_idle_hook ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 redisplay ();
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 /* If our timeout has arrived, we move along. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 if (!event_stream_wakeup_pending_p (id, 0))
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 result = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 goto DONE_LABEL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 QUIT; /* next_event_internal() does not QUIT, so check for ^G
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 before reading output from the process - this makes it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861 less likely that the filter will actually be aborted.
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 /* We're a generator of the command_event_queue, so we can't be a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 consumer as well. In fact, we know there's nothing on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865 command_event_queue that we didn't just put there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 next_event_internal (event, 0); /* blocks */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868 /* See the comment in accept-process-output about Vquit_flag */
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 if (command_event_p (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 QUIT; /* If the command was C-g check it here
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 so that we abort out of the sit-for,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 not the next command. sleep-for and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 accept-process-output continue looping
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876 so they check QUIT again implicitly.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 result = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 goto DONE_LABEL;
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 switch (XEVENT_TYPE (event))
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 case eval_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 /* eval-events get delayed until later. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 enqueue_command_event (Fcopy_event (event, Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 case timeout_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 /* We execute the event even if it's ours, and notice that it's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 happened above. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 execute_internal_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 }
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 DONE_LABEL:
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
2901 unbind_to_1 (count, make_int (id));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 /* Put back the event (if any) that made Fsit_for() exit before the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 timeout. Note that it is being added to the back of the queue, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 would be inappropriate if there were any user events on the queue
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 already: we would be misordering them. But we know that there are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907 no user-events on the queue, or else we would not have reached this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 point at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 if (NILP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 enqueue_command_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 Fdeallocate_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2919 /* This handy little function is used by select-x.c to wait for replies
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2920 from processes that aren't really processes (e.g. the X server) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 wait_delaying_user_input (int (*predicate) (void *arg), void *predicate_arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 Lisp_Object event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 GCPRO1 (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 while (!(*predicate) (predicate_arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 QUIT; /* next_event_internal() does not QUIT. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 /* We're a generator of the command_event_queue, so we can't be a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 consumer as well. Also, we have no reason to consult the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 command_event_queue; there are only user and eval-events there,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 and we'd just have to put them back anyway.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 next_event_internal (event, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 /* See the comment in accept-process-output about Vquit_flag */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 if (command_event_p (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 || (XEVENT_TYPE (event) == eval_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 || (XEVENT_TYPE (event) == magic_eval_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 enqueue_command_event_1 (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 execute_internal_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 /* dispatching events; command builder */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 execute_internal_event (Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 /* events on dead channels get silently eaten */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 if (object_dead_p (XEVENT (event)->channel))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 switch (XEVENT_TYPE (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 case empty_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 case eval_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970 call1 (XEVENT (event)->event.eval.function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 XEVENT (event)->event.eval.object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 case magic_eval_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 (XEVENT (event)->event.magic_eval.internal_function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 (XEVENT (event)->event.magic_eval.object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 return;
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 case pointer_motion_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 if (!NILP (Vmouse_motion_handler))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985 call1 (Vmouse_motion_handler, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 return;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 case process_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 Lisp_Object p = XEVENT (event)->event.process.process;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 Charcount readstatus;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 assert (PROCESSP (p));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 while ((readstatus = read_process_output (p)) > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 if (readstatus > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 ; /* this clauses never gets executed but allows the #ifdefs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 to work cleanly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 #ifdef EWOULDBLOCK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 else if (readstatus == -1 && errno == EWOULDBLOCK)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 #endif /* EWOULDBLOCK */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 #ifdef EAGAIN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 else if (readstatus == -1 && errno == EAGAIN)
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 #endif /* EAGAIN */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 else if ((readstatus == 0 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 /* Note that we cannot distinguish between no input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 available now and a closed pipe.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 With luck, a closed pipe will be accompanied by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 subprocess termination and SIGCHLD. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 (!network_connection_p (p) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 When connected to ToolTalk (i.e.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 connected_via_filedesc_p()), it's not possible to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 reliably determine whether there is a message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 waiting for ToolTalk to receive. ToolTalk expects
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 to have tt_message_receive() called exactly once
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 every time the file descriptor becomes active, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 the filter function forces this by returning 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 Emacs must not interpret this as a closed pipe. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 connected_via_filedesc_p (XPROCESS (p))))
535
c69610198c35 [xemacs-hg @ 2001-05-14 04:52:02 by martinb]
martinb
parents: 516
diff changeset
3024
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 /* On some OSs with ptys, when the process on one end of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 a pty exits, the other end gets an error reading with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 errno = EIO instead of getting an EOF (0 bytes read).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 Therefore, if we get an error reading and errno =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 EIO, just continue, because the child process has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030 exited and should clean itself up soon (e.g. when we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 get a SIGCHLD). */
535
c69610198c35 [xemacs-hg @ 2001-05-14 04:52:02 by martinb]
martinb
parents: 516
diff changeset
3032 #ifdef EIO
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 || (readstatus == -1 && errno == EIO)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 #endif
535
c69610198c35 [xemacs-hg @ 2001-05-14 04:52:02 by martinb]
martinb
parents: 516
diff changeset
3035
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 /* Currently, we rely on SIGCHLD to indicate that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 process has terminated. Unfortunately, on some systems
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 the SIGCHLD gets missed some of the time. So we put an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 additional check in status_notify() to see whether a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 process has terminated. We must tell status_notify()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 to enable that check, and we do so now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 kick_status_notify ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 /* Deactivate network connection */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 Lisp_Object status = Fprocess_status (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 if (EQ (status, Qopen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 /* In case somebody changes the theory of whether to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052 return open as opposed to run for network connection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 "processes"... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 || EQ (status, Qrun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 update_process_status (p, Qexit, 256, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056 deactivate_process (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 /* We must call status_notify here to allow the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 event_stream->unselect_process_cb to be run if appropriate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 Otherwise, dead fds may be selected for, and we will get a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 continuous stream of process events for them. Since we don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063 return until all process events have been flushed, we would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064 get stuck here, processing events on a process whose status
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 was 'exit. Call this after dispatch-event, or the fds will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 have been closed before we read the last data from them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 It's safe for the filter to signal an error because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068 status_notify() will be called on return to top-level.
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 status_notify ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3071 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074 case timeout_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
3076 Lisp_Event *e = XEVENT (event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 if (!NILP (e->event.timeout.function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3078 call1 (e->event.timeout.function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 e->event.timeout.object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3080 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082 case magic_event:
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 event_stream_handle_magic_event (XEVENT (event));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 this_command_keys_replace_suffix (Lisp_Object suffix, Lisp_Object chain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 Lisp_Object first_before_suffix =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 event_chain_find_previous (Vthis_command_keys, suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3100 if (NILP (first_before_suffix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 Vthis_command_keys = chain;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3103 XSET_EVENT_NEXT (first_before_suffix, chain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 deallocate_event_chain (suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 Vthis_command_keys_tail = event_chain_tail (chain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3108 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109 command_builder_replace_suffix (struct command_builder *builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110 Lisp_Object suffix, Lisp_Object chain)
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 Lisp_Object first_before_suffix =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 event_chain_find_previous (builder->current_events, suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 if (NILP (first_before_suffix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 builder->current_events = chain;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 XSET_EVENT_NEXT (first_before_suffix, chain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 deallocate_event_chain (suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 builder->most_current_event = event_chain_tail (chain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 command_builder_find_leaf_1 (struct command_builder *builder)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 Lisp_Object event0 = builder->current_events;
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 (NILP (event0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 return event_binding (event0, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 }
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 /* See if we can do function-key-map or key-translation-map translation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 on the current events in the command builder. If so, do this, and
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3136 return the resulting binding, if any.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3137
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3138 DID_MUNGE must be initialized before calling this function. If munging
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3139 happened, DID_MUNGE will be non-zero; otherwise, it will be left alone.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3140 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 munge_keymap_translate (struct command_builder *builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 enum munge_me_out_the_door munge,
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3145 int has_normal_binding_p, int *did_munge)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147 Lisp_Object suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 EVENT_CHAIN_LOOP (suffix, builder->munge_me[munge].first_mungeable_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 Lisp_Object result = munging_key_map_event_binding (suffix, munge);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153 if (NILP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 if (KEYMAPP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 if (NILP (builder->last_non_munged_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 && !has_normal_binding_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 builder->last_non_munged_event = builder->most_current_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 builder->last_non_munged_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 if (!KEYMAPP (result) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 !VECTORP (result) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 !STRINGP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 GCPRO1 (suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171 result = call1 (result, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 if (NILP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 return Qnil;
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 if (KEYMAPP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180 if (VECTORP (result) || STRINGP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182 Lisp_Object new_chain = key_sequence_to_event_chain (result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 Lisp_Object tempev;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3184 int n;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 /* If the first_mungeable_event of the other munger is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 within the events we're munging, then it will point to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 deallocated events afterwards, which is bad -- so make it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189 point at the beginning of the munged events. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 EVENT_CHAIN_LOOP (tempev, suffix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 Lisp_Object *mungeable_event =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 &builder->munge_me[1 - munge].first_mungeable_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 if (EQ (tempev, *mungeable_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 *mungeable_event = new_chain;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3201 /* Now munge the current event chain in the command builder. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202 n = event_chain_count (suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 command_builder_replace_suffix (builder, suffix, new_chain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 builder->munge_me[munge].first_mungeable_event = Qnil;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3205
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3206 *did_munge = 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
3208 return command_builder_find_leaf_1 (builder);
428
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
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
3211 signal_error (Qinvalid_key_binding,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
3212 (munge == MUNGE_ME_FUNCTION_KEY ?
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
3213 "Invalid binding in function-key-map" :
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
3214 "Invalid binding in key-translation-map"),
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
3215 result);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3216 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3221 /* Same as command_builder_find_leaf() below but no Russian C-x
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3222 processing and no defaulting to self-insert-command.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223 */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3224
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225 static Lisp_Object
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3226 command_builder_find_leaf_no_mule_processing (struct command_builder *builder,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3227 int allow_misc_user_events_p,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3228 int *did_munge)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 Lisp_Object result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232 Lisp_Object evee = builder->current_events;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 if (XEVENT_TYPE (evee) == misc_user_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236 if (allow_misc_user_events_p && (NILP (XEVENT_NEXT (evee))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 return list2 (XEVENT (evee)->event.eval.function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 XEVENT (evee)->event.eval.object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 return Qnil;
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
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3243 /* if we're currently in a menu accelerator, check there for further
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3244 events */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3245 /* #### fuck me! who wrote this crap? think "abstraction", baby. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3246 /* #### this horribly-written crap can mess with global state, which
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3247 this function should not do. i'm not fixing it now. someone
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3248 needs to go and rewrite that shit correctly. --ben */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 #if defined(HAVE_X_WINDOWS) && defined(LWLIB_MENUBARS_LUCID)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3250 if (x_kludge_lw_menu_active ())
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 return command_builder_operate_menu_accelerator (builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 result = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257 if (EQ (Vmenu_accelerator_enabled, Qmenu_force))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 result = command_builder_find_menu_accelerator (builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 if (NILP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 result = command_builder_find_leaf_1 (builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262 #if defined(HAVE_X_WINDOWS) && defined(LWLIB_MENUBARS_LUCID)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 if (NILP (result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 && EQ (Vmenu_accelerator_enabled, Qmenu_fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 result = command_builder_find_menu_accelerator (builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269 /* Check to see if we have a potential function-key-map match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270 if (NILP (result))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3271 result = munge_keymap_translate (builder, MUNGE_ME_FUNCTION_KEY, 0,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3272 did_munge);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3273
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 /* Check to see if we have a potential key-translation-map match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 Lisp_Object key_translate_result =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 munge_keymap_translate (builder, MUNGE_ME_KEY_TRANSLATION,
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3278 !NILP (result), did_munge);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 if (!NILP (key_translate_result))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3280 result = key_translate_result;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 if (!NILP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 /* If key-sequence wasn't bound, we'll try some fallbacks. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 /* If we didn't find a binding, and the last event in the sequence is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 a shifted character, then try again with the lowercase version. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 if (XEVENT_TYPE (builder->most_current_event) == key_press_event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 && !NILP (Vretry_undefined_key_binding_unshifted))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 Lisp_Object terminal = builder->most_current_event;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3295 struct key_data *key = &XEVENT (terminal)->event.key;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 Emchar c = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3297 if ((key->modifiers & XEMACS_MOD_SHIFT)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 || (CHAR_OR_CHAR_INTP (key->keysym)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3299 && ((c = XCHAR_OR_CHAR_INT (key->keysym)),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3300 c >= 'A' && c <= 'Z')))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3302 Lisp_Object neubauten = copy_command_builder (builder, 0);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3303 struct command_builder *neub = XCOMMAND_BUILDER (neubauten);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3304 struct gcpro gcpro1;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3305
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3306 GCPRO1 (neubauten);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3307 terminal = event_chain_tail (neub->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3308 key = &XEVENT (terminal)->event.key;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3310 if (key->modifiers & XEMACS_MOD_SHIFT)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3311 key->modifiers &= (~ XEMACS_MOD_SHIFT);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 key->keysym = make_char (c + 'a' - 'A');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3315 result =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3316 command_builder_find_leaf_no_mule_processing
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3317 (neub, allow_misc_user_events_p, did_munge);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3318
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 if (!NILP (result))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3320 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3321 copy_command_builder (neub, builder);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3322 *did_munge = 1;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3323 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3324 free_command_builder (neub);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3325 UNGCPRO;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3326 if (!NILP (result))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3327 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 /* help-char is `auto-bound' in every keymap */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 if (!NILP (Vprefix_help_command) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333 event_matches_key_specifier_p (XEVENT (builder->most_current_event),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 Vhelp_char))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 return Vprefix_help_command;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3337 return Qnil;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3338 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3339
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3340 /* Compare the current state of the command builder against the local and
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3341 global keymaps, and return the binding. If there is no match, try again,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3342 case-insensitively. The return value will be one of:
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3343 -- nil (there is no binding)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3344 -- a keymap (part of a command has been specified)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3345 -- a command (anything that satisfies `commandp'; this includes
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3346 some symbols, lists, subrs, strings, vectors, and
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3347 compiled-function objects)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3348
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3349 This may "munge" the current event chain in the command builder;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3350 i.e. the sequence might be mutated into a different sequence,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3351 which we then pretend is what the user actually typed instead of
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3352 the passed-in sequence. This happens as a result of:
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3353
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3354 -- key-translation-map changes
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3355 -- function-key-map changes
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3356 -- retry-undefined-key-binding-unshifted (q.v.)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3357 -- "Russian C-x problem" changes (see definition of struct key_data,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3358 events.h)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3359
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3360 DID_MUNGE must be initialized before calling this function. If munging
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3361 happened, DID_MUNGE will be non-zero; otherwise, it will be left alone.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3362 */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3363
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3364 static Lisp_Object
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3365 command_builder_find_leaf (struct command_builder *builder,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3366 int allow_misc_user_events_p,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3367 int *did_munge)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3368 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3369 Lisp_Object result =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3370 command_builder_find_leaf_no_mule_processing
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3371 (builder, allow_misc_user_events_p, did_munge);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3372
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3373 if (!NILP (result))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3374 return result;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3375
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3376 #ifdef MULE
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3377 /* #### Do Russian C-x processing here */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3378
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 /* If keysym is a non-ASCII char, bind it to self-insert-char by default. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380 if (XEVENT_TYPE (builder->most_current_event) == key_press_event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 && !NILP (Vcomposed_character_default_binding))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3382 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3383 Lisp_Object keysym =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3384 XEVENT (builder->most_current_event)->event.key.keysym;
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
3385 if (CHARP (keysym) && !emchar_ascii_p (XCHAR (keysym)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 return Vcomposed_character_default_binding;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 }
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3388 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3393 /* Like command_builder_find_leaf but update this-command-keys and the
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3394 echo area as necessary when the current event chain was munged. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3395
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3396 static Lisp_Object
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3397 command_builder_find_leaf_and_update_global_state (struct command_builder *
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3398 builder,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3399 int
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3400 allow_misc_user_events_p)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3401 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3402 int did_munge = 0;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3403 int orig_length = event_chain_count (builder->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3404 Lisp_Object result = command_builder_find_leaf (builder,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3405 allow_misc_user_events_p,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3406 &did_munge);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3407
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3408 if (did_munge)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3409 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3410 int tck_length = event_chain_count (Vthis_command_keys);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3411
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3412 /* We just assume that the events we just replaced are
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3413 sitting in copied form at the end of this-command-keys.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3414 If the user did weird things with `dispatch-event' this
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3415 may not be the case, but at least we make sure we won't
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3416 crash. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3417
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3418 if (tck_length >= orig_length)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3419 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3420 Lisp_Object new_chain =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3421 copy_event_chain (builder->current_events);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3422 this_command_keys_replace_suffix
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3423 (event_chain_nth (Vthis_command_keys, tck_length - orig_length),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3424 new_chain);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3425
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3426 regenerate_echo_keys_from_this_command_keys (builder);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3427 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3428 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3429
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3430 if (NILP (result))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3431 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3432 /* If we read extra events attempting to match a function key but end
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3433 up failing, then we release those events back to the command loop
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3434 and fail on the original lookup. The released events will then be
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3435 reprocessed in the context of the first part having failed. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3436 if (!NILP (builder->last_non_munged_event))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3437 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3438 Lisp_Object event0 = builder->last_non_munged_event;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3439
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3440 /* Put the commands back on the event queue. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3441 enqueue_event_chain (XEVENT_NEXT (event0),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3442 &command_event_queue,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3443 &command_event_queue_tail);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3444
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3445 /* Then remove them from the command builder. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3446 XSET_EVENT_NEXT (event0, Qnil);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3447 builder->most_current_event = event0;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3448 builder->last_non_munged_event = Qnil;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3449 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3450 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3451
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3452 return result;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3453 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455 /* Every time a command-event (a key, button, or menu selection) is read by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456 Fnext_event(), it is stored in the recent_keys_ring, in Vlast_input_event,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3457 and in Vthis_command_keys. (Eval-events are not stored there.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 Every time a command is invoked, Vlast_command_event is set to the last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460 event in the sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 This means that Vthis_command_keys is really about "input read since the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463 last command was executed" rather than about "what keys invoked this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3464 command." This is a little counterintuitive, but that's the way it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465 has always worked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467 As an extra kink, the function read-key-sequence resets/updates the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468 last-command-event and this-command-keys. It doesn't append to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 command-keys as read-char does. Such are the pitfalls of having to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470 maintain compatibility with a program for which the only specification
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471 is the code itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3473 (We could implement recent_keys_ring and Vthis_command_keys as the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474 data structure.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477 DEFUN ("recent-keys", Frecent_keys, 0, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 Return a vector of recent keyboard or mouse button events read.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3479 If NUMBER is non-nil, not more than NUMBER events will be returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480 Change number of events stored using `set-recent-keys-ring-size'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 This copies the event objects into a new vector; it is safe to keep and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483 modify them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3484 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3485 (number))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 Lisp_Object val = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489 int nwanted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 int start, nkeys, i, j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3491 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3493 if (NILP (number))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3494 nwanted = recent_keys_ring_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3495 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497 CHECK_NATNUM (number);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498 nwanted = XINT (number);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3501 /* Create the keys ring vector, if none present. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3502 if (NILP (Vrecent_keys_ring))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3504 Vrecent_keys_ring = make_vector (recent_keys_ring_size, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505 /* And return nothing in particular. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3506 RETURN_UNGCPRO (make_vector (0, Qnil));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3507 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509 if (NILP (XVECTOR_DATA (Vrecent_keys_ring)[recent_keys_ring_index]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3510 /* This means the vector has not yet wrapped */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3511 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 nkeys = recent_keys_ring_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 start = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517 nkeys = recent_keys_ring_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3518 start = ((recent_keys_ring_index == nkeys) ? 0 : recent_keys_ring_index);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 if (nwanted < nkeys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523 start += nkeys - nwanted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 if (start >= recent_keys_ring_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3525 start -= recent_keys_ring_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3526 nkeys = nwanted;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3527 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3528 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3529 nwanted = nkeys;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3531 val = make_vector (nwanted, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3533 for (i = 0, j = start; i < nkeys; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 Lisp_Object e = XVECTOR_DATA (Vrecent_keys_ring)[j];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537 if (NILP (e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 XVECTOR_DATA (val)[i] = Fcopy_event (e, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 if (++j >= recent_keys_ring_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541 j = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 DEFUN ("recent-keys-ring-size", Frecent_keys_ring_size, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 The maximum number of events `recent-keys' can return.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553 return make_int (recent_keys_ring_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3554 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3556 DEFUN ("set-recent-keys-ring-size", Fset_recent_keys_ring_size, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557 Set the maximum number of events to be stored internally.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3558 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3559 (size))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3560 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3561 Lisp_Object new_vector = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3562 int i, j, nkeys, start, min;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565 CHECK_INT (size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566 if (XINT (size) <= 0)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
3567 invalid_argument ("Recent keys ring size must be positive", size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 if (XINT (size) == recent_keys_ring_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3569 return size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3570
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3571 GCPRO1 (new_vector);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3572 new_vector = make_vector (XINT (size), Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574 if (NILP (Vrecent_keys_ring))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3576 Vrecent_keys_ring = new_vector;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3577 RETURN_UNGCPRO (size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580 if (NILP (XVECTOR_DATA (Vrecent_keys_ring)[recent_keys_ring_index]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 /* This means the vector has not yet wrapped */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 nkeys = recent_keys_ring_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 start = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588 nkeys = recent_keys_ring_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 start = ((recent_keys_ring_index == nkeys) ? 0 : recent_keys_ring_index);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3592 if (XINT (size) > nkeys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 min = nkeys;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3594 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3595 min = XINT (size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597 for (i = 0, j = start; i < min; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3598 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599 XVECTOR_DATA (new_vector)[i] = XVECTOR_DATA (Vrecent_keys_ring)[j];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600 if (++j >= recent_keys_ring_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601 j = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603 recent_keys_ring_size = XINT (size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 recent_keys_ring_index = (i < recent_keys_ring_size) ? i : 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3606 Vrecent_keys_ring = new_vector;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 return size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3610 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 /* Vthis_command_keys having value Qnil means that the next time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 push_this_command_keys is called, it should start over.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614 The times at which the command-keys are reset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3615 (instead of merely being augmented) are pretty counterintuitive.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616 (More specifically:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 -- We do not reset this-command-keys when we finish reading a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619 command. This is because some commands (e.g. C-u) act
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620 like command prefixes; they signal this by setting prefix-arg
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 to non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3622 -- Therefore, we reset this-command-keys when we finish
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623 executing a command, unless prefix-arg is set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3624 -- However, if we ever do a non-local exit out of a command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3625 loop (e.g. an error in a command), we need to reset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3626 this-command-keys. We do this by calling reset_this_command_keys()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627 from cmdloop.c, whenever an error causes an invocation of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3628 default error handler, and whenever there's a throw to top-level.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3629 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632 reset_this_command_keys (Lisp_Object console, int clear_echo_area_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3633 {
757
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3634 if (!NILP (console))
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3635 {
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3636 /* console is nil if we just deleted the console as a result of C-x 5
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3637 0. Unfortunately things are currently in a messy situation where
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3638 some stuff is console-local and other stuff isn't, so we need to
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3639 do everything that's not console-local. */
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3640 struct command_builder *command_builder =
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3641 XCOMMAND_BUILDER (XCONSOLE (console)->command_builder);
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3642
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3643 reset_key_echo (command_builder, clear_echo_area_p);
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3644 reset_current_events (command_builder);
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3645 }
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3646 else
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
3647 reset_key_echo (0, clear_echo_area_p);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3649 deallocate_event_chain (Vthis_command_keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3650 Vthis_command_keys = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3651 Vthis_command_keys_tail = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3652 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3654 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3655 push_this_command_keys (Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3656 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3657 Lisp_Object new = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 Fcopy_event (event, new);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660 enqueue_event (new, &Vthis_command_keys, &Vthis_command_keys_tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3661 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3662
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3663 /* The following two functions are used in call-interactively,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3664 for the @ and e specifications. We used to just use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3665 `current-mouse-event' (i.e. the last mouse event in this-command-keys),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3666 but FSF does it more generally so we follow their lead. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3668 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3669 extract_this_command_keys_nth_mouse_event (int n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3671 Lisp_Object event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3672
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673 EVENT_CHAIN_LOOP (event, Vthis_command_keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3675 if (EVENTP (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676 && (XEVENT_TYPE (event) == button_press_event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677 || XEVENT_TYPE (event) == button_release_event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 || XEVENT_TYPE (event) == misc_user_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680 if (!n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3681 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3682 /* must copy to avoid an abort() in next_event_internal() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683 if (!NILP (XEVENT_NEXT (event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684 return Fcopy_event (event, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3685 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 return event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3687 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3688 n--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3689 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3690 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3691
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3692 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3693 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696 extract_vector_nth_mouse_event (Lisp_Object vector, int n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3697 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3698 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3699 int len = XVECTOR_LENGTH (vector);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3701 for (i = 0; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3702 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3703 Lisp_Object event = XVECTOR_DATA (vector)[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3704 if (EVENTP (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3705 switch (XEVENT_TYPE (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3707 case button_press_event :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3708 case button_release_event :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709 case misc_user_event :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3710 if (n == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3711 return event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3712 n--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3713 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3714 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3715 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3716 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3723 push_recent_keys (Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3725 Lisp_Object e;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3727 if (NILP (Vrecent_keys_ring))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3728 Vrecent_keys_ring = make_vector (recent_keys_ring_size, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3729
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3730 e = XVECTOR_DATA (Vrecent_keys_ring) [recent_keys_ring_index];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 if (NILP (e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3733 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3734 e = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3735 XVECTOR_DATA (Vrecent_keys_ring) [recent_keys_ring_index] = e;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3736 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3737 Fcopy_event (event, e);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3738 if (++recent_keys_ring_index == recent_keys_ring_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3739 recent_keys_ring_index = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3740 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3742
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3743 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3744 current_events_into_vector (struct command_builder *command_builder)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3745 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3746 Lisp_Object vector;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3747 Lisp_Object event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3748 int n = event_chain_count (command_builder->current_events);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3750 /* Copy the vector and the events in it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3751 /* No need to copy the events, since they're already copies, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3752 nobody other than the command-builder has pointers to them */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3753 vector = make_vector (n, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3754 n = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3755 EVENT_CHAIN_LOOP (event, command_builder->current_events)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756 XVECTOR_DATA (vector)[n++] = event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3757 reset_command_builder_event_chain (command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3758 return vector;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3759 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3760
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3761
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3762 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3763 Given the current state of the command builder and a new command event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764 that has just been dispatched:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3765
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3766 -- add the event to the event chain forming the current command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 (doing meta-translation as necessary)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768 -- return the binding of this event chain; this will be one of:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3769 -- nil (there is no binding)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3770 -- a keymap (part of a command has been specified)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 -- a command (anything that satisfies `commandp'; this includes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 some symbols, lists, subrs, strings, vectors, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773 compiled-function objects)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3776 lookup_command_event (struct command_builder *command_builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3777 Lisp_Object event, int allow_misc_user_events_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3778 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 struct frame *f = selected_frame ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781 /* Clear output from previous command execution */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782 if (!EQ (Qcommand, echo_area_status (f))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3783 /* but don't let mouse-up clear what mouse-down just printed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3784 && (XEVENT (event)->event_type != button_release_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 clear_echo_area (f, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3787 /* Add the given event to the command builder.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3788 Extra hack: this also updates the recent_keys_ring and Vthis_command_keys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 vectors to translate "ESC x" to "M-x" (for any "x" of course).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3790 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3791 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792 Lisp_Object recent = command_builder->most_current_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794 if (EVENTP (recent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3795 && event_matches_key_specifier_p (XEVENT (recent), Vmeta_prefix_char))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3796 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
3797 Lisp_Event *e;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3798 /* When we see a sequence like "ESC x", pretend we really saw "M-x".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3799 DoubleThink the recent-keys and this-command-keys as well. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3801 /* Modify the previous most-recently-pushed event on the command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3802 builder to be a copy of this one with the meta-bit set instead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3803 pushing a new event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 Fcopy_event (event, recent);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806 e = XEVENT (recent);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807 if (e->event_type == key_press_event)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3808 e->event.key.modifiers |= XEMACS_MOD_META;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809 else if (e->event_type == button_press_event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3810 || e->event_type == button_release_event)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3811 e->event.button.modifiers |= XEMACS_MOD_META;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3816 int tckn = event_chain_count (Vthis_command_keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3817 if (tckn >= 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3818 /* ??? very strange if it's < 2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 this_command_keys_replace_suffix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 (event_chain_nth (Vthis_command_keys, tckn - 2),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 Fcopy_event (recent, Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 regenerate_echo_keys_from_this_command_keys (command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3825 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 else
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3827 command_builder_append_event (command_builder, event);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3830 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3831 Lisp_Object leaf =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3832 command_builder_find_leaf_and_update_global_state
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3833 (command_builder,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3834 allow_misc_user_events_p);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3836 GCPRO1 (leaf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838 if (KEYMAPP (leaf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3840 #if defined (HAVE_X_WINDOWS) && defined (LWLIB_MENUBARS_LUCID)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3841 if (!x_kludge_lw_menu_active ())
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3842 #else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3843 if (1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3844 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3845 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846 Lisp_Object prompt = Fkeymap_prompt (leaf, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 if (STRINGP (prompt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3848 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849 /* Append keymap prompt to key echo buffer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3850 int buf_index = command_builder->echo_buf_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3851 Bytecount len = XSTRING_LENGTH (prompt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3853 if (len + buf_index + 1 <= command_builder->echo_buf_length)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3854 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 593
diff changeset
3855 Intbyte *echo = command_builder->echo_buf + buf_index;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3856 memcpy (echo, XSTRING_DATA (prompt), len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3857 echo[len] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3858 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3859 maybe_echo_keys (command_builder, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3860 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3861 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3862 maybe_echo_keys (command_builder, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3863 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3864 else if (!NILP (Vquit_flag))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3865 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3866 Lisp_Object quit_event = Fmake_event (Qnil, Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3867 Lisp_Event *e = XEVENT (quit_event);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3868 /* if quit happened during menu acceleration, pretend we read it */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3869 struct console *con = XCONSOLE (Fselected_console ());
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3870 int ch = CONSOLE_QUIT_CHAR (con);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3871
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3872 character_to_event (ch, e, con, 1, 1);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
3873 e->channel = wrap_console (con);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3874
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3875 enqueue_command_event (quit_event);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3876 Vquit_flag = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3877 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3878 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3879 else if (!NILP (leaf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3880 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881 if (EQ (Qcommand, echo_area_status (f))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 && command_builder->echo_buf_index > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3883 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3884 /* If we had been echoing keys, echo the last one (without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885 the trailing dash) and redisplay before executing the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3886 command. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3887 command_builder->echo_buf[command_builder->echo_buf_index] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3888 maybe_echo_keys (command_builder, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3889 Fsit_for (Qzero, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3890 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3891 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3892 RETURN_UNGCPRO (leaf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3893 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3894 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3895
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3896 static int
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3897 is_scrollbar_event (Lisp_Object event)
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3898 {
516
8a4db099aa97 [xemacs-hg @ 2001-05-07 14:55:13 by yoshiki]
yoshiki
parents: 502
diff changeset
3899 #ifdef HAVE_SCROLLBARS
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3900 Lisp_Object fun;
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3901
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3902 if (XEVENT (event)->event_type != misc_user_event)
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3903 return 0;
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3904 fun = XEVENT (event)->event.misc.function;
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3905
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3906 return (EQ (fun, Qscrollbar_line_up) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3907 EQ (fun, Qscrollbar_line_down) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3908 EQ (fun, Qscrollbar_page_up) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3909 EQ (fun, Qscrollbar_page_down) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3910 EQ (fun, Qscrollbar_to_top) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3911 EQ (fun, Qscrollbar_to_bottom) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3912 EQ (fun, Qscrollbar_vertical_drag) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3913 EQ (fun, Qscrollbar_char_left) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3914 EQ (fun, Qscrollbar_char_right) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3915 EQ (fun, Qscrollbar_page_left) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3916 EQ (fun, Qscrollbar_page_right) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3917 EQ (fun, Qscrollbar_to_left) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3918 EQ (fun, Qscrollbar_to_right) ||
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3919 EQ (fun, Qscrollbar_horizontal_drag));
516
8a4db099aa97 [xemacs-hg @ 2001-05-07 14:55:13 by yoshiki]
yoshiki
parents: 502
diff changeset
3920 #else
8a4db099aa97 [xemacs-hg @ 2001-05-07 14:55:13 by yoshiki]
yoshiki
parents: 502
diff changeset
3921 return 0;
8a4db099aa97 [xemacs-hg @ 2001-05-07 14:55:13 by yoshiki]
yoshiki
parents: 502
diff changeset
3922 #endif /* HAVE_SCROLLBARS */
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3923 }
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3924
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3925 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3926 execute_command_event (struct command_builder *command_builder,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3927 Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3928 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3929 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3930 struct console *con = XCONSOLE (command_builder->console);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3931 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3932
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3933 GCPRO1 (event); /* event may be freshly created */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3934
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3935 /* #### This call to is_scrollbar_event() isn't quite right, but
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3936 fixing properly it requires more work than can go into 21.4.
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3937 (We really need to split out menu, scrollbar, dialog, and other
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3938 types of events from misc-user, and put the remaining ones in a
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3939 new `user-eval' type that behaves like an eval event but is a
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3940 user event and thus has all of its semantics -- e.g. being
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3941 delayed during `accept-process-output' and similar wait states.)
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3942
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3943 The real issue here is that "user events" and "command events"
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3944 are not the same thing, but are very much confused in
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3945 event-stream.c. User events are, essentially, any event that
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3946 should be delayed by accept-process-output, should terminate a
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3947 sit-for, etc. -- basically, any event that needs to be processed
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3948 synchronously with key and mouse events. Command events are
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3949 those that participate in command building; scrollbar events
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3950 clearly don't belong because they should be transparent in a
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3951 sequence like C-x @ h <scrollbar-drag> x, which used to cause a
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3952 crash before checks similar to the is_scrollbar_event() call were
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3953 added. Do other events belong with scrollbar events? I'm not
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3954 sure; we need to categorize all misc-user events and see what
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3955 their semantics are.
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3956
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3957 (You might ask, why do scrollbar events need to be user events?
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3958 That's a good question. The answer seems to be that they can
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3959 change point, and having this happen asynchronously would be a
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3960 very bad idea. According to the "proper" functioning of
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3961 scrollbars, this should not happen, but XEmacs does not allow
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3962 point to go outside of the window.)
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3963
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3964 Scrollbar events and similar non-command events should obviously
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3965 not be recorded in this-command-keys, so we need to check for
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3966 this in next-event.
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3967
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3968 #### We call reset_current_events() twice in this function --
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3969 #### here, and later as a result of reset_this_command_keys().
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3970 #### This is almost certainly wrong; need to figure out what's
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3971 #### correct.
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3972
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3973 #### We need to figure out what's really correct w.r.t. scrollbar
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3974 #### events. With these new fixes in, it actually works to do
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3975 #### C-x <scrollbar-drag> 5 2, but the key echo gets messed up
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3976 #### (starts over at 5). We really need to be special-casing
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3977 #### scrollbar events at a lower level, and not really passing
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3978 #### them through the command builder at all. (e.g. do scrollbar
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3979 #### events belong in macros??? doubtful; probably only the
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3980 #### point movement, if any, belongs, special-cased as a
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3981 #### pseudo-issued M-x goto-char command). #### Need more work
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3982 #### here. Do this when separating out scrollbar events.
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3983 */
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3984
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
3985 if (!is_scrollbar_event (event))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3986 reset_current_events (command_builder);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 switch (XEVENT (event)->event_type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3990 case key_press_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3991 Vcurrent_mouse_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3992 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3993 case button_press_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3994 case button_release_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3995 case misc_user_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 Vcurrent_mouse_event = Fcopy_event (event, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3997 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3998 default: break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3999 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4001 /* Store the last-command-event. The semantics of this is that it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4002 is the last event most recently involved in command-lookup. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4003 if (!EVENTP (Vlast_command_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4004 Vlast_command_event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 if (XEVENT (Vlast_command_event)->event_type == dead_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4006 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4007 Vlast_command_event = Fmake_event (Qnil, Qnil);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4008 invalid_state ("Someone deallocated the last-command-event!", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4009 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4011 if (! EQ (event, Vlast_command_event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 Fcopy_event (event, Vlast_command_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4014 /* Note that last-command-char will never have its high-bit set, in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4015 an effort to sidestep the ambiguity between M-x and oslash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016 Vlast_command_char = Fevent_to_character (Vlast_command_event,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017 Qnil, Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4019 /* Actually call the command, with all sorts of hair to preserve or clear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020 the echo-area and region as appropriate and call the pre- and post-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4021 command-hooks. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4022 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4023 int old_kbd_macro = con->kbd_macro_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4024 struct window *w = XWINDOW (Fselected_window (Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4025
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026 /* We're executing a new command, so the old value is irrelevant. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4027 zmacs_region_stays = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4029 /* If the previous command tried to force a specific window-start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4030 reset the flag in case this command moves point far away from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4031 that position. Also, reset the window's buffer's change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4032 information so that we don't trigger an incremental update. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4033 if (w->force_start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4034 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4035 w->force_start = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4036 buffer_reset_changes (XBUFFER (w->buffer));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4037 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4039 pre_command_hook ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4041 if (XEVENT (event)->event_type == misc_user_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4042 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4043 call1 (XEVENT (event)->event.eval.function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 XEVENT (event)->event.eval.object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4045 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4046 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 Fcommand_execute (Vthis_command, Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4051 post_command_hook ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4052
757
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
4053 /* Console might have been deleted by command */
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
4054 if (CONSOLE_LIVE_P (con) && !NILP (con->prefix_arg))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4055 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 /* Commands that set the prefix arg don't update last-command, don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057 reset the echoing state, and don't go into keyboard macros unless
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4058 followed by another command. Also don't quit here. */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4059 int speccount = specpdl_depth ();
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4060 specbind (Qinhibit_quit, Qt);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4061 maybe_echo_keys (command_builder, 0);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4062 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064 /* If we're recording a keyboard macro, and the last command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065 executed set a prefix argument, then decrement the pointer to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066 the "last character really in the macro" to be just before this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4067 command. This is so that the ^U in "^U ^X )" doesn't go onto
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4068 the end of macro. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069 if (!NILP (con->defining_kbd_macro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070 con->kbd_macro_end = old_kbd_macro;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4071 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4072 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4073 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4074 /* Start a new command next time */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4075 Vlast_command = Vthis_command;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4076 Vlast_command_properties = Vthis_command_properties;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4077 Vthis_command_properties = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4078
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4079 /* Emacs 18 doesn't unconditionally clear the echoed keystrokes,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 so we don't either */
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
4081
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 462
diff changeset
4082 if (!is_scrollbar_event (event))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4083 reset_this_command_keys (CONSOLE_LIVE_P (con) ? wrap_console (con)
757
516c347c4479 [xemacs-hg @ 2002-02-22 17:13:59 by michaels]
michaels
parents: 733
diff changeset
4084 : Qnil, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4085 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4086 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4088 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4089 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4091 /* Run the pre command hook. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4092
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4093 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4094 pre_command_hook (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4095 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4096 last_point_position = BUF_PT (current_buffer);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 788
diff changeset
4097 last_point_position_buffer = wrap_buffer (current_buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4098 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4099 safe_run_hook_trapping_errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4100 ("Error in `pre-command-hook' (setting hook to nil)",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4101 Qpre_command_hook, 1);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4102
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4103 /* This is a kludge, but necessary; see simple.el */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4104 call0 (Qhandle_pre_motion_command);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4105 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4107 /* Run the post command hook. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4109 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4110 post_command_hook (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4111 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4112 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4113 /* Turn off region highlighting unless this command requested that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4114 it be left on, or we're in the minibuffer. We don't turn it off
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4115 when we're in the minibuffer so that things like M-x write-region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4116 still work!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4118 This could be done via a function on the post-command-hook, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4119 we don't want the user to accidentally remove it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4120 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4122 Lisp_Object win = Fselected_window (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4124 /* If the last command deleted the frame, `win' might be nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4125 It seems safest to do nothing in this case. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4126 /* Note: Someone added the following comment and put #if 0's around
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4127 this code, not realizing that doing this invites a crash in the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4128 line after. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
4129 /* #### This doesn't really fix the problem,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130 if delete-frame is called by some hook */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4131 if (NILP (win))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4132 return;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4133
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4134 /* This is a kludge, but necessary; see simple.el */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4135 call0 (Qhandle_post_motion_command);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137 if (! zmacs_region_stays
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138 && (!MINI_WINDOW_P (XWINDOW (win))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4139 || EQ (zmacs_region_buffer (), WINDOW_BUFFER (XWINDOW (win)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140 zmacs_deactivate_region ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4141 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4142 zmacs_update_region ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4144 safe_run_hook_trapping_errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4145 ("Error in `post-command-hook' (setting hook to nil)",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4146 Qpost_command_hook, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4148 /* #### Kludge!!! This is necessary to make sure that things
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4149 are properly positioned even if post-command-hook moves point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4150 #### There should be a cleaner way of handling this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4151 call0 (Qauto_show_make_point_visible);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4152 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4155 DEFUN ("dispatch-event", Fdispatch_event, 1, 1, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4156 Given an event object EVENT as returned by `next-event', execute it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4158 Key-press, button-press, and button-release events get accumulated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4159 until a complete key sequence (see `read-key-sequence') is reached,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4160 at which point the sequence is looked up in the current keymaps and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4161 acted upon.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163 Mouse motion events cause the low-level handling function stored in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4164 `mouse-motion-handler' to be called. (There are very few circumstances
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4165 under which you should change this handler. Use `mode-motion-hook'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 instead.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4168 Menu, timeout, and eval events cause the associated function or handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4169 to be called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171 Process events cause the subprocess's output to be read and acted upon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4172 appropriately (see `start-process').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4174 Magic events are handled as necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4175 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4176 (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179 struct command_builder *command_builder;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
4180 Lisp_Event *ev;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4181 Lisp_Object console;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182 Lisp_Object channel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4184 CHECK_LIVE_EVENT (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4185 ev = XEVENT (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4187 /* events on dead channels get silently eaten */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4188 channel = EVENT_CHANNEL (ev);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4189 if (object_dead_p (channel))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4190 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4192 /* Some events don't have channels (e.g. eval events). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 console = CDFW_CONSOLE (channel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4194 if (NILP (console))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4195 console = Vselected_console;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4196 else if (!EQ (console, Vselected_console))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4197 Fselect_console (console);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4199 command_builder = XCOMMAND_BUILDER (XCONSOLE (console)->command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200 switch (XEVENT (event)->event_type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 case button_press_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4203 case button_release_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4204 case key_press_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206 Lisp_Object leaf = lookup_command_event (command_builder, event, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4208 if (KEYMAPP (leaf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209 /* Incomplete key sequence */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4211 if (NILP (leaf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4212 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4213 /* At this point, we know that the sequence is not bound to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4214 command. Normally, we beep and print a message informing the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4215 user of this. But we do not beep or print a message when:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4217 o the last event in this sequence is a mouse-up event; or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4218 o the last event in this sequence is a mouse-down event and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4219 there is a binding for the mouse-up version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4221 That is, if the sequence ``C-x button1'' is typed, and is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4222 bound to a command, but the sequence ``C-x button1up'' is bound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4223 to a command, we do not complain about the ``C-x button1''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4224 sequence. If neither ``C-x button1'' nor ``C-x button1up'' is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4225 bound to a command, then we complain about the ``C-x button1''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4226 sequence, but later will *not* complain about the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4227 ``C-x button1up'' sequence, which would be redundant.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4229 This is pretty hairy, but I think it's the most intuitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4230 behavior.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4231 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4232 Lisp_Object terminal = command_builder->most_current_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 if (XEVENT_TYPE (terminal) == button_press_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4235 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 int no_bitching;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237 /* Temporarily pretend the last event was an "up" instead of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238 "down", and look up its binding. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4239 XEVENT_TYPE (terminal) = button_release_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240 /* If the "up" version is bound, don't complain. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4241 no_bitching
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4242 = !NILP (command_builder_find_leaf_and_update_global_state
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4243 (command_builder, 0));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4244 /* Undo the temporary changes we just made. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4245 XEVENT_TYPE (terminal) = button_press_event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4246 if (no_bitching)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4247 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4248 /* Pretend this press was not seen (treat as a prefix) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4249 if (EQ (command_builder->current_events, terminal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4250 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4251 reset_current_events (command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4253 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4254 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255 Lisp_Object eve;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4257 EVENT_CHAIN_LOOP (eve, command_builder->current_events)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4258 if (EQ (XEVENT_NEXT (eve), terminal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4261 Fdeallocate_event (command_builder->
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4262 most_current_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4263 XSET_EVENT_NEXT (eve, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4264 command_builder->most_current_event = eve;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4266 maybe_echo_keys (command_builder, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4268 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4271 /* Complain that the typed sequence is not defined, if this is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4272 kind of sequence that warrants a complaint. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273 XCONSOLE (console)->defining_kbd_macro = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4274 XCONSOLE (console)->prefix_arg = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275 /* Don't complain about undefined button-release events */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 if (XEVENT_TYPE (terminal) != button_release_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4278 Lisp_Object keys = current_events_into_vector (command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4279 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4281 /* Run the pre-command-hook before barfing about an undefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4282 key. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4283 Vthis_command = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4284 GCPRO1 (keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285 pre_command_hook ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4286 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4287 /* The post-command-hook doesn't run. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 Fsignal (Qundefined_keystroke_sequence, list1 (keys));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4289 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4290 /* Reset the command builder for reading the next sequence. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 reset_this_command_keys (console, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4293 else /* key sequence is bound to a command */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4294 {
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4295 int magic_undo = 0;
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4296 int magic_undo_count = 20;
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4297
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4298 Vthis_command = leaf;
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4299
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4300 /* Don't push an undo boundary if the command set the prefix arg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4301 or if we are executing a keyboard macro, or if in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4302 minibuffer. If the command we are about to execute is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4303 self-insert, it's tricky: up to 20 consecutive self-inserts may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4304 be done without an undo boundary. This counter is reset as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4305 soon as a command other than self-insert-command is executed.
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4306
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4307 Programmers can also use the `self-insert-defer-undo'
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4308 property to install that behavior on functions other
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4309 than `self-insert-command', or to change the magic
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4310 number 20 to something else. #### DOCUMENT THIS! */
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4311
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4312 if (SYMBOLP (leaf))
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4313 {
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4314 Lisp_Object prop = Fget (leaf, Qself_insert_defer_undo, Qnil);
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4315 if (NATNUMP (prop))
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4316 magic_undo = 1, magic_undo_count = XINT (prop);
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4317 else if (!NILP (prop))
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4318 magic_undo = 1;
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4319 else if (EQ (leaf, Qself_insert_command))
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4320 magic_undo = 1;
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4321 }
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4322
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4323 if (!magic_undo)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4324 command_builder->self_insert_countdown = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4325 if (NILP (XCONSOLE (console)->prefix_arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4326 && NILP (Vexecuting_macro)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4327 && command_builder->self_insert_countdown == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4328 Fundo_boundary ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4329
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4330 if (magic_undo)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 if (--command_builder->self_insert_countdown < 0)
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4333 command_builder->self_insert_countdown = magic_undo_count;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4334 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4335 execute_command_event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4336 (command_builder,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4337 internal_equal (event, command_builder->most_current_event, 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4338 ? event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4339 /* Use the translated event that was most recently seen.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4340 This way, last-command-event becomes f1 instead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4341 the P from ESC O P. But we must copy it, else we'll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4342 lose when the command-builder events are deallocated. */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4343 : Fcopy_event (command_builder->most_current_event, Qnil));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4345 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4346 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4347 case misc_user_event:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4349 /* Jamie said:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 We could just always use the menu item entry, whatever it is, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 this might break some Lisp code that expects `this-command' to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 always contain a symbol. So only store it if this is a simple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 `call-interactively' sort of menu item.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 But this is bogus. `this-command' could be a string or vector
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4357 anyway (for keyboard macros). There's even one instance
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4358 (in pending-del.el) of `this-command' getting set to a cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359 (a lambda expression). So in the `eval' case I'll just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4360 convert it into a lambda expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4361 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4362 if (EQ (XEVENT (event)->event.eval.function, Qcall_interactively)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4363 && SYMBOLP (XEVENT (event)->event.eval.object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4364 Vthis_command = XEVENT (event)->event.eval.object;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4365 else if (EQ (XEVENT (event)->event.eval.function, Qeval))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4366 Vthis_command =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4367 Fcons (Qlambda, Fcons (Qnil, XEVENT (event)->event.eval.object));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368 else if (SYMBOLP (XEVENT (event)->event.eval.function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4369 /* A scrollbar command or the like. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4370 Vthis_command = XEVENT (event)->event.eval.function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4371 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4372 /* Huh? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4373 Vthis_command = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 /* clear the echo area */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4376 reset_key_echo (command_builder, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4378 command_builder->self_insert_countdown = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4379 if (NILP (XCONSOLE (console)->prefix_arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4380 && NILP (Vexecuting_macro)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 && !EQ (minibuf_window, Fselected_window (Qnil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4382 Fundo_boundary ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4383 execute_command_event (command_builder, event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4384 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4385 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4386 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4387 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4388 execute_internal_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4389 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4390 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4393 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4395 DEFUN ("read-key-sequence", Fread_key_sequence, 1, 3, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4396 Read a sequence of keystrokes or mouse clicks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4397 Returns a vector of the event objects read. The vector and the event
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4398 objects it contains are freshly created (and so will not be side-effected
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4399 by subsequent calls to this function).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4401 The sequence read is sufficient to specify a non-prefix command starting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4402 from the current local and global keymaps. A C-g typed while in this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4403 function is treated like any other character, and `quit-flag' is not set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4405 First arg PROMPT is a prompt string. If nil, do not prompt specially.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4406
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4407 Second optional arg CONTINUE-ECHO non-nil means this key echoes as a
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4408 continuation of the previous key.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4409
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4410 Third optional arg DONT-DOWNCASE-LAST non-nil means do not convert the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4411 last event to lower case. (Normally any upper case event is converted
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4412 to lower case if the original event is undefined and the lower case
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4413 equivalent is defined.) This argument is provided mostly for FSF
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4414 compatibility; the equivalent effect can be achieved more generally by
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4415 binding `retry-undefined-key-binding-unshifted' to nil around the call
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4416 to `read-key-sequence'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4418 If the user selects a menu item while we are prompting for a key-sequence,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4419 the returned value will be a vector of a single menu-selection event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4420 An error will be signalled if you pass this value to `lookup-key' or a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4421 related function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4423 `read-key-sequence' checks `function-key-map' for function key
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4424 sequences, where they wouldn't conflict with ordinary bindings.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4425 See `function-key-map' for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4426 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4427 (prompt, continue_echo, dont_downcase_last))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4428 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4429 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4430 struct console *con = XCONSOLE (Vselected_console); /* #### correct?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4431 Probably not -- see
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4432 comment in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4433 next-event */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4434 struct command_builder *command_builder =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4435 XCOMMAND_BUILDER (con->command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4436 Lisp_Object result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4437 Lisp_Object event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4438 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4439 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4440 GCPRO1 (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4441
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
4442 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4443 if (!NILP (prompt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4444 CHECK_STRING (prompt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4445 /* else prompt = Fkeymap_prompt (current_buffer->keymap); may GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4446 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4448 if (NILP (continue_echo))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4449 reset_this_command_keys (wrap_console (con), 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4451 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4453 if (!NILP (dont_downcase_last))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4454 specbind (Qretry_undefined_key_binding_unshifted, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4456 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4457 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4458 Fnext_event (event, prompt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4459 /* restore the selected-console damage */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4460 con = event_console_or_selected (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4461 command_builder = XCOMMAND_BUILDER (con->command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4462 if (! command_event_p (event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4463 execute_internal_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4464 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4465 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4466 if (XEVENT (event)->event_type == misc_user_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4467 reset_current_events (command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4468 result = lookup_command_event (command_builder, event, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4469 if (!KEYMAPP (result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4470 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4471 result = current_events_into_vector (command_builder);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4472 reset_key_echo (command_builder, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4473 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4474 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4475 prompt = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4476 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4477 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4479 Vquit_flag = Qnil; /* In case we read a ^G; do not call check_quit() here */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4480 Fdeallocate_event (event);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4481 RETURN_UNGCPRO (unbind_to_1 (speccount, result));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4482 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4484 DEFUN ("this-command-keys", Fthis_command_keys, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4485 Return a vector of the keyboard or mouse button events that were used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4486 to invoke this command. This copies the vector and the events; it is safe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4487 to keep and modify them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4488 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4489 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4490 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4491 Lisp_Object event;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4492 Lisp_Object result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4493 int len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4495 if (NILP (Vthis_command_keys))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4496 return make_vector (0, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4498 len = event_chain_count (Vthis_command_keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4500 result = make_vector (len, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4501 len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4502 EVENT_CHAIN_LOOP (event, Vthis_command_keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4503 XVECTOR_DATA (result)[len++] = Fcopy_event (event, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4504 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4505 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4507 DEFUN ("reset-this-command-lengths", Freset_this_command_lengths, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4508 Used for complicated reasons in `universal-argument-other-key'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4510 `universal-argument-other-key' rereads the event just typed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4511 It then gets translated through `function-key-map'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4512 The translated event gets included in the echo area and in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4513 the value of `this-command-keys' in addition to the raw original event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4514 That is not right.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4516 Calling this function directs the translated event to replace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4517 the original event, so that only one version of the event actually
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
4518 appears in the echo area and in the value of `this-command-keys'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4519 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4520 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4521 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4522 /* #### I don't understand this at all, so currently it does nothing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4523 If there is ever a problem, maybe someone should investigate. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4524 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4525 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4528 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4529 dribble_out_event (Lisp_Object event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4530 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4531 if (NILP (Vdribble_file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4532 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4534 if (XEVENT (event)->event_type == key_press_event &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4535 !XEVENT (event)->event.key.modifiers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4536 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4537 Lisp_Object keysym = XEVENT (event)->event.key.keysym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4538 if (CHARP (XEVENT (event)->event.key.keysym))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4539 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4540 Emchar ch = XCHAR (keysym);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 593
diff changeset
4541 Intbyte str[MAX_EMCHAR_LEN];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4542 Bytecount len = set_charptr_emchar (str, ch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4543 Lstream_write (XLSTREAM (Vdribble_file), str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4544 }
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 814
diff changeset
4545 else if (string_char_length (XSYMBOL (keysym)->name) == 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4546 /* one-char key events are printed with just the key name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4547 Fprinc (keysym, Vdribble_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4548 else if (EQ (keysym, Qreturn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4549 Lstream_putc (XLSTREAM (Vdribble_file), '\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4550 else if (EQ (keysym, Qspace))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4551 Lstream_putc (XLSTREAM (Vdribble_file), ' ');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4552 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4553 Fprinc (event, Vdribble_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4554 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4555 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4556 Fprinc (event, Vdribble_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4557 Lstream_flush (XLSTREAM (Vdribble_file));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4558 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4559
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4560 DEFUN ("open-dribble-file", Fopen_dribble_file, 1, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4561 "FOpen dribble file: ", /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4562 Start writing all keyboard characters to a dribble file called FILENAME.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4563 If FILENAME is nil, close any open dribble file.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4564 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4565 (filename))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4566 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4567 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4568 /* XEmacs change: always close existing dribble file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4569 /* FSFmacs uses FILE *'s here. With lstreams, that's unnecessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4570 if (!NILP (Vdribble_file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4571 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4572 Lstream_close (XLSTREAM (Vdribble_file));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4573 Vdribble_file = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4574 }
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4575 if (!NILP (filename))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4576 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4577 int fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4578
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4579 filename = Fexpand_file_name (filename, Qnil);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4580 fd = qxe_open (XSTRING_DATA (filename),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4581 O_WRONLY | O_TRUNC | O_CREAT | OPEN_BINARY,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4582 CREAT_MODE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4583 if (fd < 0)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4584 report_file_error ("Unable to create dribble file", filename);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4585 Vdribble_file = make_filedesc_output_stream (fd, 0, 0, LSTR_CLOSING);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4586 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4587 Vdribble_file =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4588 make_coding_output_stream
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4589 (XLSTREAM (Vdribble_file),
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
4590 Qescape_quoted, CODING_ENCODE, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4591 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4592 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4593 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4594 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4596
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4597
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4598 DEFUN ("current-event-timestamp", Fcurrent_event_timestamp, 0, 1, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4599 Return the current event timestamp of the window system associated with CONSOLE.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4600 CONSOLE defaults to the selected console if omitted.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4601 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4602 (console))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4603 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4604 struct console *c = decode_console (console);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4605 int tiempo = event_stream_current_event_timestamp (c);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4606
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4607 /* This junk is so that timestamps don't get to be negative, but contain
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4608 as many bits as this particular emacs will allow.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4609 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4610 return make_int (((1L << (VALBITS - 1)) - 1) & tiempo);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4611 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4612
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4613
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4614 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4615 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4616 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4618 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4619 syms_of_event_stream (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4620 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4621 INIT_LRECORD_IMPLEMENTATION (command_builder);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4622 INIT_LRECORD_IMPLEMENTATION (timeout);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4623
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4624 DEFSYMBOL (Qdisabled);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4625 DEFSYMBOL (Qcommand_event_p);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4626
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4627 DEFERROR_STANDARD (Qundefined_keystroke_sequence, Qsyntax_error);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4628 DEFERROR_STANDARD (Qinvalid_key_binding, Qinvalid_state);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4629
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4630 DEFSUBR (Frecent_keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4631 DEFSUBR (Frecent_keys_ring_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4632 DEFSUBR (Fset_recent_keys_ring_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4633 DEFSUBR (Finput_pending_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4634 DEFSUBR (Fenqueue_eval_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4635 DEFSUBR (Fnext_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4636 DEFSUBR (Fnext_command_event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4637 DEFSUBR (Fdiscard_input);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4638 DEFSUBR (Fsit_for);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4639 DEFSUBR (Fsleep_for);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4640 DEFSUBR (Faccept_process_output);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4641 DEFSUBR (Fadd_timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4642 DEFSUBR (Fdisable_timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4643 DEFSUBR (Fadd_async_timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4644 DEFSUBR (Fdisable_async_timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4645 DEFSUBR (Fdispatch_event);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4646 DEFSUBR (Fdispatch_non_command_events);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4647 DEFSUBR (Fread_key_sequence);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4648 DEFSUBR (Fthis_command_keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4649 DEFSUBR (Freset_this_command_lengths);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4650 DEFSUBR (Fopen_dribble_file);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4651 DEFSUBR (Fcurrent_event_timestamp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4652
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4653 DEFSYMBOL (Qpre_command_hook);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4654 DEFSYMBOL (Qpost_command_hook);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4655 DEFSYMBOL (Qunread_command_events);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4656 DEFSYMBOL (Qunread_command_event);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4657 DEFSYMBOL (Qpre_idle_hook);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4658 DEFSYMBOL (Qhandle_pre_motion_command);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4659 DEFSYMBOL (Qhandle_post_motion_command);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4660 DEFSYMBOL (Qretry_undefined_key_binding_unshifted);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4661 DEFSYMBOL (Qauto_show_make_point_visible);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4662
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4663 DEFSYMBOL (Qself_insert_defer_undo);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 535
diff changeset
4664 DEFSYMBOL (Qcancel_mode_internal);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4665 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4667 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4668 reinit_vars_of_event_stream (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4669 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4670 recent_keys_ring_index = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4671 recent_keys_ring_size = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4672 num_input_chars = 0;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
4673 Vtimeout_free_list = make_lcrecord_list (sizeof (Lisp_Timeout),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4674 &lrecord_timeout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4675 staticpro_nodump (&Vtimeout_free_list);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4676 Vcommand_builder_free_list =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4677 make_lcrecord_list (sizeof (struct command_builder),
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4678 &lrecord_command_builder);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4679 staticpro_nodump (&Vcommand_builder_free_list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4680 the_low_level_timeout_blocktype =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4681 Blocktype_new (struct low_level_timeout_blocktype);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4682 something_happened = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4683 recursive_sit_for = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4684 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4685
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4686 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4687 vars_of_event_stream (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4688 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4689 reinit_vars_of_event_stream ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4690 Vrecent_keys_ring = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4691 staticpro (&Vrecent_keys_ring);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4692
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4693 Vthis_command_keys = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4694 staticpro (&Vthis_command_keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4695 Vthis_command_keys_tail = Qnil;
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 446
diff changeset
4696 dump_add_root_object (&Vthis_command_keys_tail);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4698 command_event_queue = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4699 staticpro (&command_event_queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4700 command_event_queue_tail = Qnil;
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 446
diff changeset
4701 dump_add_root_object (&command_event_queue_tail);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4703 Vlast_selected_frame = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4704 staticpro (&Vlast_selected_frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4706 pending_timeout_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4707 staticpro (&pending_timeout_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4708
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4709 pending_async_timeout_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710 staticpro (&pending_async_timeout_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4712 last_point_position_buffer = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4713 staticpro (&last_point_position_buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4715 DEFVAR_LISP ("echo-keystrokes", &Vecho_keystrokes /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4716 *Nonzero means echo unfinished commands after this many seconds of pause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718 Vecho_keystrokes = make_int (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720 DEFVAR_INT ("auto-save-interval", &auto_save_interval /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4721 *Number of keyboard input characters between auto-saves.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4722 Zero means disable autosaving due to number of characters typed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4723 See also the variable `auto-save-timeout'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4724 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4725 auto_save_interval = 300;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 DEFVAR_LISP ("pre-command-hook", &Vpre_command_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728 Function or functions to run before every command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729 This may examine the `this-command' variable to find out what command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730 is about to be run, or may change it to cause a different command to run.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731 Function on this hook must be careful to avoid signalling errors!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4732 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4733 Vpre_command_hook = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735 DEFVAR_LISP ("post-command-hook", &Vpost_command_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4736 Function or functions to run after every command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4737 This may examine the `this-command' variable to find out what command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4738 was just executed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4739 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4740 Vpost_command_hook = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 DEFVAR_LISP ("pre-idle-hook", &Vpre_idle_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 Normal hook run when XEmacs it about to be idle.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4744 This occurs whenever it is going to block, waiting for an event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4745 This generally happens as a result of a call to `next-event',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4746 `next-command-event', `sit-for', `sleep-for', `accept-process-output',
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4747 or `x-get-selection'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4748 Errors running the hook are caught and ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4749 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4750 Vpre_idle_hook = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4752 DEFVAR_BOOL ("focus-follows-mouse", &focus_follows_mouse /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4753 *Variable to control XEmacs behavior with respect to focus changing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4754 If this variable is set to t, then XEmacs will not gratuitously change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4755 the keyboard focus. XEmacs cannot in general detect when this mode is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4756 used by the window manager, so it is up to the user to set it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4757 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4758 focus_follows_mouse = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4759
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4760 DEFVAR_LISP ("last-command-event", &Vlast_command_event /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4761 Last keyboard or mouse button event that was part of a command. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4762 variable is off limits: you may not set its value or modify the event that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4763 is its value, as it is destructively modified by `read-key-sequence'. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4764 you want to keep a pointer to this value, you must use `copy-event'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4765 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4766 Vlast_command_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4768 DEFVAR_LISP ("last-command-char", &Vlast_command_char /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4769 If the value of `last-command-event' is a keyboard event, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4770 this is the nearest ASCII equivalent to it. This is the value that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4771 `self-insert-command' will put in the buffer. Remember that there is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4772 NOT a 1:1 mapping between keyboard events and ASCII characters: the set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4773 of keyboard events is much larger, so writing code that examines this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4774 variable to determine what key has been typed is bad practice, unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4775 you are certain that it will be one of a small set of characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4776 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4777 Vlast_command_char = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4778
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4779 DEFVAR_LISP ("last-input-event", &Vlast_input_event /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4780 Last keyboard or mouse button event received. This variable is off
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4781 limits: you may not set its value or modify the event that is its value, as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4782 it is destructively modified by `next-event'. If you want to keep a pointer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4783 to this value, you must use `copy-event'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4784 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 Vlast_input_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4787 DEFVAR_LISP ("current-mouse-event", &Vcurrent_mouse_event /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4788 The mouse-button event which invoked this command, or nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4789 This is usually what `(interactive "e")' returns.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4790 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4791 Vcurrent_mouse_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4793 DEFVAR_LISP ("last-input-char", &Vlast_input_char /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794 If the value of `last-input-event' is a keyboard event, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4795 this is the nearest ASCII equivalent to it. Remember that there is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796 NOT a 1:1 mapping between keyboard events and ASCII characters: the set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4797 of keyboard events is much larger, so writing code that examines this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4798 variable to determine what key has been typed is bad practice, unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4799 you are certain that it will be one of a small set of characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4800 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801 Vlast_input_char = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 DEFVAR_LISP ("last-input-time", &Vlast_input_time /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 The time (in seconds since Jan 1, 1970) of the last-command-event,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805 represented as a cons of two 16-bit integers. This is destructively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4806 modified, so copy it if you want to keep it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4807 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4808 Vlast_input_time = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4809
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4810 DEFVAR_LISP ("last-command-event-time", &Vlast_command_event_time /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4811 The time (in seconds since Jan 1, 1970) of the last-command-event,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4812 represented as a list of three integers. The first integer contains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4813 the most significant 16 bits of the number of seconds, and the second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4814 integer contains the least significant 16 bits. The third integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4815 contains the remainder number of microseconds, if the current system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 supports microsecond clock resolution. This list is destructively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4817 modified, so copy it if you want to keep it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4818 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4819 Vlast_command_event_time = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4821 DEFVAR_LISP ("unread-command-events", &Vunread_command_events /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4822 List of event objects to be read as next command input events.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4823 This can be used to simulate the receipt of events from the user.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824 Normally this is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4825 Events are removed from the front of this list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4826 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4827 Vunread_command_events = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4829 DEFVAR_LISP ("unread-command-event", &Vunread_command_event /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4830 Obsolete. Use `unread-command-events' instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4831 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832 Vunread_command_event = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4834 DEFVAR_LISP ("last-command", &Vlast_command /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4835 The last command executed. Normally a symbol with a function definition,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4836 but can be whatever was found in the keymap, or whatever the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4837 `this-command' was set to by that command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839 Vlast_command = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841 DEFVAR_LISP ("this-command", &Vthis_command /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4842 The command now being executed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4843 The command can set this variable; whatever is put here
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4844 will be in `last-command' during the following command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4845 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4846 Vthis_command = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4847
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4848 DEFVAR_LISP ("last-command-properties", &Vlast_command_properties /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4849 Value of `this-command-properties' for the last command.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4850 Used by commands to help synchronize consecutive commands, in preference
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4851 to looking at `last-command' directly.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4852 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4853 Vlast_command_properties = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4854
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4855 DEFVAR_LISP ("this-command-properties", &Vthis_command_properties /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4856 Properties set by the current command.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4857 At the beginning of each command, the current value of this variable is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4858 copied to `last-command-properties', and then it is set to nil. Use `putf'
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4859 to add properties to this variable. Commands should use this to communicate
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4860 with pre/post-command hooks, subsequent commands, wrapping commands, etc.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4861 in preference to looking at and/or setting `this-command'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4862 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4863 Vthis_command_properties = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4864
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4865 DEFVAR_LISP ("help-char", &Vhelp_char /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4866 Character to recognize as meaning Help.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4867 When it is read, do `(eval help-form)', and display result if it's a string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4868 If the value of `help-form' is nil, this char can be read normally.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4869 This can be any form recognized as a single key specifier.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4870 The help-char cannot be a negative number in XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4871 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4872 Vhelp_char = make_char (8); /* C-h */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4874 DEFVAR_LISP ("help-form", &Vhelp_form /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4875 Form to execute when character help-char is read.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4876 If the form returns a string, that string is displayed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4877 If `help-form' is nil, the help char is not recognized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4878 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4879 Vhelp_form = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4881 DEFVAR_LISP ("prefix-help-command", &Vprefix_help_command /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4882 Command to run when `help-char' character follows a prefix key.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4883 This command is used only when there is no actual binding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4884 for that character after that prefix key.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4885 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4886 Vprefix_help_command = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4888 DEFVAR_CONST_LISP ("keyboard-translate-table", &Vkeyboard_translate_table /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4889 Hash table used as translate table for keyboard input.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4890 Use `keyboard-translate' to portably add entries to this table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4891 Each key-press event is looked up in this table as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4893 -- If an entry maps a symbol to a symbol, then a key-press event whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4894 keysym is the former symbol (with any modifiers at all) gets its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4895 keysym changed and its modifiers left alone. This is useful for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4896 dealing with non-standard X keyboards, such as the grievous damage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4897 that Sun has inflicted upon the world.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4898 -- If an entry maps a symbol to a character, then a key-press event
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4899 whose keysym is the former symbol (with any modifiers at all) gets
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4900 changed into a key-press event matching the latter character, and the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4901 resulting modifiers are the union of the original and new modifiers.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4902 -- If an entry maps a character to a character, then a key-press event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4903 matching the former character gets converted to a key-press event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4904 matching the latter character. This is useful on ASCII terminals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4905 for (e.g.) making C-\\ look like C-s, to get around flow-control
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4906 problems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4907 -- If an entry maps a character to a symbol, then a key-press event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4908 matching the character gets converted to a key-press event whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4909 keysym is the given symbol and which has no modifiers.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4910
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4911 Here's an example: This makes typing parens and braces easier by rerouting
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4912 their positions to eliminate the need to use the Shift key.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4913
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4914 (keyboard-translate ?[ ?()
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4915 (keyboard-translate ?] ?))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4916 (keyboard-translate ?{ ?[)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4917 (keyboard-translate ?} ?])
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4918 (keyboard-translate 'f11 ?{)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4919 (keyboard-translate 'f12 ?})
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4920 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4922 DEFVAR_LISP ("retry-undefined-key-binding-unshifted",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4923 &Vretry_undefined_key_binding_unshifted /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4924 If a key-sequence which ends with a shifted keystroke is undefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4925 and this variable is non-nil then the command lookup is retried again
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4926 with the last key unshifted. (e.g. C-X C-F would be retried as C-X C-f.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4927 If lookup still fails, a normal error is signalled. In general,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4928 you should *bind* this, not set it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4929 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4930 Vretry_undefined_key_binding_unshifted = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4931
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4932 DEFVAR_BOOL ("modifier-keys-are-sticky", &modifier_keys_are_sticky /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4933 *Non-nil makes modifier keys sticky.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4934 This means that you can release the modifier key before pressing down
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4935 the key that you wish to be modified. Although this is non-standard
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4936 behavior, it is recommended because it reduces the strain on your hand,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4937 thus reducing the incidence of the dreaded Emacs-pinky syndrome.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4938
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4939 Modifier keys are sticky within the inverval specified by
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4940 `modifier-keys-sticky-time'.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4941 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4942 modifier_keys_are_sticky = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4943
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4944 DEFVAR_LISP ("modifier-keys-sticky-time", &Vmodifier_keys_sticky_time /*
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4945 *Modifier keys are sticky within this many milliseconds.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4946 If you don't want modifier keys sticking to be bounded, set this to
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4947 non-integer value.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4948
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4949 This variable has no effect when `modifier-keys-are-sticky' is nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4950 Currently only implemented under X Window System.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4951 */ );
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4952 Vmodifier_keys_sticky_time = make_int (500);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
4953
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4954 #ifdef MULE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4955 DEFVAR_LISP ("composed-character-default-binding",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4956 &Vcomposed_character_default_binding /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4957 The default keybinding to use for key events from composed input.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4958 Window systems frequently have ways to allow the user to compose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4959 single characters in a language using multiple keystrokes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4960 XEmacs sees these as single character keypress events.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4961 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4962 Vcomposed_character_default_binding = Qself_insert_command;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
4963 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4965 Vcontrolling_terminal = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4966 staticpro (&Vcontrolling_terminal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4967
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4968 Vdribble_file = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4969 staticpro (&Vdribble_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4971 #ifdef DEBUG_XEMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4972 DEFVAR_INT ("debug-emacs-events", &debug_emacs_events /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4973 If non-zero, display debug information about Emacs events that XEmacs sees.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4974 Information is displayed on stderr.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4976 Before the event, the source of the event is displayed in parentheses,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4977 and is one of the following:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979 \(real) A real event from the window system or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4980 terminal driver, as far as XEmacs can tell.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4982 \(keyboard macro) An event generated from a keyboard macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4983
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4984 \(unread-command-events) An event taken from `unread-command-events'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4986 \(unread-command-event) An event taken from `unread-command-event'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988 \(command event queue) An event taken from an internal queue.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4989 Events end up on this queue when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4990 `enqueue-eval-event' is called or when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4991 user or eval events are received while
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4992 XEmacs is blocking (e.g. in `sit-for',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4993 `sleep-for', or `accept-process-output',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4994 or while waiting for the reply to an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4995 X selection).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4996
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4997 \(->keyboard-translate-table) The result of an event translated through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4998 keyboard-translate-table. Note that in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4999 this case, two events are printed even
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5000 though only one is really generated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5002 \(SIGINT) A faked C-g resulting when XEmacs receives
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5003 a SIGINT (e.g. C-c was pressed in XEmacs'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5004 controlling terminal or the signal was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5005 explicitly sent to the XEmacs process).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5006 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5007 debug_emacs_events = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5008 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5010 DEFVAR_BOOL ("inhibit-input-event-recording", &inhibit_input_event_recording /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5011 Non-nil inhibits recording of input-events to recent-keys ring.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5012 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5013 inhibit_input_event_recording = 0;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 757
diff changeset
5014
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5015 Vkeyboard_translate_table =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5016 make_lisp_hash_table (100, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5017 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5019 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5020 init_event_stream (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5021 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
5022 /* Normally we don't initialize the event stream when running a bare
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
5023 temacs (the check for initialized) because it may do various things
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
5024 (e.g. under Xt) that we don't want any traces of in a dumped xemacs.
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
5025 However, sometimes we need to process events in a bare temacs (in
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
5026 particular, when make-docfile.el is executed); so we initialize as
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 800
diff changeset
5027 necessary in check_event_stream_ok(). */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5028 if (initialized)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5029 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5030 #ifdef HAVE_UNIXOID_EVENT_LOOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5031 init_event_unixoid ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5032 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5033 #ifdef HAVE_X_WINDOWS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5034 if (!strcmp (display_use, "x"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5035 init_event_Xt_late ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5036 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5037 #endif
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 458
diff changeset
5038 #ifdef HAVE_GTK
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 458
diff changeset
5039 if (!strcmp (display_use, "gtk"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 458
diff changeset
5040 init_event_gtk_late ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 458
diff changeset
5041 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 458
diff changeset
5042 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5043 #ifdef HAVE_MS_WINDOWS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5044 if (!strcmp (display_use, "mswindows"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5045 init_event_mswindows_late ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5046 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5047 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5048 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5049 /* For TTY's, use the Xt event loop if we can; it allows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5050 us to later open an X connection. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5051 #if defined (HAVE_MS_WINDOWS) && (!defined (HAVE_TTY) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5052 || (defined (HAVE_MSG_SELECT) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5053 && !defined (DEBUG_TTY_EVENT_STREAM)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 init_event_mswindows_late ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5055 #elif defined (HAVE_X_WINDOWS) && !defined (DEBUG_TTY_EVENT_STREAM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5056 init_event_Xt_late ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057 #elif defined (HAVE_TTY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058 init_event_tty_late ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5060 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 init_interrupts_late ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5062 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5063 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5066 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067 useful testcases for v18/v19 compatibility:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5069 (defun foo ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5070 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5071 (setq unread-command-event (character-to-event ?A (allocate-event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5072 (setq x (list (read-char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5073 ; (read-key-sequence "") ; try it with and without this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5074 last-command-char last-input-char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5075 (recent-keys) (this-command-keys))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5076 (global-set-key "\^Q" 'foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5078 without the read-key-sequence:
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5079 ^Q ==> (?A ?\^Q ?A [... ^Q] [^Q])
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5080 ^U^U^Q ==> (?A ?\^Q ?A [... ^U ^U ^Q] [^U ^U ^Q])
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5081 ^U^U^U^G^Q ==> (?A ?\^Q ?A [... ^U ^U ^U ^G ^Q] [^Q])
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5083 with the read-key-sequence:
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5084 ^Qb ==> (?A [b] ?\^Q ?b [... ^Q b] [b])
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5085 ^U^U^Qb ==> (?A [b] ?\^Q ?b [... ^U ^U ^Q b] [b])
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5086 ^U^U^U^G^Qb ==> (?A [b] ?\^Q ?b [... ^U ^U ^U ^G ^Q b] [b])
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5088 ;the evi-mode command "4dlj.j.j.j.j.j." is also a good testcase (gag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5090 ;(setq x (list (read-char) quit-flag))^J^G
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5091 ;(let ((inhibit-quit t)) (setq x (list (read-char) quit-flag)))^J^G
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5092 ;for BOTH, x should get set to (7 t), but no result should be printed.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5093 ;; #### According to the doc of quit-flag, second test should return
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5094 ;; (?\^G nil). Accidentaly XEmacs returns correct value. However,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5095 ;; XEmacs 21.1.12 and 21.2.36 both fails on first test.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5096
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5097 ;also do this: make two frames, one viewing "*scratch*", the other "foo".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5098 ;in *scratch*, type (sit-for 20)^J
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5099 ;wait a couple of seconds, move cursor to foo, type "a"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5100 ;a should be inserted in foo. Cursor highlighting should not change in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5101 ;the meantime.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5103 ;do it with sleep-for. move cursor into foo, then back into *scratch*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5104 ;before typing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5105 ;repeat also with (accept-process-output nil 20)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5107 ;make sure ^G aborts sit-for, sleep-for and accept-process-output:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5109 (defun tst ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5110 (list (condition-case c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5111 (sleep-for 20)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5112 (quit c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5113 (read-char)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5114
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5115 (tst)^Ja^G ==> ((quit) ?a) with no signal
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5116 (tst)^J^Ga ==> ((quit) ?a) with no signal
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5117 (tst)^Jabc^G ==> ((quit) ?a) with no signal, and "bc" inserted in buffer
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5119 ; with sit-for only do the 2nd test.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5120 ; Do all 3 tests with (accept-process-output nil 20)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5122 Do this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5123 (setq enable-recursive-minibuffers t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5124 minibuffer-max-depth nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5125 ESC ESC ESC ESC - there are now two minibuffers active
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5126 C-g C-g C-g - there should be active 0, not 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5127 Similarly:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5128 C-x C-f ~ / ? - wait for "Making completion list..." to display
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5129 C-g - wait for "Quit" to display
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5130 C-g - minibuffer should not be active
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5131 however C-g before "Quit" is displayed should leave minibuffer active.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5133 ;do it all in both v18 and v19 and make sure all results are the same.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5134 ;all of these cases matter a lot, but some in quite subtle ways.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5135 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5137 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5138 Additional test cases for accept-process-output, sleep-for, sit-for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5139 Be sure you do all of the above checking for C-g and focus, too!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5141 ; Make sure that timer handlers are run during, not after sit-for:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5142 (defun timer-check ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5143 (add-timeout 2 '(lambda (ignore) (message "timer ran")) nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5144 (sit-for 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5145 (message "after sit-for"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5147 ; The first message should appear after 2 seconds, and the final message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5148 ; 3 seconds after that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5149 ; repeat above test with (sleep-for 5) and (accept-process-output nil 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5153 ; Make sure that process filters are run during, not after sit-for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5154 (defun fubar ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5155 (message "sit-for = %s" (sit-for 30)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5156 (add-hook 'post-command-hook 'fubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5158 ; Now type M-x shell RET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5159 ; wait for the shell prompt then send: ls RET
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5160 ; the output of ls should fill immediately, and not wait 30 seconds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5162 ; repeat above test with (sleep-for 30) and (accept-process-output nil 30)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5166 ; Make sure that recursive invocations return immediately:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5167 (defmacro test-diff-time (start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5168 `(+ (* (- (car ,end) (car ,start)) 65536.0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5169 (- (cadr ,end) (cadr ,start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5170 (/ (- (caddr ,end) (caddr ,start)) 1000000.0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5172 (defun testee (ignore)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5173 (sit-for 10))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5175 (defun test-them ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5176 (let ((start (current-time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5177 end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5178 (add-timeout 2 'testee nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5179 (sit-for 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5180 (add-timeout 2 'testee nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5181 (sleep-for 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5182 (add-timeout 2 'testee nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5183 (accept-process-output nil 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5184 (setq end (current-time))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5185 (test-diff-time start end)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5187 (test-them) should sit for 15 seconds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5188 Repeat with testee set to sleep-for and accept-process-output.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5189 These should each delay 36 seconds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5191 */