]> git.saurik.com Git - wxWidgets.git/commitdiff
fix the wxCursor(const wxString& cursor_file, ...) ctor by reusing wxImage ctor;...
authorFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Sat, 16 May 2009 10:42:48 +0000 (10:42 +0000)
committerFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Sat, 16 May 2009 10:42:48 +0000 (10:42 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60648 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/cursor.h
include/wx/gtk/cursor.h
interface/wx/cursor.h
src/gtk/cursor.cpp

index f4c584fbcfcba87f4dbbb8dddabab15439fb7a70..ad1b0327523dca6e08e34d482b2fe7388fa65d7a 100644 (file)
 
 #include "wx/defs.h"
 
+/*
+    wxCursor classes should have the following public API:
+
+class WXDLLIMPEXP_CORE wxCursor : public wxGDIObject
+{
+public:
+    wxCursor();
+    wxCursor(const wxImage& image);
+    wxCursor(const wxString& name,
+             wxBitmapType type = wxCURSOR_DEFAULT_TYPE,
+             int hotSpotX = 0, int hotSpotY = 0);
+    wxCursor(wxStockCursor id) { InitFromStock(id); }
+#if WXWIN_COMPATIBILITY_2_8
+    wxCursor(int id) { InitFromStock((wxStockCursor)id); }
+#endif
+    virtual ~wxCursor();
+};
+
+*/
+
 #if defined(__WXPALMOS__)
     #define wxCURSOR_DEFAULT_TYPE   wxBITMAP_TYPE_CUR_RESOURCE
     #include "wx/palmos/cursor.h"
index 7c2021b8adcb46ba70d01934b1a62daf0b188875..066125bb8e51c13672cef2af367db0b7015896f5 100644 (file)
@@ -30,14 +30,14 @@ public:
 #endif
 #if wxUSE_IMAGE
     wxCursor( const wxImage & image );
+    wxCursor(const wxString& name,
+             wxBitmapType type = wxCURSOR_DEFAULT_TYPE,
+             int hotSpotX = 0, int hotSpotY = 0);
 #endif
     wxCursor( const char bits[], int width, int height,
               int hotSpotX = -1, int hotSpotY = -1,
               const char maskBits[] = NULL,
               const wxColour* fg = NULL, const wxColour* bg = NULL);
-    wxCursor(const wxString& name,
-             wxBitmapType type = wxCURSOR_DEFAULT_TYPE,
-             int hotSpotX = 0, int hotSpotY = 0);
     virtual ~wxCursor();
 
     // implementation
@@ -46,6 +46,9 @@ public:
 
 protected:
     void InitFromStock(wxStockCursor);
+#if wxUSE_IMAGE
+    void InitFromImage(const wxImage& image);
+#endif
 
     virtual wxGDIRefData *CreateGDIRefData() const;
     virtual wxGDIRefData *CloneGDIRefData(const wxGDIRefData *data) const;
index b4c398cdbd0c670714b074806417a97a7966a217..7c778ab81ea75b5e8da764d9d3e2e7bed65668a9 100644 (file)
@@ -104,9 +104,9 @@ public:
         @param height
             Cursor height.
         @param hotSpotX
-            Hotspot x coordinate.
+            Hotspot x coordinate (relative to the top left of the image).
         @param hotSpotY
-            Hotspot y coordinate.
+            Hotspot y coordinate (relative to the top left of the image).
         @param maskBits
             Bits for a mask bitmap.
 
@@ -119,39 +119,32 @@ public:
     /**
         Constructs a cursor by passing a string resource name or filename.
 
-        @note
-        On MacOS when specifying a string resource name, first the color
-        cursors 'crsr' and then the black/white cursors 'CURS' in the resource
-        chain are scanned through.
-
-        @a hotSpotX and @a hotSpotY are currently only used under Windows when
-        loading from an icon file, to specify the cursor hotspot relative to
-        the top left of the image.
+        The arguments @a hotSpotX and @a hotSpotY are only used when there's no
+        hotspot info in the resource/image-file to load (e.g. when using
+        @c wxBITMAP_TYPE_ICO under wxMSW or @c wxBITMAP_TYPE_XPM under wxGTK).
 
         @param cursorName
             The name of the resource or the image file to load.
         @param type
-            Icon type to load. It defaults to wxCURSOR_DEFAULT_TYPE,
+            Icon type to load. It defaults to @c wxCURSOR_DEFAULT_TYPE,
             which is a @#define associated to different values on different
             platforms:
-            - under Windows, it defaults to wxBITMAP_TYPE_CUR_RESOURCE.
-            - under MacOS, it defaults to wxBITMAP_TYPE_MACCURSOR_RESOURCE.
-            - under GTK, it defaults to wxBITMAP_TYPE_XPM.
-            - under X11, it defaults to wxBITMAP_TYPE_XPM.
-            - under Motif, type defaults to wxBITMAP_TYPE_XBM.
-            Under Windows, the permitted types are:
-            - wxBITMAP_TYPE_CUR - Load a cursor from a .cur cursor file (only
-                                  if USE_RESOURCE_LOADING_IN_MSW is enabled in
-                                  setup.h).
-            - wxBITMAP_TYPE_CUR_RESOURCE - Load a Windows resource
-                                           (as specified in the .rc file).
-            - wxBITMAP_TYPE_ICO - Load a cursor from a .ico icon file (only if
-                                  USE_RESOURCE_LOADING_IN_MSW is enabled in
-                                  setup.h). Specify @a hotSpotX and @a hotSpotY.
+            - under Windows, it defaults to @c wxBITMAP_TYPE_CUR_RESOURCE.
+              Other permitted types under Windows are @c wxBITMAP_TYPE_CUR
+              (to load a cursor from a .cur cursor file) and @c wxBITMAP_TYPE_ICO
+              (to load a cursor from a .ico icon file).
+            - under MacOS, it defaults to @c wxBITMAP_TYPE_MACCURSOR_RESOURCE;
+              when specifying a string resource name, first the color cursors 'crsr' 
+              and then the black/white cursors 'CURS' in the resource chain are scanned 
+              through.
+            - under GTK, it defaults to @c wxBITMAP_TYPE_XPM. 
+              See the wxCursor(const wxImage& image) ctor for more info.
+            - under X11, it defaults to @c wxBITMAP_TYPE_XPM.
+            - under Motif, it defaults to @c wxBITMAP_TYPE_XBM.
         @param hotSpotX
-            Hotspot x coordinate.
+            Hotspot x coordinate (relative to the top left of the image).
         @param hotSpotY
-            Hotspot y coordinate.
+            Hotspot y coordinate (relative to the top left of the image).
     */
     wxCursor(const wxString& cursorName,
              wxBitmapType type = wxCURSOR_DEFAULT_TYPE,
index 2056e4692badd347dee0939c65f7484884c97ba2..a939e16fe4be5318c3c02dbd3b83cf9b5f86291b 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
@@ -23,7 +23,7 @@
 #include <gtk/gtk.h>
 
 //-----------------------------------------------------------------------------
-// wxCursor
+// wxCursorRefData
 //-----------------------------------------------------------------------------
 
 class wxCursorRefData: public wxGDIRefData
@@ -47,16 +47,78 @@ wxCursorRefData::~wxCursorRefData()
     if (m_cursor) gdk_cursor_unref( m_cursor );
 }
 
+
+//-----------------------------------------------------------------------------
+// wxCursor
 //-----------------------------------------------------------------------------
 
 #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 (!image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X))
+        img.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, hotSpotX);
+    if (!image.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();
@@ -123,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)
@@ -212,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();
@@ -345,10 +338,6 @@ wxCursor::wxCursor( const wxImage & image )
 
 #endif // wxUSE_IMAGE
 
-wxCursor::~wxCursor()
-{
-}
-
 GdkCursor *wxCursor::GetCursor() const
 {
     return M_CURSORDATA->m_cursor;