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