]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/cursor.cpp
Improved selection mode handling in wxGrid::SelectBlock
[wxWidgets.git] / src / gtk / cursor.cpp
index eac07cc9047a3bdf414e60082227418f2f2d4b2c..80f7c26d60cb6bb71cf12ba4d122e6fdef7865fb 100644 (file)
 #endif
 
 #include "wx/cursor.h"
+#include "wx/utils.h"
 
-#include "gdk/gdk.h"
+#include <gdk/gdk.h>
+
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
 
 //-----------------------------------------------------------------------------
 // wxCursor
@@ -57,32 +65,43 @@ wxCursor::wxCursor( int cursorId )
     GdkCursorType gdk_cur = GDK_LEFT_PTR;
     switch (cursorId)
     {
+        case wxCURSOR_DEFAULT:          gdk_cur = GDK_LEFT_PTR; break;
         case wxCURSOR_HAND:             gdk_cur = GDK_HAND1; break;
         case wxCURSOR_CROSS:            gdk_cur = GDK_CROSSHAIR; break;
         case wxCURSOR_SIZEWE:           gdk_cur = GDK_SB_H_DOUBLE_ARROW; break;
         case wxCURSOR_SIZENS:           gdk_cur = GDK_SB_V_DOUBLE_ARROW; break;
-        case wxCURSOR_WAIT:                                        
+        case wxCURSOR_WAIT:
         case wxCURSOR_WATCH:            gdk_cur = GDK_WATCH; break;
         case wxCURSOR_SIZING:           gdk_cur = GDK_SIZING; break;
         case wxCURSOR_SPRAYCAN:         gdk_cur = GDK_SPRAYCAN; break;
         case wxCURSOR_IBEAM:            gdk_cur = GDK_XTERM; break;
         case wxCURSOR_PENCIL:           gdk_cur = GDK_PENCIL; break;
         case wxCURSOR_NO_ENTRY:         gdk_cur = GDK_PIRATE; break;
-        case wxCURSOR_SIZENWSE:                                     
+        case wxCURSOR_SIZENWSE:
         case wxCURSOR_SIZENESW:         gdk_cur = GDK_FLEUR; break;
         case wxCURSOR_QUESTION_ARROW:   gdk_cur = GDK_QUESTION_ARROW; break;
-       case wxCURSOR_PAINT_BRUSH:      gdk_cur = GDK_SPRAYCAN; break;
-       case wxCURSOR_MAGNIFIER:        gdk_cur = GDK_PLUS; break;
-       case wxCURSOR_CHAR:             gdk_cur = GDK_XTERM; break;
+        case wxCURSOR_PAINT_BRUSH:      gdk_cur = GDK_SPRAYCAN; break;
+        case wxCURSOR_MAGNIFIER:        gdk_cur = GDK_PLUS; break;
+        case wxCURSOR_CHAR:             gdk_cur = GDK_XTERM; break;
         case wxCURSOR_LEFT_BUTTON:      gdk_cur = GDK_LEFTBUTTON; break;
         case wxCURSOR_MIDDLE_BUTTON:    gdk_cur = GDK_MIDDLEBUTTON; break;
         case wxCURSOR_RIGHT_BUTTON:     gdk_cur = GDK_RIGHTBUTTON; break;
+        case wxCURSOR_BULLSEYE:         gdk_cur = GDK_TARGET; break;
+
+        case wxCURSOR_POINT_LEFT:       gdk_cur = GDK_SB_LEFT_ARROW; break;
+        case wxCURSOR_POINT_RIGHT:      gdk_cur = GDK_SB_RIGHT_ARROW; break;
 /*
-       case wxCURSOR_DOUBLE_ARROW:     gdk_cur = GDK_DOUBLE_ARROW; break;
-       case wxCURSOR_CROSS_REVERSE:    gdk_cur = GDK_CROSS_REVERSE; break;
+        case wxCURSOR_DOUBLE_ARROW:     gdk_cur = GDK_DOUBLE_ARROW; break;
+        case wxCURSOR_CROSS_REVERSE:    gdk_cur = GDK_CROSS_REVERSE; break;
         case wxCURSOR_BASED_ARROW_UP:   gdk_cur = GDK_BASED_ARROW_UP; break;
         case wxCURSOR_BASED_ARROW_DOWN: gdk_cur = GDK_BASED_ARROW_DOWN; break;
 */
+        default:
+            wxFAIL_MSG(wxT("unsupported cursor type"));
+            // will use the standard one
+
+        case wxCURSOR_ARROW:
+            break;
     }
 
     M_CURSORDATA->m_cursor = gdk_cursor_new( gdk_cur );
@@ -99,9 +118,11 @@ wxCursor::~wxCursor()
 
 wxCursor& wxCursor::operator = ( const wxCursor& cursor )
 {
-    if (*this == cursor) return (*this);
+    if (*this == cursor)
+        return (*this);
+
     Ref( cursor );
-    
+
     return *this;
 }
 
@@ -129,29 +150,46 @@ GdkCursor *wxCursor::GetCursor() const
 // busy cursor routines
 //-----------------------------------------------------------------------------
 
-bool g_isBusy = FALSE;
+extern wxCursor g_globalCursor;
+
+static wxCursor  gs_savedCursor;
+static int       gs_busyCount = 0;
 
 void wxEndBusyCursor()
 {
-    g_isBusy = FALSE;
+    if (--gs_busyCount > 0)
+        return;
+
+    wxSetCursor( gs_savedCursor );
+    gs_savedCursor = wxNullCursor;
+
+    wxYield();
 }
 
 void wxBeginBusyCursor( wxCursor *WXUNUSED(cursor) )
 {
-    g_isBusy = TRUE;
+    if (gs_busyCount++ > 0)
+        return;
+
+    wxASSERT_MSG( !gs_savedCursor.Ok(),
+                  wxT("forgot to call wxEndBusyCursor, will leak memory") );
+
+    gs_savedCursor = g_globalCursor;
+
+    wxSetCursor( wxCursor(wxCURSOR_WATCH) );
+
+    wxYield();
 }
 
 bool wxIsBusy()
 {
-    return g_isBusy;
+    return gs_busyCount > 0;
 }
 
 void wxSetCursor( const wxCursor& cursor )
 {
-    extern wxCursor *g_globalCursor;
-    if (g_globalCursor) (*g_globalCursor) = cursor;
+    if (g_isIdle)
+        wxapp_install_idle_handler();
 
-    if (cursor.Ok()) {}
+    g_globalCursor = cursor;
 }
-
-