aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYAMAMOTO Mitsuharu2006-12-14 08:41:46 +0000
committerYAMAMOTO Mitsuharu2006-12-14 08:41:46 +0000
commit23479b40da61fdf88d7bad75e900ba4a7db61dfd (patch)
tree87f2c44ee0dec2d922daa06fcc702eeb4d24d73e /src
parent511268f5502a375895b5428966e45c125428fd8e (diff)
downloademacs-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.c156
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));
699static void timer_start_idle P_ ((void)); 699static void timer_start_idle P_ ((void));
700static void timer_stop_idle P_ ((void)); 700static void timer_stop_idle P_ ((void));
701static void timer_resume_idle P_ ((void)); 701static void timer_resume_idle P_ ((void));
702static SIGTYPE handle_user_signal P_ ((int));
703static char *find_user_signal_name P_ ((int));
704static 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
7030struct 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. */
7045static struct user_signal_info *user_signals = NULL;
7046
7047void
7048add_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
7069static SIGTYPE
7070handle_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
7105static char *
7106find_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
7118static int
7119store_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
7025static void menu_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*)); 7155static void menu_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*));
7026static Lisp_Object menu_bar_one_keymap_changed_items; 7156static Lisp_Object menu_bar_one_keymap_changed_items;
7027 7157