2
0
Эх сурвалжийг харах

partially-working cursor-visible handling

cxgeorge 24 жил өмнө
parent
commit
eda5a0383a

+ 59 - 46
panda/src/wdxdisplay/wdxGraphicsWindow.cxx

@@ -307,44 +307,43 @@ LONG WINAPI static_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam
 ////////////////////////////////////////////////////////////////////
 LONG wdxGraphicsWindow::
 window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
-    int button = -1;
-    int x, y, width, height;
+  int button = -1;
+  int x, y, width, height;
 
-    switch(msg) {
-
-         case WM_PAINT: {
-            PAINTSTRUCT ps;
-            BeginPaint(hwnd, &ps);
-
-            if(DXREADY)
-                show_frame();
-            EndPaint(hwnd, &ps);
-            return 0;
+  switch(msg) {
+    case WM_PAINT: {
+        PAINTSTRUCT ps;
+        BeginPaint(hwnd, &ps);
+    
+        if(DXREADY)
+            show_frame();
+        EndPaint(hwnd, &ps);
+        return 0;
+    }
+    
+    case WM_MOUSEMOVE:
+        if(!DXREADY)
+            break;
+    
+        // Win32 doesn't return the same numbers as X does when the mouse
+        // goes beyond the upper or left side of the window
+        #define SET_MOUSE_COORD(iVal,VAL) { \
+                iVal = VAL;                   \
+                if(iVal & 0x8000)             \
+                  iVal -= 0x10000;            \
         }
-
-        case WM_MOUSEMOVE:
-            if(!DXREADY)
-                break;
-        
-            // Win32 doesn't return the same numbers as X does when the mouse
-            // goes beyond the upper or left side of the window
-            #define SET_MOUSE_COORD(iVal,VAL) { \
-                    iVal = VAL;                   \
-                    if(iVal & 0x8000)             \
-                      iVal -= 0x10000;            \
-            }
-        
-            SET_MOUSE_COORD(x,LOWORD(lparam));
-            SET_MOUSE_COORD(y,HIWORD(lparam));
-
-            if(mouse_motion_enabled()
-               && wparam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) {
-                handle_mouse_motion(x, y);
-            } else if(mouse_passive_motion_enabled() &&
-                      ((wparam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) == 0)) {
-                handle_mouse_motion(x, y);
-            }
-            return 0;
+    
+        SET_MOUSE_COORD(x,LOWORD(lparam));
+        SET_MOUSE_COORD(y,HIWORD(lparam));
+    
+        if(mouse_motion_enabled()
+           && wparam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) {
+            handle_mouse_motion(x, y);
+        } else if(mouse_passive_motion_enabled() &&
+                  ((wparam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) == 0)) {
+            handle_mouse_motion(x, y);
+        }
+        return 0;
 
     case WM_IME_NOTIFY:
       if (wparam == IMN_SETOPENSTATUS) {
@@ -561,7 +560,14 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
                 _WindowAdjustingType = MovingOrResizing;
             }
             break;
-
+/*
+        case WM_SETCURSOR: {
+            if(!_props._bCursorIsVisible)
+               return true;  // avoid defaultwindproc showing the cursor
+            break;
+//          return false;
+        }
+*/
         case WM_DISPLAYCHANGE: {
 #ifdef _DEBUG
             width = LOWORD(lparam);  height = HIWORD(lparam);
@@ -625,13 +631,13 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
               break;
             }
 
-            if(_mouse_entry_enabled)
-                handle_mouse_entry(MOUSE_ENTERED,_pParentWindowGroup->_hMouseCursor);
-
             POINT point;
             GetCursorPos(&point);
             ScreenToClient(hwnd, &point);
 
+            if(_mouse_entry_enabled)
+                handle_mouse_entry(MOUSE_ENTERED,point.x,point.y);
+
             // this is a hack to make sure common modifier keys have proper state
             // since at focus loss, app may never receive key-up event corresponding to
             // a key-down. it would be better to know the exact set of ModifierButtons the
@@ -652,7 +658,7 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
             }
 
             if(_mouse_entry_enabled)
-                  handle_mouse_entry(MOUSE_EXITED,_pParentWindowGroup->_hMouseCursor);
+                  handle_mouse_entry(MOUSE_EXITED,0,0);
 
             int i;
             for(i=0;i<NUM_MODIFIER_KEYS;i++) {
@@ -730,8 +736,11 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
           }
           return 0;
 
-        //case WM_CREATE:
-        //        break;
+        case WM_CREATE: {
+            if(!_props._bCursorIsVisible)
+                ShowCursor(false);
+            break;
+        }
 
         case WM_ACTIVATEAPP: {
             #ifdef _DEBUG
@@ -1033,6 +1042,7 @@ void wdxGraphicsWindowGroup::CreateWindows(void) {
     }
 
     _bLoadedCustomCursor=false;
+    _hMouseCursor=NULL;
 
     if(!windows_color_cursor_filename.empty()) {
         // card support for full color non-black/white GDI cursors varies greatly.  if the cursor is not supported,
@@ -2448,8 +2458,6 @@ void wdxGraphicsWindow::end_frame(void) {
     GraphicsWindow::end_frame();
 }
 
-
-
 ////////////////////////////////////////////////////////////////////
 //     Function: handle_window_move
 //       Access:
@@ -2475,10 +2483,15 @@ void wdxGraphicsWindow::handle_mouse_motion(int x, int y) {
 //       Access:
 //  Description:
 ////////////////////////////////////////////////////////////////////
-void wdxGraphicsWindow::handle_mouse_entry(int state,HCURSOR hCursor) {
+
+// BUGBUG: this needs to be called when mouse enters.  right now it's just called when keybd focus changes
+void wdxGraphicsWindow::handle_mouse_entry(int state, int x, int y) {
+//  ShowCursor(_props._bCursorIsVisible);
+
     if(state == MOUSE_EXITED) {
         _input_devices[0].set_pointer_out_of_window();
     } else {
+        _input_devices[0].set_pointer_in_window(x, y);
 //        SetCursor(hCursor);  believe this is not necessary, handled by windows
     }
 }

+ 1 - 1
panda/src/wdxdisplay/wdxGraphicsWindow.h

@@ -85,7 +85,7 @@ public:
   INLINE bool mouse_passive_motion_enabled(void) { return _mouse_passive_motion_enabled; }
   void handle_window_move( int x, int y );
   void handle_mouse_motion( int x, int y );
-  void handle_mouse_entry( int state, HCURSOR hMouseCursor );
+  void handle_mouse_entry( int state, int x, int y);
   void handle_keypress( ButtonHandle key, int x, int y );
   void handle_keyrelease( ButtonHandle key);
   void dx_setup();