Fix @direntry, add @dircategory.
[bpt/emacs.git] / src / w32inevt.c
index f31f88e..1b2b662 100644 (file)
@@ -49,6 +49,9 @@ extern void reinvoke_input_signal (void);
 /* from dispnew.c */
 extern int change_frame_size (FRAME_PTR, int, int, int, int);
 
+/* from w32console.c */
+extern int w32_use_full_screen_buffer;
+
 /* from w32fns.c */
 extern Lisp_Object Vw32_alt_is_meta;
 extern unsigned int map_keypad_keys (unsigned int, unsigned int);
@@ -60,6 +63,7 @@ extern Lisp_Object Vw32_enable_num_lock;
 extern Lisp_Object Vw32_recognize_altgr;
 extern Lisp_Object Vw32_pass_lwindow_to_system;
 extern Lisp_Object Vw32_pass_rwindow_to_system;
+extern Lisp_Object Vw32_phantom_key_code;
 extern Lisp_Object Vw32_lwindow_modifier;
 extern Lisp_Object Vw32_rwindow_modifier;
 extern Lisp_Object Vw32_apps_modifier;
@@ -106,7 +110,7 @@ fill_queue (BOOL block)
 static FRAME_PTR 
 get_frame (void)
 {
-  return selected_frame;
+  return SELECTED_FRAME ();
 }
 
 /* Translate console modifiers to emacs modifiers.  
@@ -270,12 +274,13 @@ w32_kbd_patch_key (KEY_EVENT_RECORD *event)
 
 extern char *lispy_function_keys[];
 
+static int faked_key = 0;
+
 /* return code -1 means that event_queue_ptr won't be incremented. 
    In other word, this event makes two key codes.   (by himi)       */
 int 
 key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev, int *isdead)
 {
-  static int faked_key = 0;
   static int mod_key_state = 0;
   int wParam;
 
@@ -317,8 +322,11 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev, int *isdead)
             Space which we will ignore.  */
          if ((mod_key_state & LEFT_WIN_PRESSED) == 0)
            {
-             faked_key = VK_SPACE;
-             keybd_event (VK_SPACE, (BYTE) MapVirtualKey (VK_SPACE, 0), 0, 0);
+             if (NUMBERP (Vw32_phantom_key_code))
+               faked_key = XUINT (Vw32_phantom_key_code) & 255;
+             else
+               faked_key = VK_SPACE;
+             keybd_event (faked_key, (BYTE) MapVirtualKey (faked_key, 0), 0, 0);
            }
        }
       mod_key_state |= LEFT_WIN_PRESSED;
@@ -330,8 +338,11 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev, int *isdead)
        {
          if ((mod_key_state & RIGHT_WIN_PRESSED) == 0)
            {
-             faked_key = VK_SPACE;
-             keybd_event (VK_SPACE, (BYTE) MapVirtualKey (VK_SPACE, 0), 0, 0);
+             if (NUMBERP (Vw32_phantom_key_code))
+               faked_key = XUINT (Vw32_phantom_key_code) & 255;
+             else
+               faked_key = VK_SPACE;
+             keybd_event (faked_key, (BYTE) MapVirtualKey (faked_key, 0), 0, 0);
            }
        }
       mod_key_state |= RIGHT_WIN_PRESSED;
@@ -379,6 +390,23 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev, int *isdead)
     case VK_CONTROL:
     case VK_SHIFT:
       return 0;
+    case VK_CANCEL:
+      /* Windows maps Ctrl-Pause (aka Ctrl-Break) into VK_CANCEL,
+        which is confusing for purposes of key binding; convert
+        VK_CANCEL events into VK_PAUSE events.  */
+      event->wVirtualKeyCode = VK_PAUSE;
+      break;
+    case VK_PAUSE:
+      /* Windows maps Ctrl-NumLock into VK_PAUSE, which is confusing
+        for purposes of key binding; convert these back into
+        VK_NUMLOCK events, at least when we want to see NumLock key
+        presses.  (Note that there is never any possibility that
+        VK_PAUSE with Ctrl really is C-Pause as per above.)  */
+      if (NILP (Vw32_enable_num_lock)
+         && (event->dwControlKeyState
+             & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) != 0)
+       event->wVirtualKeyCode = VK_NUMLOCK;
+      break;
     }
 
   /* Recognize state of Windows and Apps keys.  */
@@ -444,12 +472,36 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev, int *isdead)
   return 1;
 }
 
+int
+w32_console_toggle_lock_key (int vk_code, Lisp_Object new_state)
+{
+  int cur_state = (GetKeyState (vk_code) & 1);
+
+  if (NILP (new_state)
+      || (NUMBERP (new_state)
+         && (XUINT (new_state)) & 1 != cur_state))
+    {
+      faked_key = vk_code;
+
+      keybd_event ((BYTE) vk_code,
+                  (BYTE) MapVirtualKey (vk_code, 0),
+                  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+      keybd_event ((BYTE) vk_code,
+                  (BYTE) MapVirtualKey (vk_code, 0),
+                  KEYEVENTF_EXTENDEDKEY | 0, 0);
+      keybd_event ((BYTE) vk_code,
+                  (BYTE) MapVirtualKey (vk_code, 0),
+                  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+      cur_state = !cur_state;
+    }
+
+  return cur_state;
+}
+
 /* Mouse position hook.  */
 void 
 w32_console_mouse_position (FRAME_PTR *f,
-#ifndef MULE
                            int insist,
-#endif
                            Lisp_Object *bar_window,
                            enum scroll_bar_part *part,
                            Lisp_Object *x,
@@ -458,14 +510,12 @@ w32_console_mouse_position (FRAME_PTR *f,
 {
   BLOCK_INPUT;
 
-#ifndef MULE  
   insist = insist;
-#endif
 
   *f = get_frame ();
   *bar_window = Qnil;
   *part = 0;
-  selected_frame->mouse_moved = 0;
+  SELECTED_FRAME ()->mouse_moved = 0;
   
   *x = movement_pos.X;
   *y = movement_pos.Y;
@@ -481,7 +531,7 @@ mouse_moved_to (int x, int y)
   /* If we're in the same place, ignore it */
   if (x != movement_pos.X || y != movement_pos.Y)
     {
-      selected_frame->mouse_moved = 1;
+      SELECTED_FRAME ()->mouse_moved = 1;
       movement_pos.X = x;
       movement_pos.Y = y;
       movement_time = GetTickCount ();
@@ -569,6 +619,22 @@ resize_event (WINDOW_BUFFER_SIZE_RECORD *event)
   SET_FRAME_GARBAGED (f);
 }
 
+static void
+maybe_generate_resize_event ()
+{
+  CONSOLE_SCREEN_BUFFER_INFO info;
+  FRAME_PTR f = get_frame ();
+
+  GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &info);
+
+  /* It is okay to call this unconditionally, since it will do nothing
+     if the size hasn't actually changed.  */
+  change_frame_size (f,
+                    1 + info.srWindow.Bottom - info.srWindow.Top,
+                    1 + info.srWindow.Right - info.srWindow.Left,
+                    0, 0);
+}
+
 int 
 w32_console_read_socket (int sd, struct input_event *bufp, int numchars,
                         int expected)
@@ -622,7 +688,8 @@ w32_console_read_socket (int sd, struct input_event *bufp, int numchars,
              break;
 
             case WINDOW_BUFFER_SIZE_EVENT:
-             resize_event (&queue_ptr->Event.WindowBufferSizeEvent);
+             if (w32_use_full_screen_buffer)
+               resize_event (&queue_ptr->Event.WindowBufferSizeEvent);
              break;
             
             case MENU_EVENT:
@@ -638,7 +705,13 @@ w32_console_read_socket (int sd, struct input_event *bufp, int numchars,
       if (ret > 0 || expected == 0)
        break;
     }
-  
+
+  /* We don't get told about changes in the window size (only the buffer
+     size, which we no longer care about), so we have to check it
+     periodically.  */
+  if (!w32_use_full_screen_buffer)
+    maybe_generate_resize_event ();
+
   UNBLOCK_INPUT;
   return ret;
 }