- The WM_EMACS_FILENOTIFY message, posted to the message queue gets
- dispatched to the main Emacs window procedure, which queues it for
- processing by w32_read_socket. When w32_read_socket sees this
- message, it accesses the buffer with file notifications (using a
- critical section), extracts the information, converts it to a
- series of FILE_NOTIFY_EVENT events, and stuffs them into the input
- event queue to be processed by keyboard.c input machinery
- (read_char via a call to kbd_buffer_get_event). When the
- FILE_NOTIFY_EVENT event is processed by kbd_buffer_get_event, it is
- converted to a Lispy event that can be bound to a command. The
- default binding is w32notify-handle-event, defined on subr.el.
-
- After w32_read_socket is done processing the notifications, it
- resets a flag signaling to all watch worker threads that the
- notifications buffer is available for more input.
+ In a GUI session, the WM_EMACS_FILENOTIFY message posted to the
+ message queue gets dispatched to the main Emacs window procedure,
+ which queues it for processing by w32_read_socket. When
+ w32_read_socket sees this message, it accesses the buffer with file
+ notifications (using a critical section), extracts the information,
+ converts it to a series of FILE_NOTIFY_EVENT events, and stuffs
+ them into the input event queue to be processed by keyboard.c input
+ machinery (read_char via a call to kbd_buffer_get_event).
+
+ In a non-GUI session, we send the WM_EMACS_FILENOTIFY message to
+ the main (a.k.a. "Lisp") thread instead, since there are no window
+ procedures in console programs. That message wakes up
+ MsgWaitForMultipleObjects inside sys_select, which then signals to
+ its caller that some keyboard input is available. This causes
+ w32_console_read_socket to be called, which accesses the buffer
+ with file notifications and stuffs them into the input event queue
+ for keyboard.c to process.
+
+ When the FILE_NOTIFY_EVENT event is processed by keyboard.c's
+ kbd_buffer_get_event, it is converted to a Lispy event that can be
+ bound to a command. The default binding is file-notify-handle-event,
+ defined on subr.el.
+
+ After w32_read_socket or w32_console_read_socket are done
+ processing the notifications, they reset a flag signaling to all
+ watch worker threads that the notifications buffer is available for
+ more input.