]> sourceware.org Git - newlib-cygwin.git/commitdiff
* path.cc (normalize_win32_path): Check for explicit use of two slashes at the
authorChristopher Faylor <me@cgf.cx>
Sat, 9 Dec 2000 21:31:49 +0000 (21:31 +0000)
committerChristopher Faylor <me@cgf.cx>
Sat, 9 Dec 2000 21:31:49 +0000 (21:31 +0000)
beginning of a path.  These should be treated specially regardless of whether
they are UNC paths or old-style //a paths.  Avoid adding cwd to a path if the
path already begins with '/'.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_console.cc
winsup/cygwin/path.cc

index 7bec39a0aed78bee69a6588bf6c22166e1a5fc40..1fa72cd31285262d12bf232fb857c3e4b1d9cb40 100644 (file)
@@ -1,3 +1,10 @@
+Sat Dec  9 16:29:45 2000  Christopher Faylor <cgf@cygnus.com>
+
+       * path.cc (normalize_win32_path): Check for explicit use of two slashes
+       at the beginning of a path.  These should be treated specially
+       regardless of whether they are UNC paths or old-style //a paths.  Avoid
+       adding cwd to a path if the path already begins with '/'.
+
 Fri Dec  8 22:21:01 2000  Christopher Faylor <cgf@cygnus.com>
 
        * path.cc (normalize_win32_path): Reorganize logic to accomodate
index 3e49e14803a2ef16f77c1a49c9c1bee405734daa..cfc569b29df041b859c4a81021babaf9d3cf59a6 100644 (file)
@@ -193,50 +193,139 @@ 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)
 
-      /* check if we're just disposing of this one */
+         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;
+             else
+               {
+                 tmp[0] = '\033';
+                 tmp[1] = cyg_tolower (tmp[1]);
+                 toadd = tmp;
+                 nread++;
+               }
+           }
+#undef ich
+#undef wch
+         break;
 
-      if (input_rec.EventType == WINDOW_BUFFER_SIZE_EVENT)
-       {
+       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;
-       }
-      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;
-         else
-           {
-             tmp[0] = '\033';
-             tmp[1] = cyg_tolower (tmp[1]);
-             toadd = tmp;
-             nread++;
-           }
+       default:
+         continue;
        }
 
       if (line_edit (toadd, nread))
        break;
-#undef ich
     }
 
   while (buflen)
@@ -382,7 +471,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 | cflags);
+      SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | cflags);
     }
 
   TTYCLEARF (RSTCONS);
@@ -545,7 +634,7 @@ fhandler_console::input_tcsetattr (int, struct termios const *t)
       tc->ti.c_lflag = 0;
     }
 
-  flags |= ENABLE_WINDOW_INPUT;
+  flags |= ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
 
   int res;
   if (flags == oflags)
index 7b9f81f6ef84847c84ee95ba839bb7b9cbab2092..0584d03e5675b15d8244fbb18ff9e921f16df7e1 100644 (file)
@@ -712,9 +712,9 @@ normalize_win32_path (const char *src, char *dst)
   const char *src_start = src;
   char *dst_start = dst;
   char *dst_root_start = dst;
-  bool beg_src_slash;
+  bool beg_src_slash = isdirsep (src[0]);
 
-  if (slash_unc_prefix_p (src))
+  if (beg_src_slash && isdirsep (src[1]))
     {
       if (cygheap->root.length ())
        {
@@ -725,7 +725,7 @@ normalize_win32_path (const char *src, char *dst)
       ++src;
     }
   /* If absolute path, care for chroot. */
-  else if ((beg_src_slash = SLASH_P (src[0])) && cygheap->root.length ())
+  else if (beg_src_slash  && cygheap->root.length ())
     {
       strcpy (dst, cygheap->root.path ());
       char *c;
@@ -735,7 +735,7 @@ normalize_win32_path (const char *src, char *dst)
       dst_root_start = dst;
       *dst++ = '\\';
     }
-  else if (strchr (src, ':') == NULL)
+  else if (strchr (src, ':') == NULL && *src != '/')
     {
       if (!cygcwd.get (dst, 0))
        return get_errno ();
This page took 0.0385 seconds and 5 git commands to generate.