Author: hbelusca
Date: Sun Jun  9 19:03:53 2013
New Revision: 59198

URL: http://svn.reactos.org/svn/reactos?rev=59198&view=rev
Log:
[CONSRV]
- Pressing the Shift key while copying text in the console, allows us to copy 
it without newlines (tested on Windows).
- When starting keyboard selection ("Marking"), put the cursor on top left of 
the console view.
- Improve key presses actions when being in selection mode (pressing ENTER when 
being in selection mode, copies the text and cancels selection mode, pressing 
ESC or Ctrl-C cancels the selection, etc...)
- Try to fix erratic context menu apparitions when being in Quick-Edit mode 
(caught by Javier Fernandez, aka. elhoir)

Modified:
    trunk/reactos/win32ss/user/consrv/frontends/gui/guiterm.c
    trunk/reactos/win32ss/user/consrv/frontends/gui/text.c

Modified: trunk/reactos/win32ss/user/consrv/frontends/gui/guiterm.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/frontends/gui/guiterm.c?rev=59198&r1=59197&r2=59198&view=diff
==============================================================================
--- trunk/reactos/win32ss/user/consrv/frontends/gui/guiterm.c   [iso-8859-1] 
(original)
+++ trunk/reactos/win32ss/user/consrv/frontends/gui/guiterm.c   [iso-8859-1] 
Sun Jun  9 19:03:53 2013
@@ -250,8 +250,8 @@
             LPWSTR WindowTitle = NULL;
             SIZE_T Length = 0;
 
-            Console->dwSelectionCursor.X = 0;
-            Console->dwSelectionCursor.Y = 0;
+            Console->dwSelectionCursor.X = ActiveBuffer->ViewOrigin.X;
+            Console->dwSelectionCursor.Y = ActiveBuffer->ViewOrigin.Y;
             Console->Selection.dwSelectionAnchor = Console->dwSelectionCursor;
             Console->Selection.dwFlags |= CONSOLE_SELECTION_IN_PROGRESS;
             GuiConsoleUpdateSelection(Console, 
&Console->Selection.dwSelectionAnchor);
@@ -716,28 +716,67 @@
     return;
 }
 
+static BOOL
+IsSystemKey(WORD VirtualKeyCode)
+{
+    switch (VirtualKeyCode)
+    {
+        /* From MSDN, "Virtual-Key Codes" */
+        case VK_RETURN:
+        case VK_SHIFT:
+        case VK_CONTROL:
+        case VK_MENU:
+        case VK_PAUSE:
+        case VK_CAPITAL:
+        case VK_ESCAPE:
+        case VK_LWIN:
+        case VK_RWIN:
+        case VK_NUMLOCK:
+        case VK_SCROLL:
+            return TRUE;
+        default:
+            return FALSE;
+    }
+}
+
 static VOID
 GuiConsoleHandleKey(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM 
lParam)
 {
     PCONSOLE Console = GuiData->Console;
     PCONSOLE_SCREEN_BUFFER ActiveBuffer;
     MSG Message;
+    WORD VirtualKeyCode = LOWORD(wParam);
 
     if (!ConSrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return;
 
     ActiveBuffer = Console->ActiveBuffer;
 
-    if ( (Console->Selection.dwFlags & CONSOLE_SELECTION_IN_PROGRESS) &&
-        ((Console->Selection.dwFlags & CONSOLE_MOUSE_SELECTION) == 0) )
-    {
-        BOOL Interpreted = FALSE;
-
-        /* Selection with keyboard */
-        if (msg == WM_KEYDOWN)
-        {
-            BOOL MajPressed = (GetKeyState(VK_SHIFT) & 0x8000);
-
-            switch (wParam)
+    if (Console->Selection.dwFlags & CONSOLE_SELECTION_IN_PROGRESS)
+    {
+        if (msg != WM_KEYDOWN) goto Quit;
+
+        if (VirtualKeyCode == VK_RETURN)
+        {
+            /* Copy (and clear) selection if ENTER is pressed */
+            GuiConsoleCopy(GuiData);
+            goto Quit;
+        }
+        else if ( VirtualKeyCode == VK_ESCAPE ||
+                 (VirtualKeyCode == 'C' && GetKeyState(VK_CONTROL) & 0x8000) )
+        {
+            /* Cancel selection if ESC or Ctrl-C are pressed */
+            GuiConsoleUpdateSelection(Console, NULL);
+            SetWindowText(GuiData->hWindow, Console->Title.Buffer);
+            goto Quit;
+        }
+
+        if ((Console->Selection.dwFlags & CONSOLE_MOUSE_SELECTION) == 0)
+        {
+            /* Selection mode with keyboard */
+            BOOL Interpreted = FALSE;
+            BOOL MajPressed  = (GetKeyState(VK_SHIFT) & 0x8000);
+
+            switch (VirtualKeyCode)
             {
                 case VK_LEFT:
                 {
@@ -821,25 +860,34 @@
 
                 GuiConsoleUpdateSelection(Console, 
&Console->dwSelectionCursor);
             }
-        }
-    }
-    else
+            else if (!IsSystemKey(VirtualKeyCode))
+            {
+                /* Emit an error beep sound */
+                SendNotifyMessage(GuiData->hWindow, PM_CONSOLE_BEEP, 0, 0);
+            }
+        }
+        else
+        {
+            /* Selection mode with mouse, clear the selection if needed */
+            if (!IsSystemKey(VirtualKeyCode))
+            {
+                GuiConsoleUpdateSelection(Console, NULL);
+                SetWindowText(GuiData->hWindow, Console->Title.Buffer);
+            }
+        }
+    }
+
+    if ((Console->Selection.dwFlags & CONSOLE_SELECTION_IN_PROGRESS) == 0)
     {
         Message.hwnd = GuiData->hWindow;
         Message.message = msg;
         Message.wParam = wParam;
         Message.lParam = lParam;
 
-        if (msg == WM_KEYDOWN)
-        {
-            /* If we are in selection mode (with mouse), clear the selection */
-            GuiConsoleUpdateSelection(Console, NULL);
-            SetWindowText(GuiData->hWindow, Console->Title.Buffer);
-        }
-
         ConioProcessKey(Console, &Message);
     }
 
+Quit:
     LeaveCriticalSection(&Console->Lock);
 }
 
@@ -1105,10 +1153,6 @@
                 else
                 {
                     GuiConsoleCopy(GuiData);
-
-                    /* Clear the selection */
-                    GuiConsoleUpdateSelection(Console, NULL);
-                    SetWindowText(GuiData->hWindow, Console->Title.Buffer);
                 }
 
                 GuiData->IgnoreNextMouseSignal = TRUE;
@@ -1129,7 +1173,7 @@
             }
 
             default:
-                Err = TRUE;
+                Err = FALSE; // TRUE;
                 break;
         }
     }
@@ -1287,6 +1331,10 @@
         }
 
         CloseClipboard();
+
+        /* Clear the selection */
+        GuiConsoleUpdateSelection(Console, NULL);
+        SetWindowText(GuiData->hWindow, Console->Title.Buffer);
     }
 }
 
@@ -1628,9 +1676,12 @@
 
         case WM_KEYDOWN:
         case WM_KEYUP:
+        case WM_CHAR:
+        case WM_DEADCHAR:
         case WM_SYSKEYDOWN:
         case WM_SYSKEYUP:
-        case WM_CHAR:
+        case WM_SYSCHAR:
+        case WM_SYSDEADCHAR:
         {
             /* Detect Alt-Enter presses and switch back and forth to 
fullscreen mode */
             if (msg == WM_SYSKEYDOWN && (HIWORD(lParam) & KF_ALTDOWN) && 
wParam == VK_RETURN)

Modified: trunk/reactos/win32ss/user/consrv/frontends/gui/text.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/consrv/frontends/gui/text.c?rev=59198&r1=59197&r2=59198&view=diff
==============================================================================
--- trunk/reactos/win32ss/user/consrv/frontends/gui/text.c      [iso-8859-1] 
(original)
+++ trunk/reactos/win32ss/user/consrv/frontends/gui/text.c      [iso-8859-1] 
Sun Jun  9 19:03:53 2013
@@ -38,6 +38,12 @@
 
     PCONSOLE Console = Buffer->Header.Console;
 
+    /*
+     * Pressing the Shift key while copying text, allows us to copy
+     * text without newline characters (inline-text copy mode).
+     */
+    BOOL InlineCopyMode = (GetKeyState(VK_SHIFT) & 0x8000);
+
     HANDLE hData;
     PBYTE ptr;
     LPWSTR data, dstPos;
@@ -52,13 +58,18 @@
            Console->Selection.srSelection.Right,
            Console->Selection.srSelection.Bottom);
 
-    /* Basic size for one line and termination */
-    size = selWidth + 1;
+    /* Basic size for one line... */
+    size = selWidth;
+    /* ... and for the other lines, add newline characters if needed. */
     if (selHeight > 0)
     {
-        /* Multiple line selections have to get \r\n appended */
-        size += ((selWidth + 2) * (selHeight - 1));
-    }
+        /*
+         * If we are not in inline-text copy mode, each selected line must
+         * finish with \r\n . Otherwise, the lines will be just concatenated.
+         */
+        size += (selWidth + (!InlineCopyMode ? 2 : 0)) * (selHeight - 1);
+    }
+    size += 1; /* Null-termination */
     size *= sizeof(WCHAR);
 
     /* Allocate memory, it will be passed to the system and may not be freed 
here */
@@ -82,10 +93,15 @@
             ConsoleAnsiCharToUnicodeChar(Console, &dstPos[xPos], 
(LPCSTR)&ptr[xPos * 2]);
         }
         dstPos += selWidth;
-        if (yPos != (selHeight - 1))
-        {
-            wcscat(data, L"\r\n");
-            dstPos += 2;
+
+        /* Add newline characters if we are not in inline-text copy mode */
+        if (!InlineCopyMode)
+        {
+            if (yPos != (selHeight - 1))
+            {
+                wcscat(data, L"\r\n");
+                dstPos += 2;
+            }
         }
     }
 


Reply via email to