Browse Source

add Ctl-V clipboard paste

cxgeorge 24 years ago
parent
commit
bfedc56400

+ 42 - 4
panda/src/wdxdisplay/wdxGraphicsWindow.cxx

@@ -298,19 +298,47 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
             return 0;
         }
 
+        case WM_SYSKEYUP:
+        case WM_SYSKEYDOWN:
         case WM_SYSCHAR:
         case WM_CHAR:
-            return 0;
-        case WM_SYSKEYDOWN:
+            break;
+
         case WM_KEYDOWN: {
             POINT point;
 
             GetCursorPos(&point);
             ScreenToClient(hwnd, &point);
-            handle_keypress(lookup_key(wparam), point.x, point.y);
+
+            // handle Cntrl-V paste from clipboard
+            if(!((wparam=='V') && (GetKeyState(VK_CONTROL) < 0))) {
+               handle_keypress(lookup_key(wparam), point.x, point.y);
+            } else {
+                HGLOBAL   hglb; 
+                char    *lptstr; 
+            
+                if (!IsClipboardFormatAvailable(CF_TEXT)) 
+                   return 0; 
+            
+                if (!OpenClipboard(NULL)) 
+                   return 0; 
+             
+                hglb = GetClipboardData(CF_TEXT); 
+                if (hglb!=NULL) {
+                    lptstr = (char *) GlobalLock(hglb); 
+                    if(lptstr != NULL)  {
+                        char *pChar;
+                        for(pChar=lptstr;*pChar!=NULL;pChar++) {
+                           handle_keypress(KeyboardButton::ascii_key((uchar)*pChar), point.x, point.y);
+                        }
+                        GlobalUnlock(hglb); 
+                    } 
+                }
+                CloseClipboard(); 
+            }
             return 0;
         }
-        case WM_SYSKEYUP:
+
         case WM_KEYUP: {
             POINT point;
 
@@ -1555,6 +1583,16 @@ void wdxGraphicsWindow::handle_mouse_entry(int state,HCURSOR hCursor) {
 ////////////////////////////////////////////////////////////////////
 void wdxGraphicsWindow::
 handle_keypress(ButtonHandle key, int x, int y) {
+/*
+    if(key.has_ascii_equivalent()) {
+        wdxdisplay_cat.spam() << key.get_ascii_equivalent() << endl;
+
+        short d1 = GetKeyState(VK_CONTROL);
+        short d2 = GetKeyState(VK_SHIFT);
+        wdxdisplay_cat.spam().flags(ios::hex | ios::uppercase );
+        wdxdisplay_cat.spam()  << " Control: " << ((d1 < 0)? "down" : "up") << "  Shift: " << ((d2 < 0)? "down" : "up") << endl;
+    }
+*/
     _input_devices[0].set_pointer_in_window(x, y);
     if(key != ButtonHandle::none()) {
         _input_devices[0].button_down(key);

+ 33 - 7
panda/src/wgldisplay/wglGraphicsWindow.cxx

@@ -1459,21 +1459,47 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
           return 0;       
     }
 
+    case WM_SYSKEYUP:
+    case WM_SYSKEYDOWN:
     case WM_SYSCHAR:
     case WM_CHAR:
-      return 0;
+        break;
 
-    case WM_SYSKEYDOWN:
     case WM_KEYDOWN: {
         POINT point;
-      // make_current();  what does OGL have to do with input?
+
         GetCursorPos(&point);
         ScreenToClient(hwnd, &point);
-        handle_keypress(lookup_key(wparam), point.x, point.y);
-        break;
-      }
 
-    case WM_SYSKEYUP:
+        // handle Cntrl-V paste from clipboard
+        if(!((wparam=='V') && (GetKeyState(VK_CONTROL) < 0))) {
+           handle_keypress(lookup_key(wparam), point.x, point.y);
+        } else {
+            HGLOBAL   hglb; 
+            char    *lptstr; 
+        
+            if (!IsClipboardFormatAvailable(CF_TEXT)) 
+               return 0; 
+        
+            if (!OpenClipboard(NULL)) 
+               return 0; 
+         
+            hglb = GetClipboardData(CF_TEXT); 
+            if (hglb!=NULL) {
+                lptstr = (char *) GlobalLock(hglb); 
+                if(lptstr != NULL)  {
+                    char *pChar;
+                    for(pChar=lptstr;*pChar!=NULL;pChar++) {
+                       handle_keypress(KeyboardButton::ascii_key((uchar)*pChar), point.x, point.y);
+                    }
+                    GlobalUnlock(hglb); 
+                } 
+            }
+            CloseClipboard(); 
+        }
+        return 0;
+    }
+
     case WM_KEYUP: {
         // dont need x,y for this
         handle_keyrelease(lookup_key(wparam));