]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/cursor.cpp
another (last?) FreeBSD thread compilation fix
[wxWidgets.git] / src / gtk1 / cursor.cpp
index eac07cc9047a3bdf414e60082227418f2f2d4b2c..7c497e454cc301f185dfb2f7073bfa0619f1ee7c 100644 (file)
@@ -61,28 +61,34 @@ wxCursor::wxCursor( int cursorId )
         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_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("unsupported cursor type");
+            // will use the standard one
+
+        case wxCURSOR_ARROW:
+            break;
     }
 
     M_CURSORDATA->m_cursor = gdk_cursor_new( gdk_cur );
@@ -99,9 +105,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 +137,48 @@ GdkCursor *wxCursor::GetCursor() const
 // busy cursor routines
 //-----------------------------------------------------------------------------
 
-bool g_isBusy = FALSE;
+extern wxCursor *g_globalCursor;
+
+static wxCursor *gs_savedCursor = NULL;
+static int       gs_busyCount = 0;
 
 void wxEndBusyCursor()
 {
-    g_isBusy = FALSE;
+    if ( --gs_busyCount > 0 )
+        return;
+
+    wxCHECK_RET( gs_savedCursor && gs_savedCursor->Ok(),
+                 "calling wxEndBusyCursor() without wxBeginBusyCursor()?" );
+
+    wxSetCursor(*gs_savedCursor);
+    delete gs_savedCursor;
+    gs_savedCursor = NULL;
 }
 
 void wxBeginBusyCursor( wxCursor *WXUNUSED(cursor) )
 {
-    g_isBusy = TRUE;
+    if ( gs_busyCount++ > 0 )
+        return;
+
+    wxASSERT_MSG( !gs_savedCursor,
+                  "forgot to call wxEndBusyCursor, will leak memory" );
+
+    gs_savedCursor = new wxCursor;
+    if ( g_globalCursor && g_globalCursor->Ok() )
+        *gs_savedCursor = *g_globalCursor;
+    else
+        *gs_savedCursor = wxCursor(wxCURSOR_ARROW);
+    wxSetCursor(wxCursor(wxCURSOR_WATCH));
 }
 
 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 (cursor.Ok()) {}
 }