From d6764050d805a7e7575ba7126e2f78bd64db8117 Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Sat, 16 May 2009 10:42:48 +0000 Subject: [PATCH] fix the wxCursor(const wxString& cursor_file, ...) ctor by reusing wxImage ctor; fix doxygen rendering of that ctor docs git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60648 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/cursor.h | 20 ++++++ include/wx/gtk/cursor.h | 9 ++- interface/wx/cursor.h | 47 ++++++-------- src/gtk/cursor.cpp | 141 ++++++++++++++++++---------------------- 4 files changed, 111 insertions(+), 106 deletions(-) diff --git a/include/wx/cursor.h b/include/wx/cursor.h index f4c584fbcf..ad1b032752 100644 --- a/include/wx/cursor.h +++ b/include/wx/cursor.h @@ -14,6 +14,26 @@ #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" diff --git a/include/wx/gtk/cursor.h b/include/wx/gtk/cursor.h index 7c2021b8ad..066125bb8e 100644 --- a/include/wx/gtk/cursor.h +++ b/include/wx/gtk/cursor.h @@ -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; diff --git a/interface/wx/cursor.h b/interface/wx/cursor.h index b4c398cdbd..7c778ab81e 100644 --- a/interface/wx/cursor.h +++ b/interface/wx/cursor.h @@ -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, diff --git a/src/gtk/cursor.cpp b/src/gtk/cursor.cpp index 2056e4692b..a939e16fe4 100644 --- a/src/gtk/cursor.cpp +++ b/src/gtk/cursor.cpp @@ -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 //----------------------------------------------------------------------------- -// 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(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; -- 2.47.2