]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/cursor.cpp
Correct the bounding box calculation in wxGTK wxDC::DrawBitmap().
[wxWidgets.git] / src / gtk / cursor.cpp
index 8e9c50a44e410e7634233c56e7d3ee1aca06b1cb..0dedcab00bc284214fef93b866bb7d4447ef1e1a 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,17 +47,79 @@ 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()
 {
 }
 
-wxCursor::wxCursor( int cursorId )
+#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,35 +185,6 @@ wxCursor::wxCursor( int cursorId )
     M_CURSORDATA->m_cursor = gdk_cursor_new( gdk_cur );
 }
 
-extern GtkWidget *wxGetRootWindow();
-
-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)
@@ -171,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();
@@ -304,10 +338,6 @@ wxCursor::wxCursor( const wxImage & image )
 
 #endif // wxUSE_IMAGE
 
-wxCursor::~wxCursor()
-{
-}
-
 GdkCursor *wxCursor::GetCursor() const
 {
     return M_CURSORDATA->m_cursor;
@@ -320,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));
 }
 
 //-----------------------------------------------------------------------------