]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/cursor.cpp
Swap client data pointers in wxRearrangeList too.
[wxWidgets.git] / src / gtk / cursor.cpp
index 8c0eee4f3a9eeb177a6b4506339b4d6dead27b51..6da4ba4d9627544192afd7de209c0ad1532fe994 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        src/gtk/cursor.cpp
-// Purpose:
+// Purpose:     wxCursor implementation
 // Author:      Robert Roebling
 // Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling
     #include "wx/app.h"
     #include "wx/image.h"
     #include "wx/bitmap.h"
+    #include "wx/log.h"
 #endif // WX_PRECOMP
 
 #include <gtk/gtk.h>
 
 //-----------------------------------------------------------------------------
-// wxCursor
+// wxCursorRefData
 //-----------------------------------------------------------------------------
 
 class wxCursorRefData: public wxGDIRefData
@@ -38,7 +39,7 @@ public:
 
 wxCursorRefData::wxCursorRefData()
 {
-    m_cursor = (GdkCursor *) NULL;
+    m_cursor = NULL;
 }
 
 wxCursorRefData::~wxCursorRefData()
@@ -46,16 +47,78 @@ wxCursorRefData::~wxCursorRefData()
     if (m_cursor) gdk_cursor_unref( m_cursor );
 }
 
+
+//-----------------------------------------------------------------------------
+// wxCursor
 //-----------------------------------------------------------------------------
 
-#define M_CURSORDATA wx_static_cast(wxCursorRefData*, m_refData)
+#define M_CURSORDATA static_cast<wxCursorRefData*>(m_refData)
 
 IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxGDIObject)
 
+// used in the following two ctors
+extern GtkWidget *wxGetRootWindow();
+
+
 wxCursor::wxCursor()
 {
 }
 
+#if wxUSE_IMAGE
+wxCursor::wxCursor(const wxString& cursor_file,
+                   wxBitmapType type,
+                   int hotSpotX, int hotSpotY)
+{
+    wxImage img;
+    if (!img.LoadFile(cursor_file, type))
+        return;
+
+    // eventually set the hotspot:
+    if (!img.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X))
+        img.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, hotSpotX);
+    if (!img.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y))
+        img.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, hotSpotY);
+
+    InitFromImage(img);
+}
+
+wxCursor::wxCursor(const wxImage& img)
+{
+    InitFromImage(img);
+}
+#endif
+
+wxCursor::wxCursor(const char bits[], int width, int height,
+                   int hotSpotX, int hotSpotY,
+                   const char maskBits[], const wxColour *fg, const wxColour *bg)
+{
+    if (!maskBits)
+        maskBits = bits;
+    if (!fg)
+        fg = wxBLACK;
+    if (!bg)
+        bg = wxWHITE;
+    if (hotSpotX < 0 || hotSpotX >= width)
+        hotSpotX = 0;
+    if (hotSpotY < 0 || hotSpotY >= height)
+        hotSpotY = 0;
+
+    GdkBitmap *data = gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) bits, width, height );
+    GdkBitmap *mask = gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) maskBits, width, height);
+
+    m_refData = new wxCursorRefData;
+    M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap(
+                 data, mask, fg->GetColor(), bg->GetColor(),
+                 hotSpotX, hotSpotY );
+
+    g_object_unref (data);
+    g_object_unref (mask);
+}
+
+wxCursor::~wxCursor()
+{
+}
+
 void wxCursor::InitFromStock( wxStockCursor cursorId )
 {
     m_refData = new wxCursorRefData();
@@ -122,75 +185,6 @@ void wxCursor::InitFromStock( wxStockCursor cursorId )
     M_CURSORDATA->m_cursor = gdk_cursor_new( gdk_cur );
 }
 
-
-// used in the following two ctors
-extern GtkWidget *wxGetRootWindow();
-
-wxCursor::wxCursor(const wxString& cursor_file,
-                   wxBitmapType type,
-                   int hotSpotX, int hotSpotY)
-{
-    /* TODO: test this code! */
-
-    // Must be an XBM file
-    if (type != wxBITMAP_TYPE_XPM) {
-        wxLogError("Invalid cursor bitmap type '%d'", type);
-        return;
-    }
-
-    // load the XPM
-    GdkBitmap *mask = NULL;
-    GdkBitmap *data = gdk_pixmap_create_from_xpm( wxGetRootWindow()->window,
-                                                  &mask, NULL, cursor_file.mb_str() );
-    if (!data)
-        return;
-
-    // check given hotspot
-    gint w, h;
-    gdk_drawable_get_size( data, &w, &h );
-    if (hotSpotX < 0 || hotSpotX >= w)
-        hotSpotX = 0;
-    if (hotSpotY < 0 || hotSpotY >= h)
-        hotSpotY = 0;
-
-    // create the real cursor
-    m_refData = new wxCursorRefData;
-    M_CURSORDATA->m_cursor =
-        gdk_cursor_new_from_pixmap( data, mask,
-                                    wxBLACK->GetColor(), wxWHITE->GetColor(),
-                                    hotSpotX, hotSpotY );
-
-    g_object_unref (data);
-    g_object_unref (mask);
-}
-
-wxCursor::wxCursor(const char bits[], int width, int height,
-                   int hotSpotX, int hotSpotY,
-                   const char maskBits[], const wxColour *fg, const wxColour *bg)
-{
-    if (!maskBits)
-        maskBits = bits;
-    if (!fg)
-        fg = wxBLACK;
-    if (!bg)
-        bg = wxWHITE;
-    if (hotSpotX < 0 || hotSpotX >= width)
-        hotSpotX = 0;
-    if (hotSpotY < 0 || hotSpotY >= height)
-        hotSpotY = 0;
-
-    GdkBitmap *data = gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) bits, width, height );
-    GdkBitmap *mask = gdk_bitmap_create_from_data( wxGetRootWindow()->window, (gchar *) maskBits, width, height);
-
-    m_refData = new wxCursorRefData;
-    M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap(
-                 data, mask, fg->GetColor(), bg->GetColor(),
-                 hotSpotX, hotSpotY );
-
-    g_object_unref (data);
-    g_object_unref (mask);
-}
-
 #if wxUSE_IMAGE
 
 static void GetHotSpot(const wxImage& image, int& x, int& y)
@@ -211,7 +205,7 @@ static void GetHotSpot(const wxImage& image, int& x, int& y)
         y = 0;
 }
 
-wxCursor::wxCursor( const wxImage & image )
+void wxCursor::InitFromImage( const wxImage & image )
 {
     int w = image.GetWidth() ;
     int h = image.GetHeight();
@@ -344,10 +338,6 @@ wxCursor::wxCursor( const wxImage & image )
 
 #endif // wxUSE_IMAGE
 
-wxCursor::~wxCursor()
-{
-}
-
 GdkCursor *wxCursor::GetCursor() const
 {
     return M_CURSORDATA->m_cursor;
@@ -360,7 +350,7 @@ wxGDIRefData *wxCursor::CreateGDIRefData() const
 
 wxGDIRefData *wxCursor::CloneGDIRefData(const wxGDIRefData *data) const
 {
-    return new wxCursorRefData(*wx_static_cast(const wxCursorRefData *, data));
+    return new wxCursorRefData(*static_cast<const wxCursorRefData *>(data));
 }
 
 //-----------------------------------------------------------------------------
@@ -384,7 +374,7 @@ const wxCursor wxBusyCursor::GetBusyCursor()
     return wxCursor(wxCURSOR_WATCH);
 }
 
-static void InternalIdle(const wxWindowList& list, GdkDisplay*& display)
+static void UpdateCursors(const wxWindowList& list, GdkDisplay*& display)
 {
     wxWindowList::const_iterator i = list.begin();
     for (size_t n = list.size(); n--; ++i)
@@ -392,8 +382,8 @@ static void InternalIdle(const wxWindowList& list, GdkDisplay*& display)
         wxWindow* win = *i;
         if (display == NULL && win->m_widget && win->m_widget->window)
             display = gdk_drawable_get_display(win->m_widget->window);
-        win->OnInternalIdle();
-        InternalIdle(win->GetChildren(), display);
+        win->GTKUpdateCursor(true, false);
+        UpdateCursors(win->GetChildren(), display);
     }
 }
 
@@ -405,7 +395,7 @@ void wxEndBusyCursor()
     g_globalCursor = gs_savedCursor;
     gs_savedCursor = wxNullCursor;
     GdkDisplay* unused = NULL;
-    InternalIdle(wxTopLevelWindows, unused);
+    UpdateCursors(wxTopLevelWindows, unused);
 }
 
 void wxBeginBusyCursor(const wxCursor* cursor)
@@ -419,7 +409,7 @@ void wxBeginBusyCursor(const wxCursor* cursor)
     gs_savedCursor = g_globalCursor;
     g_globalCursor = *cursor;
     GdkDisplay* display = NULL;
-    InternalIdle(wxTopLevelWindows, display);
+    UpdateCursors(wxTopLevelWindows, display);
     if (display)
         gdk_display_flush(display);
 }
@@ -432,5 +422,6 @@ bool wxIsBusy()
 void wxSetCursor( const wxCursor& cursor )
 {
     g_globalCursor = cursor;
-    wxTheApp->WakeUpIdle();
+    GdkDisplay* unused = NULL;
+    UpdateCursors(wxTopLevelWindows, unused);
 }