--- fhandler_console.cc.orig	Thu Nov 30 16:00:31 2000
+++ fhandler_console.cc	Thu Nov 30 16:01:33 2000
@@ -193,50 +193,139 @@ fhandler_console::read (void *pv, size_t
 	  return -1;		/* seems to be failure */
 	}
 
+      /* check the event that occurred */
+      switch (input_rec.EventType)
+	{
+	case KEY_EVENT:
+	  if (!input_rec.Event.KeyEvent.bKeyDown)
+	    continue;
+
 #define ich (input_rec.Event.KeyEvent.uChar.AsciiChar)
 #define wch (input_rec.Event.KeyEvent.uChar.UnicodeChar)
 
-      /* check if we're just disposing of this one */
-
-      if (input_rec.EventType == WINDOW_BUFFER_SIZE_EVENT)
-	{
-	  kill_pgrp (tc->getpgid (), SIGWINCH);
-	  continue;
-	}
-      if (input_rec.EventType != KEY_EVENT ||
-	  !input_rec.Event.KeyEvent.bKeyDown)
-	continue;
-
-      if (wch == 0 ||
-	  /* arrow/function keys */
-	  (input_rec.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY))
-	{
-	  toadd = get_nonascii_key (input_rec, tmp);
-	  if (!toadd)
-	    continue;
-	  nread = strlen (toadd);
-	}
-      else
-	{
-	  tmp[1] = ich;
-	  /* Need this check since US code page seems to have a bug when
-	     converting a CTRL-U. */
-	  if ((unsigned char)ich > 0x7f)
-	    OemToCharBuff (tmp + 1, tmp + 1, 1);
-	  if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED))
-	    toadd = tmp + 1;
+	  if (wch == 0 ||
+	      /* arrow/function keys */
+	      (input_rec.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY))
+	    {
+	      toadd = get_nonascii_key (input_rec, tmp);
+	      if (!toadd)
+		continue;
+	      nread = strlen (toadd);
+	    }
 	  else
 	    {
-	      tmp[0] = '\033';
-	      tmp[1] = cyg_tolower (tmp[1]);
-	      toadd = tmp;
-	      nread++;
+	      tmp[1] = ich;
+	      /* Need this check since US code page seems to have a bug when
+		 converting a CTRL-U. */
+	      if ((unsigned char)ich > 0x7f)
+		OemToCharBuff (tmp + 1, tmp + 1, 1);
+	      if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED))
+		toadd = tmp + 1;
+	      else
+		{
+		  tmp[0] = '\033';
+		  tmp[1] = cyg_tolower (tmp[1]);
+		  toadd = tmp;
+		  nread++;
+		}
 	    }
+#undef ich
+#undef wch
+	  break;
+
+	case MOUSE_EVENT:
+	  {
+	    MOUSE_EVENT_RECORD & mouse_event = input_rec.Event.MouseEvent;
+
+	    /* Treat the double-click event like a regular button press */
+	    if (mouse_event.dwEventFlags == DOUBLE_CLICK)
+	      {
+		syscall_printf("mouse: double-click -> click");
+		mouse_event.dwEventFlags = 0;
+	      }
+
+	    /* Did something other than a click occur? */
+	    if (mouse_event.dwEventFlags)
+	      continue;
+
+	    /* If the mouse event occurred out of the area we can handle,
+	       ignore it. */
+	    int x = mouse_event.dwMousePosition.X;
+	    int y = mouse_event.dwMousePosition.Y;
+	    if ((x + ' ' + 1 > 0xFF) || (y + ' ' + 1 > 0xFF))
+	      {
+		syscall_printf("mouse: position out of range");
+		continue;
+	      }
+
+	    /* Ignore unimportant mouse buttons */
+	    mouse_event.dwButtonState &= 0x7;
+
+	    /* This code assumes Windows never reports multiple button
+	       events at the same time. */
+	    static DWORD dwLastButtonState = 0;
+	    int b = 0;
+	    char sz[32];
+	    if (mouse_event.dwButtonState == dwLastButtonState)
+	      {
+		syscall_printf("mouse: button state unchanged");
+		continue;
+	      }
+	    else if (mouse_event.dwButtonState < dwLastButtonState)
+	      {
+		b = 3;
+		strcpy(sz, "btn up");
+	      }
+	    else if ((mouse_event.dwButtonState & 1) != (dwLastButtonState & 1))
+	      {
+		b = 0;
+		strcpy(sz, "btn1 down");
+	      }
+	    else if ((mouse_event.dwButtonState & 2) != (dwLastButtonState & 2))
+	      {
+		b = 1;
+		strcpy(sz, "btn2 down");
+	      }
+	    else if ((mouse_event.dwButtonState & 4) != (dwLastButtonState & 4))
+	      {
+		b = 2;
+		strcpy(sz, "btn3 down");
+	      }
+
+	    /* Remember the current button state */
+	    dwLastButtonState = mouse_event.dwButtonState;
+
+	    static int nModifiers = 0;
+	    /* If a button was pressed, remember the modifiers */
+	    if (b != 3)
+	      {
+		nModifiers = 0;
+		if (mouse_event.dwControlKeyState & SHIFT_PRESSED)
+		  nModifiers |= 0x4;
+		if (mouse_event.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED))
+		  nModifiers |= 0x8;
+		if (mouse_event.dwControlKeyState & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED))
+		  nModifiers |= 0x10;
+	      }
+
+	    b |= nModifiers;
+
+	    /* We can now create the code. */
+	    sprintf(tmp, "\033[M%c%c%c", b + ' ', x + ' ' + 1, y + ' ' + 1);
+	    syscall_printf("mouse: %s at (%d,%d)", sz, x, y);
+	  }
+	  break;
+
+	case WINDOW_BUFFER_SIZE_EVENT:
+	  kill_pgrp (tc->getpgid (), SIGWINCH);
+	  continue;
+
+	default:
+	  continue;
 	}
 
       if (line_edit (toadd, nread))
 	break;
-#undef ich
     }
 
   while (buflen)
@@ -382,7 +471,7 @@ fhandler_console::open (const char *, in
   if (GetConsoleMode (get_io_handle (), &cflags))
     {
       cflags |= ENABLE_PROCESSED_INPUT;
-      SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | cflags);
+      SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | cflags);
     }
 
   TTYCLEARF (RSTCONS);
@@ -545,7 +634,7 @@ fhandler_console::input_tcsetattr (int, 
       tc->ti.c_lflag = 0;
     }
 
-  flags |= ENABLE_WINDOW_INPUT;
+  flags |= ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
 
   int res;
   if (flags == oflags)
