diff options
| author | YAMAMOTO Mitsuharu | 2006-12-14 08:41:46 +0000 |
|---|---|---|
| committer | YAMAMOTO Mitsuharu | 2006-12-14 08:41:46 +0000 |
| commit | 23479b40da61fdf88d7bad75e900ba4a7db61dfd (patch) | |
| tree | 87f2c44ee0dec2d922daa06fcc702eeb4d24d73e /src | |
| parent | 511268f5502a375895b5428966e45c125428fd8e (diff) | |
| download | emacs-23479b40da61fdf88d7bad75e900ba4a7db61dfd.tar.gz emacs-23479b40da61fdf88d7bad75e900ba4a7db61dfd.zip | |
(make_lispy_event): Use find_user_signal_name.
(read_avail_input): Store pending user signal events.
(struct user_signal_info): New struct.
(user_signals): New variable.
(add_user_signal, store_user_signal_events find_user_signal_name):
New functions.
(handle_user_signal): Move function from emacs.c. Don't store
USER_SIGNAL_EVENT here, but increment number of pending signals.
Diffstat (limited to 'src')
| -rw-r--r-- | src/keyboard.c | 156 |
1 files changed, 143 insertions, 13 deletions
diff --git a/src/keyboard.c b/src/keyboard.c index 01c4d181f66..2d5e419149f 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -699,6 +699,9 @@ static SIGTYPE interrupt_signal P_ ((int signalnum)); | |||
| 699 | static void timer_start_idle P_ ((void)); | 699 | static void timer_start_idle P_ ((void)); |
| 700 | static void timer_stop_idle P_ ((void)); | 700 | static void timer_stop_idle P_ ((void)); |
| 701 | static void timer_resume_idle P_ ((void)); | 701 | static void timer_resume_idle P_ ((void)); |
| 702 | static SIGTYPE handle_user_signal P_ ((int)); | ||
| 703 | static char *find_user_signal_name P_ ((int)); | ||
| 704 | static int store_user_signal_events P_ ((void)); | ||
| 702 | 705 | ||
| 703 | /* Nonzero means don't try to suspend even if the operating system seems | 706 | /* Nonzero means don't try to suspend even if the operating system seems |
| 704 | to support it. */ | 707 | to support it. */ |
| @@ -5948,20 +5951,16 @@ make_lispy_event (event) | |||
| 5948 | 5951 | ||
| 5949 | case USER_SIGNAL_EVENT: | 5952 | case USER_SIGNAL_EVENT: |
| 5950 | /* A user signal. */ | 5953 | /* A user signal. */ |
| 5951 | switch (event->code) | 5954 | if (event->code == 0) |
| 5955 | return Qsignal; | ||
| 5956 | else | ||
| 5952 | { | 5957 | { |
| 5953 | case 0: | 5958 | char *name = find_user_signal_name (event->code); |
| 5954 | return Qsignal; | 5959 | |
| 5955 | #ifdef SIGUSR1 | 5960 | if (name) |
| 5956 | case SIGUSR1: | 5961 | return intern (name); |
| 5957 | return intern ("usr1"); | 5962 | else |
| 5958 | #endif | 5963 | return make_number (event->code); |
| 5959 | #ifdef SIGUSR2 | ||
| 5960 | case SIGUSR2: | ||
| 5961 | return intern ("usr2"); | ||
| 5962 | #endif | ||
| 5963 | default: | ||
| 5964 | return make_number (event->code); | ||
| 5965 | } | 5964 | } |
| 5966 | 5965 | ||
| 5967 | case SAVE_SESSION_EVENT: | 5966 | case SAVE_SESSION_EVENT: |
| @@ -6799,6 +6798,10 @@ read_avail_input (expected) | |||
| 6799 | register int i; | 6798 | register int i; |
| 6800 | int nread = 0; | 6799 | int nread = 0; |
| 6801 | 6800 | ||
| 6801 | /* Store pending user signal events, if any. */ | ||
| 6802 | if (store_user_signal_events ()) | ||
| 6803 | expected = 0; | ||
| 6804 | |||
| 6802 | if (read_socket_hook) | 6805 | if (read_socket_hook) |
| 6803 | { | 6806 | { |
| 6804 | int nr; | 6807 | int nr; |
| @@ -7022,6 +7025,133 @@ reinvoke_input_signal () | |||
| 7022 | 7025 | ||
| 7023 | 7026 | ||
| 7024 | 7027 | ||
| 7028 | /* User signal events. */ | ||
| 7029 | |||
| 7030 | struct user_signal_info | ||
| 7031 | { | ||
| 7032 | /* Signal number. */ | ||
| 7033 | int sig; | ||
| 7034 | |||
| 7035 | /* Name of the signal. */ | ||
| 7036 | char *name; | ||
| 7037 | |||
| 7038 | /* Number of pending signals. */ | ||
| 7039 | int npending; | ||
| 7040 | |||
| 7041 | struct user_signal_info *next; | ||
| 7042 | }; | ||
| 7043 | |||
| 7044 | /* List of user signals. */ | ||
| 7045 | static struct user_signal_info *user_signals = NULL; | ||
| 7046 | |||
| 7047 | void | ||
| 7048 | add_user_signal (sig, name) | ||
| 7049 | int sig; | ||
| 7050 | const char *name; | ||
| 7051 | { | ||
| 7052 | struct user_signal_info *p; | ||
| 7053 | |||
| 7054 | for (p = user_signals; p; p = p->next) | ||
| 7055 | if (p->sig == sig) | ||
| 7056 | /* Already added. */ | ||
| 7057 | return; | ||
| 7058 | |||
| 7059 | p = xmalloc (sizeof (struct user_signal_info)); | ||
| 7060 | p->sig = sig; | ||
| 7061 | p->name = xstrdup (name); | ||
| 7062 | p->npending = 0; | ||
| 7063 | p->next = user_signals; | ||
| 7064 | user_signals = p; | ||
| 7065 | |||
| 7066 | signal (sig, handle_user_signal); | ||
| 7067 | } | ||
| 7068 | |||
| 7069 | static SIGTYPE | ||
| 7070 | handle_user_signal (sig) | ||
| 7071 | int sig; | ||
| 7072 | { | ||
| 7073 | int old_errno = errno; | ||
| 7074 | struct user_signal_info *p; | ||
| 7075 | |||
| 7076 | #if defined (USG) && !defined (POSIX_SIGNALS) | ||
| 7077 | /* USG systems forget handlers when they are used; | ||
| 7078 | must reestablish each time */ | ||
| 7079 | signal (sig, handle_user_signal); | ||
| 7080 | #endif | ||
| 7081 | |||
| 7082 | SIGNAL_THREAD_CHECK (sig); | ||
| 7083 | |||
| 7084 | for (p = user_signals; p; p = p->next) | ||
| 7085 | if (p->sig == sig) | ||
| 7086 | { | ||
| 7087 | p->npending++; | ||
| 7088 | #ifdef SIGIO | ||
| 7089 | if (interrupt_input) | ||
| 7090 | kill (getpid (), SIGIO); | ||
| 7091 | else | ||
| 7092 | #endif | ||
| 7093 | { | ||
| 7094 | /* Tell wait_reading_process_output that it needs to wake | ||
| 7095 | up and look around. */ | ||
| 7096 | if (input_available_clear_time) | ||
| 7097 | EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); | ||
| 7098 | } | ||
| 7099 | break; | ||
| 7100 | } | ||
| 7101 | |||
| 7102 | errno = old_errno; | ||
| 7103 | } | ||
| 7104 | |||
| 7105 | static char * | ||
| 7106 | find_user_signal_name (sig) | ||
| 7107 | int sig; | ||
| 7108 | { | ||
| 7109 | struct user_signal_info *p; | ||
| 7110 | |||
| 7111 | for (p = user_signals; p; p = p->next) | ||
| 7112 | if (p->sig == sig) | ||
| 7113 | return p->name; | ||
| 7114 | |||
| 7115 | return NULL; | ||
| 7116 | } | ||
| 7117 | |||
| 7118 | static int | ||
| 7119 | store_user_signal_events () | ||
| 7120 | { | ||
| 7121 | struct user_signal_info *p; | ||
| 7122 | struct input_event buf; | ||
| 7123 | int nstored = 0; | ||
| 7124 | |||
| 7125 | for (p = user_signals; p; p = p->next) | ||
| 7126 | if (p->npending > 0) | ||
| 7127 | { | ||
| 7128 | SIGMASKTYPE mask; | ||
| 7129 | |||
| 7130 | if (nstored == 0) | ||
| 7131 | { | ||
| 7132 | bzero (&buf, sizeof buf); | ||
| 7133 | buf.kind = USER_SIGNAL_EVENT; | ||
| 7134 | buf.frame_or_window = selected_frame; | ||
| 7135 | } | ||
| 7136 | nstored += p->npending; | ||
| 7137 | |||
| 7138 | mask = sigblock (sigmask (p->sig)); | ||
| 7139 | do | ||
| 7140 | { | ||
| 7141 | buf.code = 0; | ||
| 7142 | kbd_buffer_store_event (&buf); | ||
| 7143 | buf.code = p->sig; | ||
| 7144 | kbd_buffer_store_event (&buf); | ||
| 7145 | p->npending--; | ||
| 7146 | } | ||
| 7147 | while (p->npending > 0); | ||
| 7148 | sigsetmask (mask); | ||
| 7149 | } | ||
| 7150 | |||
| 7151 | return nstored; | ||
| 7152 | } | ||
| 7153 | |||
| 7154 | |||
| 7025 | static void menu_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*)); | 7155 | static void menu_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*)); |
| 7026 | static Lisp_Object menu_bar_one_keymap_changed_items; | 7156 | static Lisp_Object menu_bar_one_keymap_changed_items; |
| 7027 | 7157 | ||