annotate src/blockinput.h @ 107777:13c077500eb3

2010-04-04 John Wiegley <jwiegley@gmail.com> * ido.el (ido-use-virtual-buffers): New variable to indicate whether "virtual buffer" support is enabled for IDO. Essentially it works as follows: Say you are visiting a file and the buffer gets cleaned up by mignight.el. Later, you want to switch to that buffer, but find it's no longer open. With virtual buffers enabled, the buffer name stays in the buffer list (using the ido-virtual face, and always at the end), and if you select it, it opens the file back up again. This allows you to think less about whether recently opened files are still open or not. Most of the time you can quit Emacs, restart, and then switch to a file buffer that was previously open as if it still were. NOTE: This feature has been present in iswitchb for several years now, and I'm porting the same logic to IDO. (ido-virtual): Face used to indicate virtual buffers in the list. (ido-buffer-internal): If a buffer is chosen, and no such buffer exists, but a virtual buffer of that name does (which would be why it was in the list), recreate the buffer by reopening the file. (ido-make-buffer-list): If virtual buffers are being used, call `ido-add-virtual-buffers-to-list' before the make list hook. (ido-virtual-buffers): New variable which contains a copy of the current contents of the `recentf-list', albeit pared down for the sake of speed, and with proper faces applied. (ido-add-virtual-buffers-to-list): Using the `recentf-list', create a list of "virtual buffers" to present to the user in addition to the currently open set. Note that this logic could get rather slow if that list is too large. With the default `recentf-max-saved-items' of 200, there is little speed penalty.
author jwiegley@gmail.com
date Sun, 04 Apr 2010 02:55:19 -0400
parents 1d1d5d9bd884
children 5842e8fabe06 376148b31b5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2437
diff changeset
1 /* blockinput.h - interface to blocking complicated interrupt-driven input.
75227
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
2 Copyright (C) 1989, 1993, 2001, 2002, 2003, 2004,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 101739
diff changeset
3 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5 This file is part of GNU Emacs.
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6
94994
29adfc9354e7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
7 GNU Emacs is free software: you can redistribute it and/or modify
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
94994
29adfc9354e7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
9 the Free Software Foundation, either version 3 of the License, or
29adfc9354e7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
10 (at your option) any later version.
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 GNU General Public License for more details.
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
94994
29adfc9354e7 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 79759
diff changeset
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19
29926
5a1dca465b50 Protect against multiple inclusion. Include
Dave Love <fx@gnu.org>
parents: 27426
diff changeset
20 #ifndef EMACS_BLOCKINPUT_H
5a1dca465b50 Protect against multiple inclusion. Include
Dave Love <fx@gnu.org>
parents: 27426
diff changeset
21 #define EMACS_BLOCKINPUT_H
5a1dca465b50 Protect against multiple inclusion. Include
Dave Love <fx@gnu.org>
parents: 27426
diff changeset
22
5a1dca465b50 Protect against multiple inclusion. Include
Dave Love <fx@gnu.org>
parents: 27426
diff changeset
23 #include "atimer.h"
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 /* When Emacs is using signal-driven input, the processing of those
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 input signals can get pretty hairy. For example, when Emacs is
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 running under X windows, handling an input signal can entail
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28 retrieving events from the X event queue, or making other X calls.
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 If an input signal occurs while Emacs is in the midst of some
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 non-reentrant code, and the signal processing invokes that same
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 code, we lose. For example, malloc and the Xlib functions aren't
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 usually re-entrant, and both are used by the X input signal handler
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 - if we try to process an input signal in the midst of executing
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 any of these functions, we'll lose.
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37 To avoid this, we make the following requirements:
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39 * Everyone must evaluate BLOCK_INPUT before entering these functions,
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40 and then call UNBLOCK_INPUT after performing them. Calls
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 BLOCK_INPUT and UNBLOCK_INPUT may be nested.
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 * Any complicated interrupt handling code should test
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 29926
diff changeset
44 interrupt_input_blocked, and put off its work until later.
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 * If the interrupt handling code wishes, it may set
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 interrupt_input_pending to a non-zero value. If that flag is set
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 when input becomes unblocked, UNBLOCK_INPUT will send a new SIGIO. */
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49
75407
205d5c1af245 (interrupt_input_blocked): Declare volatile.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 75227
diff changeset
50 extern volatile int interrupt_input_blocked;
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 /* Nonzero means an input interrupt has arrived
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 during the current critical section. */
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 extern int interrupt_input_pending;
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55
27426
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
56
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
57 /* Non-zero means asynchronous timers should be run when input is
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
58 unblocked. */
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
59
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
60 extern int pending_atimers;
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
61
96675
d45acf0c8d23 merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents: 94994
diff changeset
62
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 /* Begin critical section. */
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64 #define BLOCK_INPUT (interrupt_input_blocked++)
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65
2721
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
66 /* End critical section.
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
67
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
68 If doing signal-driven input, and a signal came in when input was
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
69 blocked, reinvoke the signal handler now to deal with it.
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
70
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
71 We used to have two possible definitions of this macro - one for
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
72 when SIGIO was #defined, and one for when it wasn't; when SIGIO
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
73 wasn't #defined, we wouldn't bother to check if we should re-invoke
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
74 the signal handler. But that doesn't work very well; some of the
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
75 files which use this macro don't #include the right files to get
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
76 SIGIO.
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
77
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
78 So, we always test interrupt_input_pending now; that's not too
ca5cb6cafc40 * blockinput.h (UNBLOCK_INPUT): We cannot assume that SIGIO is
Jim Blandy <jimb@redhat.com>
parents: 2479
diff changeset
79 expensive, and it'll never get set if we don't need to resignal. */
27426
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
80
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
81 #define UNBLOCK_INPUT \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
82 do \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
83 { \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
84 --interrupt_input_blocked; \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
85 if (interrupt_input_blocked == 0) \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
86 { \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
87 if (interrupt_input_pending) \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
88 reinvoke_input_signal (); \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
89 if (pending_atimers) \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
90 do_pending_atimers (); \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
91 } \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
92 else if (interrupt_input_blocked < 0) \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
93 abort (); \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
94 } \
e28edb0e4233 (pending_atimers): Add extern declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 21796
diff changeset
95 while (0)
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96
60416
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
97 /* Undo any number of BLOCK_INPUT calls,
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
98 and also reinvoke any pending signal. */
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
99
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
100 #define TOTALLY_UNBLOCK_INPUT \
60481
335c6a2f0c12 (TOTALLY_UNBLOCK_INPUT): Avoid dangling else.
Kim F. Storm <storm@cua.dk>
parents: 60474
diff changeset
101 do if (interrupt_input_blocked != 0) \
60416
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
102 { \
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
103 interrupt_input_blocked = 1; \
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
104 UNBLOCK_INPUT; \
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
105 } \
60481
335c6a2f0c12 (TOTALLY_UNBLOCK_INPUT): Avoid dangling else.
Kim F. Storm <storm@cua.dk>
parents: 60474
diff changeset
106 while (0)
60416
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
107
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
108 /* Undo any number of BLOCK_INPUT calls down to level LEVEL,
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
109 and also (if the level is now 0) reinvoke any pending signal. */
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
110
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
111 #define UNBLOCK_INPUT_TO(LEVEL) \
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
112 do \
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
113 { \
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
114 interrupt_input_blocked = (LEVEL) + 1; \
60474
3bb3556e7af0 (UNBLOCK_INPUT_TO): Always call UNBLOCK_INPUT.
Andreas Schwab <schwab@suse.de>
parents: 60416
diff changeset
115 UNBLOCK_INPUT; \
60416
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
116 } \
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
117 while (0)
306f7ce8d80d (UNBLOCK_INPUT_TO): New macro.
Richard M. Stallman <rms@gnu.org>
parents: 56135
diff changeset
118
2437
290a7be0d392 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119 #define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
21515
fb4c986db0e2 Add more prototypes.
Andreas Schwab <schwab@suse.de>
parents: 14186
diff changeset
120
55658
0e26a0be1ee5 (INPUT_BLOCKED_P): New macro.
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
121 /* In critical section ? */
0e26a0be1ee5 (INPUT_BLOCKED_P): New macro.
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
122 #define INPUT_BLOCKED_P (interrupt_input_blocked > 0)
0e26a0be1ee5 (INPUT_BLOCKED_P): New macro.
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
123
21515
fb4c986db0e2 Add more prototypes.
Andreas Schwab <schwab@suse.de>
parents: 14186
diff changeset
124 /* Defined in keyboard.c */
21796
f7ca88e90856 (reinvoke_input_signal): Don't use prototype decl.
Richard M. Stallman <rms@gnu.org>
parents: 21515
diff changeset
125 /* Don't use a prototype here; it causes trouble in some files. */
f7ca88e90856 (reinvoke_input_signal): Don't use prototype decl.
Richard M. Stallman <rms@gnu.org>
parents: 21515
diff changeset
126 extern void reinvoke_input_signal ();
29926
5a1dca465b50 Protect against multiple inclusion. Include
Dave Love <fx@gnu.org>
parents: 27426
diff changeset
127
5a1dca465b50 Protect against multiple inclusion. Include
Dave Love <fx@gnu.org>
parents: 27426
diff changeset
128 #endif /* EMACS_BLOCKINPUT_H */
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
129
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
130 /* arch-tag: 51a9ec86-945a-4966-8f04-2d1341250e03
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
131 (do not change this comment) */