* fhandler.h (fhandler_console): Add additional argument to char_command
method. * fhandler_console.cc (fhandler_console::read): Revert previously misapplied patch. (fhandler_console::char_command): Add a second argument. (fhandler_console::write): Recognize when a '?' is found after a <esc>[.
This commit is contained in:
		| @@ -1,3 +1,13 @@ | ||||
| Thu Dec 14 23:37:51 2000  Christopher Faylor <cgf@cygnus.com> | ||||
|  | ||||
| 	* fhandler.h (fhandler_console): Add additional argument to | ||||
| 	char_command method. | ||||
| 	* fhandler_console.cc (fhandler_console::read): Revert previously | ||||
| 	misapplied patch. | ||||
| 	(fhandler_console::char_command): Add a second argument. | ||||
| 	(fhandler_console::write): Recognize when a '?' is found after a | ||||
| 	<esc>[. | ||||
|  | ||||
| Tue Dec  5 17:06:00 2000  Corinna Vinschen <corinna@vinschen.de> | ||||
|  | ||||
| 	* net.cc (cygwin_rexec): Eliminate superfluous call to | ||||
|   | ||||
| @@ -595,7 +595,7 @@ private: | ||||
|   void cursor_get (int *, int *); | ||||
|   void cursor_rel (int, int); | ||||
|   const unsigned char * write_normal (unsigned const char*, unsigned const char *); | ||||
|   void char_command (char); | ||||
|   void char_command (char, bool); | ||||
|   int output_tcsetattr (int a, const struct termios *t); | ||||
|  | ||||
| /* Input calls */ | ||||
|   | ||||
| @@ -193,139 +193,50 @@ fhandler_console::read (void *pv, size_t buflen) | ||||
| 	  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) | ||||
|  | ||||
| 	  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 && current_codepage == ansi_cp) | ||||
| 		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; | ||||
|       /* check if we're just disposing of this one */ | ||||
|  | ||||
| 	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: | ||||
|       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; | ||||
|  | ||||
| 	default: | ||||
| 	  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 && current_codepage == ansi_cp) | ||||
| 	    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++; | ||||
| 	    } | ||||
| 	} | ||||
|  | ||||
|       if (line_edit (toadd, nread)) | ||||
| 	break; | ||||
| #undef ich | ||||
|     } | ||||
|  | ||||
|   while (buflen) | ||||
| @@ -471,7 +382,7 @@ fhandler_console::open (const char *, int flags, mode_t) | ||||
|   if (GetConsoleMode (get_io_handle (), &cflags)) | ||||
|     { | ||||
|       cflags |= ENABLE_PROCESSED_INPUT; | ||||
|       SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | cflags); | ||||
|       SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | cflags); | ||||
|     } | ||||
|  | ||||
|   TTYCLEARF (RSTCONS); | ||||
| @@ -634,7 +545,7 @@ fhandler_console::input_tcsetattr (int, struct termios const *t) | ||||
|       tc->ti.c_lflag = 0; | ||||
|     } | ||||
|  | ||||
|   flags |= ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; | ||||
|   flags |= ENABLE_WINDOW_INPUT; | ||||
|  | ||||
|   int res; | ||||
|   if (flags == oflags) | ||||
| @@ -857,7 +768,7 @@ static const char base_chars[256] = | ||||
| static int savex, savey; /* for CSI s, CSI u */ | ||||
|  | ||||
| void | ||||
| fhandler_console::char_command (char c) | ||||
| fhandler_console::char_command (char c, bool saw_question_mark) | ||||
| { | ||||
|   // Keep the background intensity with the colr since there doesn't seem | ||||
|   // to be a way to set this with termcap/terminfo. | ||||
| @@ -1235,6 +1146,7 @@ fhandler_console::write (const void *vsrc, size_t len) | ||||
|   unsigned const char *end = src + len; | ||||
|   static NO_COPY unsigned rarg; | ||||
|   static NO_COPY char my_title_buf[TITLESIZE + 1]; | ||||
|   bool saw_question_mark = 0; | ||||
|  | ||||
|   debug_printf ("%x, %d", vsrc, len); | ||||
|  | ||||
| @@ -1312,7 +1224,7 @@ fhandler_console::write (const void *vsrc, size_t len) | ||||
| 	    } | ||||
| 	  break; | ||||
| 	case gotcommand: | ||||
| 	  char_command (*src++); | ||||
| 	  char_command (*src++, saw_question_mark); | ||||
| 	  state_ = normal; | ||||
| 	  break; | ||||
| 	case gotrsquare: | ||||
| @@ -1359,6 +1271,8 @@ fhandler_console::write (const void *vsrc, size_t len) | ||||
| 	    } | ||||
| 	  else if (*src != '@' && !isalpha (*src) && !isdigit (*src)) | ||||
| 	    { | ||||
| 	      if (*src == '?') | ||||
| 		saw_question_mark = 1; | ||||
| 	      /* ignore any extra chars between [ and first arg or command */ | ||||
| 	      src++; | ||||
| 	    } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user