Mercurial > emacs
comparison src/keyboard.c @ 74611:4d547fe4a938
(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.
author | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> |
---|---|
date | Thu, 14 Dec 2006 08:41:46 +0000 |
parents | 408e515f643d |
children | 130738a27be7 |
comparison
equal
deleted
inserted
replaced
74610:0da2b2f82afc | 74611:4d547fe4a938 |
---|---|
697 static void any_kboard_state P_ ((void)); | 697 static void any_kboard_state P_ ((void)); |
698 static SIGTYPE interrupt_signal P_ ((int signalnum)); | 698 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. */ |
705 static int cannot_suspend; | 708 static int cannot_suspend; |
706 | 709 |
5946 return apply_modifiers (event->modifiers, event->arg); | 5949 return apply_modifiers (event->modifiers, event->arg); |
5947 return event->arg; | 5950 return event->arg; |
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) |
5952 { | 5955 return Qsignal; |
5953 case 0: | 5956 else |
5954 return Qsignal; | 5957 { |
5955 #ifdef SIGUSR1 | 5958 char *name = find_user_signal_name (event->code); |
5956 case SIGUSR1: | 5959 |
5957 return intern ("usr1"); | 5960 if (name) |
5958 #endif | 5961 return intern (name); |
5959 #ifdef SIGUSR2 | 5962 else |
5960 case SIGUSR2: | 5963 return make_number (event->code); |
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: |
5968 return Qsave_session; | 5967 return Qsave_session; |
5969 | 5968 |
6796 read_avail_input (expected) | 6795 read_avail_input (expected) |
6797 int expected; | 6796 int expected; |
6798 { | 6797 { |
6799 register int i; | 6798 register int i; |
6800 int nread = 0; | 6799 int nread = 0; |
6800 | |
6801 /* Store pending user signal events, if any. */ | |
6802 if (store_user_signal_events ()) | |
6803 expected = 0; | |
6801 | 6804 |
6802 if (read_socket_hook) | 6805 if (read_socket_hook) |
6803 { | 6806 { |
6804 int nr; | 6807 int nr; |
6805 struct input_event hold_quit; | 6808 struct input_event hold_quit; |
7018 #ifdef SIGIO | 7021 #ifdef SIGIO |
7019 handle_async_input (); | 7022 handle_async_input (); |
7020 #endif | 7023 #endif |
7021 } | 7024 } |
7022 | 7025 |
7026 | |
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 } | |
7023 | 7153 |
7024 | 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 |