Jacek Caban : conhost: Import menu handling from wineconsole.

Alexandre Julliard julliard at winehq.org
Fri Oct 9 16:00:47 CDT 2020


Module: wine
Branch: master
Commit: 83b52b19b5324adf8782cb3b1fd23c9bbe86c8aa
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=83b52b19b5324adf8782cb3b1fd23c9bbe86c8aa

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct  9 17:28:12 2020 +0200

conhost: Import menu handling from wineconsole.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/conhost/window.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/programs/conhost/window.c b/programs/conhost/window.c
index a36f0469b9..8ab639f329 100644
--- a/programs/conhost/window.c
+++ b/programs/conhost/window.c
@@ -1011,6 +1011,44 @@ static void copy_selection( struct console *console )
     CloseClipboard();
 }
 
+static void paste_clipboard( struct console *console )
+{
+    WCHAR *ptr;
+    HANDLE h;
+
+    if (!OpenClipboard( console->win )) return;
+    h = GetClipboardData( CF_UNICODETEXT );
+    if (h && (ptr = GlobalLock( h )))
+    {
+        unsigned int i, len = GlobalSize(h) / sizeof(WCHAR);
+        INPUT_RECORD ir[2];
+        SHORT sh;
+
+        ir[0].EventType = KEY_EVENT;
+        ir[0].Event.KeyEvent.wRepeatCount = 0;
+        ir[0].Event.KeyEvent.dwControlKeyState = 0;
+        ir[0].Event.KeyEvent.bKeyDown = TRUE;
+
+        /* generate the corresponding input records */
+        for (i = 0; i < len; i++)
+        {
+            /* FIXME: the modifying keys are not generated (shift, ctrl...) */
+            sh = VkKeyScanW( ptr[i] );
+            ir[0].Event.KeyEvent.wVirtualKeyCode   = LOBYTE(sh);
+            ir[0].Event.KeyEvent.wVirtualScanCode  = MapVirtualKeyW( LOBYTE(sh), 0 );
+            ir[0].Event.KeyEvent.uChar.UnicodeChar = ptr[i];
+
+            ir[1] = ir[0];
+            ir[1].Event.KeyEvent.bKeyDown = FALSE;
+
+            write_console_input( console, ir, 2, i == len - 1 );
+        }
+        GlobalUnlock( h );
+    }
+
+    CloseClipboard();
+}
+
 /* handle keys while selecting an area */
 static void handle_selection_key( struct console *console, BOOL down, WPARAM wparam, LPARAM lparam )
 {
@@ -2256,6 +2294,53 @@ static LRESULT WINAPI window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lp
         }
         break;
 
+    case WM_COMMAND:
+        switch (wparam)
+        {
+        case IDS_DEFAULT:
+            config_dialog( console, FALSE );
+            break;
+        case IDS_PROPERTIES:
+            config_dialog( console, TRUE );
+            break;
+        case IDS_MARK:
+            console->window->selection_start.X = console->window->selection_start.Y = 0;
+            console->window->selection_end.X = console->window->selection_end.Y = 0;
+            update_selection( console, 0 );
+            console->window->in_selection = TRUE;
+            break;
+        case IDS_COPY:
+            if (console->window->in_selection)
+            {
+                console->window->in_selection = FALSE;
+                update_selection( console, 0 );
+                copy_selection( console );
+            }
+            break;
+        case IDS_PASTE:
+            paste_clipboard( console );
+            break;
+        case IDS_SELECTALL:
+            console->window->selection_start.X = console->window->selection_start.Y = 0;
+            console->window->selection_end.X = console->active->width - 1;
+            console->window->selection_end.Y = console->active->height - 1;
+            update_selection( console, 0 );
+            console->window->in_selection = TRUE;
+            break;
+        case IDS_SCROLL:
+        case IDS_SEARCH:
+            FIXME( "Unhandled yet command: %lx\n", wparam );
+            break;
+        default:
+            return DefWindowProcW( hwnd, msg, wparam, lparam );
+        }
+        break;
+
+    case WM_INITMENUPOPUP:
+        if (!HIWORD(lparam)) return DefWindowProcW( hwnd, msg, wparam, lparam );
+        set_menu_details( console, GetSystemMenu(console->win, FALSE) );
+        break;
+
     default:
         return DefWindowProcW( hwnd, msg, wparam, lparam );
     }




More information about the wine-cvs mailing list