Drag and drop 2.5 integration! Finally, slashdot regulars can use
[blender-staging.git] / source / blender / windowmanager / intern / wm_cursors.c
index 627aebbe875f882697588a5cd48d8530339e39e4..f23688404b1428df027a9f20fe7bc0e7279d92ca 100644 (file)
@@ -64,6 +64,7 @@ static GHOST_TStandardCursor convert_cursor(int curs)
                case CURSOR_X_MOVE:             return GHOST_kStandardCursorLeftRight;
                case CURSOR_Y_MOVE:             return GHOST_kStandardCursorUpDown;
                case CURSOR_PENCIL:             return GHOST_kStandardCursorPencil;
                case CURSOR_X_MOVE:             return GHOST_kStandardCursorLeftRight;
                case CURSOR_Y_MOVE:             return GHOST_kStandardCursorUpDown;
                case CURSOR_PENCIL:             return GHOST_kStandardCursorPencil;
+               case CURSOR_COPY:               return GHOST_kStandardCursorCopy;
        }
 }
 
        }
 }
 
@@ -104,6 +105,13 @@ void WM_cursor_set(wmWindow *win, int curs)
                return;
        }
 
                return;
        }
 
+#ifdef _WIN32
+       /* the default win32 cross cursor is barely visible,
+        * only 1 pixel thick, use another one instead */
+       if(curs==CURSOR_EDIT)
+               curs= BC_CROSSCURSOR;
+#endif
+
        GHOST_SetCursorVisibility(win->ghostwin, 1);
        
        win->cursor= curs;
        GHOST_SetCursorVisibility(win->ghostwin, 1);
        
        win->cursor= curs;
@@ -129,9 +137,10 @@ void WM_cursor_set(wmWindow *win, int curs)
 
 void WM_cursor_modal(wmWindow *win, int val)
 {
 
 void WM_cursor_modal(wmWindow *win, int val)
 {
-       if(win->lastcursor == 0)
+       if(win->lastcursor == 0) {
                win->lastcursor = win->cursor;
                win->lastcursor = win->cursor;
-       WM_cursor_set(win, val);
+               WM_cursor_set(win, val);
+       }
 }
 
 void WM_cursor_restore(wmWindow *win)
 }
 
 void WM_cursor_restore(wmWindow *win)
@@ -156,6 +165,39 @@ void WM_cursor_wait(int val)
        }
 }
 
        }
 }
 
+void WM_cursor_grab(wmWindow *win, int wrap, int hide, int *bounds)
+{
+       /* Only grab cursor when not running debug.
+        * It helps not to get a stuck WM when hitting a breakpoint  
+        * */
+       GHOST_TGrabCursorMode mode = GHOST_kGrabNormal;
+
+       if(hide)                mode = GHOST_kGrabHide;
+       else if(wrap)   mode = GHOST_kGrabWrap;
+       if ((G.f & G_DEBUG) == 0) {
+               if (win && win->ghostwin) {
+                       const GHOST_TabletData *tabletdata= GHOST_GetTabletData(win->ghostwin);
+                       // Note: There is no tabletdata on Windows if no tablet device is connected.
+                       if (!tabletdata)
+                               GHOST_SetCursorGrab(win->ghostwin, mode, bounds);
+                       else if (tabletdata->Active == GHOST_kTabletModeNone)
+                               GHOST_SetCursorGrab(win->ghostwin, mode, bounds);
+
+                       win->grabcursor = mode;
+               }
+       }
+}
+
+void WM_cursor_ungrab(wmWindow *win)
+{
+       if ((G.f & G_DEBUG) == 0) {
+               if(win && win->ghostwin) {
+                       GHOST_SetCursorGrab(win->ghostwin, GHOST_kGrabDisable, NULL);
+                       win->grabcursor = GHOST_kGrabDisable;
+               }
+       }
+}
+
 /* afer this you can call restore too */
 void WM_timecursor(wmWindow *win, int nr)
 {
 /* afer this you can call restore too */
 void WM_timecursor(wmWindow *win, int nr)
 {
@@ -176,7 +218,7 @@ void WM_timecursor(wmWindow *win, int nr)
        unsigned char bitmap[16][2];
        int i, idx;
        
        unsigned char bitmap[16][2];
        int i, idx;
        
-       if(win->lastcursor != 0)
+       if(win->lastcursor == 0)
                win->lastcursor= win->cursor; 
        
        memset(&bitmap, 0x00, sizeof(bitmap));
                win->lastcursor= win->cursor; 
        
        memset(&bitmap, 0x00, sizeof(bitmap));
@@ -316,7 +358,7 @@ BEGIN_CURSOR_BLOCK
 
        static char ew_smsk[]={
                0x00,  0x00,  0x00,  0x00,  0x10,  0x08,  0x38,  0x1c,
 
        static char ew_smsk[]={
                0x00,  0x00,  0x00,  0x00,  0x10,  0x08,  0x38,  0x1c,
-               0x3c,  0x3c,  0xfe,  0x7f,  0xff,  0xff,  0x3f,  0xfc,
+               0x3c,  0x3c,  0xfe,  0x7f,  0xff,  0xff,  0xff,  0xff,
                0xff,  0xff,  0xfe,  0x7f,  0x3c,  0x3c,  0x38,  0x1c,
                0x10,  0x08,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
        };
                0xff,  0xff,  0xfe,  0x7f,  0x3c,  0x3c,  0x38,  0x1c,
                0x10,  0x08,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
        };
@@ -943,17 +985,17 @@ END_CURSOR_BLOCK
 /********************** Swap Area Cursor ***********************/
 BEGIN_CURSOR_BLOCK
 static char swap_sbm[]={
 /********************** Swap Area Cursor ***********************/
 BEGIN_CURSOR_BLOCK
 static char swap_sbm[]={
-        0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
-        0x00,  0x00,  0x00,  0x00,  0xff,  0x07,  0xff,  0x07,
-        0xff,  0x07,  0xff,  0x07,  0xff,  0x07,  0xff,  0x07,
-        0xff,  0x07,  0xff,  0x07,  0xff,  0x07,  0xff,  0x07,
+       0xc0,  0xff,  0x40,  0x80,  0x40,  0x80,  0x40,  0x9c,
+       0x40,  0x98,  0x40,  0x94,  0x00,  0x82,  0xfe,  0x80,
+       0x7e,  0xfd,  0xbe,  0x01,  0xda,  0x01,  0xe2,  0x01,
+       0xe2,  0x01,  0xc2,  0x01,  0xfe,  0x01,  0x00,  0x00,
 };
 
 static char swap_smsk[]={
 };
 
 static char swap_smsk[]={
-        0xc0,  0xff,  0xc0,  0xff,  0xc0,  0xff,  0xc0,  0xff,
-        0xc0,  0xff,  0xc0,  0xff,  0xff,  0xff,  0xff,  0xff,
-        0xff,  0xff,  0xff,  0xff,  0xff,  0x07,  0xff,  0x07,
-        0xff,  0x07,  0xff,  0x07,  0xff,  0x07,  0xff,  0x07,
+       0xc0,  0xff,  0xc0,  0xff,  0xc0,  0xff,  0xc0,  0xff,
+       0xc0,  0xff,  0xc0,  0xff,  0xff,  0xff,  0xff,  0xff,
+       0xff,  0xff,  0xff,  0x03,  0xff,  0x03,  0xff,  0x03,
+       0xff,  0x03,  0xff,  0x03,  0xff,  0x03,  0xff,  0x03,
 };
 
 static BCursor SwapCursor = {
 };
 
 static BCursor SwapCursor = {