X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/086b04762432e6d7a8c7edd9754d87602323fc03..89352653828ae50feab93f5e0fce628ea840927e:/src/gtk/cursor.cpp diff --git a/src/gtk/cursor.cpp b/src/gtk/cursor.cpp index 90d718db89..a323e44d69 100644 --- a/src/gtk/cursor.cpp +++ b/src/gtk/cursor.cpp @@ -15,11 +15,10 @@ #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/utils.h" + #include "wx/image.h" + #include "wx/colour.h" #endif // WX_PRECOMP -#include "wx/gtk/private.h" //for idle stuff - -#include #include //----------------------------------------------------------------------------- @@ -31,7 +30,7 @@ class wxCursorRefData: public wxObjectRefData public: wxCursorRefData(); - ~wxCursorRefData(); + virtual ~wxCursorRefData(); GdkCursor *m_cursor; }; @@ -88,7 +87,7 @@ wxCursor::wxCursor( int cursorId ) case wxCURSOR_ARROWWAIT: case wxCURSOR_WAIT: case wxCURSOR_WATCH: gdk_cur = GDK_WATCH; break; - case wxCURSOR_SIZING: gdk_cur = GDK_SIZING; break; + case wxCURSOR_SIZING: gdk_cur = GDK_FLEUR; 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; @@ -144,12 +143,7 @@ wxCursor::wxCursor(const char bits[], int width, int height, m_refData = new wxCursorRefData; M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap( - data, mask, -#if GTK_CHECK_VERSION(2, 6, 0) - fg->GetColor(), bg->GetColor(), -#else - wx_const_cast(GdkColor*, fg->GetColor()), wx_const_cast(GdkColor*, bg->GetColor()), -#endif + data, mask, fg->GetColor(), bg->GetColor(), hotSpotX, hotSpotY ); g_object_unref (data); @@ -158,6 +152,24 @@ wxCursor::wxCursor(const char bits[], int width, int height, #if wxUSE_IMAGE +static void GetHotSpot(const wxImage& image, int& x, int& y) +{ + if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X)) + x = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X); + else + x = 0; + + if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y)) + y = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y); + else + y = 0; + + if (x < 0 || x >= image.GetWidth()) + x = 0; + if (y < 0 || y >= image.GetHeight()) + y = 0; +} + wxCursor::wxCursor( const wxImage & image ) { unsigned char * rgbBits = image.GetData(); @@ -166,6 +178,58 @@ wxCursor::wxCursor( const wxImage & image ) bool bHasMask = image.HasMask(); int imagebitcount = (w*h)/8; +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + { + if ( gdk_display_supports_cursor_color(gdk_display_get_default()) ) + { + unsigned char rMask = 0, + gMask = 0, + bMask = 0; + if (bHasMask) + { + rMask = image.GetMaskRed(); + gMask = image.GetMaskGreen(); + bMask = image.GetMaskBlue(); + } + + GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, w, h); + unsigned char *alpha = image.HasAlpha() ? image.GetAlpha() : NULL; + unsigned char *out = gdk_pixbuf_get_pixels(pixbuf); + int rowpad = gdk_pixbuf_get_rowstride(pixbuf) - 4 * w; + for ( int y = 0; y < h; y++, out += rowpad ) + { + for ( int x = 0; x < w; x++, out += 4, rgbBits += 3 ) + { + out[0] = rgbBits[0]; + out[1] = rgbBits[1]; + out[2] = rgbBits[2]; + if (bHasMask && + out[0] == rMask && out[1] == gMask && out[2] == bMask) + out[3] = 0; + else + out[3] = alpha ? *alpha : 255; + if ( alpha ) + ++alpha; + } + } + + int hotSpotX, hotSpotY; + GetHotSpot(image, hotSpotX, hotSpotY); + + m_refData = new wxCursorRefData; + M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixbuf + ( + gdk_display_get_default(), + pixbuf, + hotSpotX, hotSpotY + ); + g_object_unref (pixbuf); + return; + } + } +#endif // GTK+ 2.4+ + unsigned char * bits = new unsigned char [imagebitcount]; unsigned char * maskBits = new unsigned char [imagebitcount]; @@ -272,23 +336,8 @@ wxCursor::wxCursor( const wxImage & image ) bg = tmp; } - int hotSpotX; - int hotSpotY; - - if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X)) - hotSpotX = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X); - else - hotSpotX = 0; - - if (image.HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y)) - hotSpotY = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y); - else - hotSpotY = 0; - - if (hotSpotX < 0 || hotSpotX >= w) - hotSpotX = 0; - if (hotSpotY < 0 || hotSpotY >= h) - hotSpotY = 0; + int hotSpotX, hotSpotY; + GetHotSpot(image, hotSpotX, hotSpotY); GdkBitmap *data = gdk_bitmap_create_from_data(wxGetRootWindow()->window, (gchar *) bits, w, h); @@ -300,11 +349,7 @@ wxCursor::wxCursor( const wxImage & image ) ( data, mask, -#if GTK_CHECK_VERSION(2, 6, 0) fg.GetColor(), bg.GetColor(), -#else - wx_const_cast(GdkColor*, fg.GetColor()), wx_const_cast(GdkColor*, bg.GetColor()), -#endif hotSpotX, hotSpotY ); @@ -320,17 +365,7 @@ wxCursor::~wxCursor() { } -bool wxCursor::operator == ( const wxCursor& cursor ) const -{ - return m_refData == cursor.m_refData; -} - -bool wxCursor::operator != ( const wxCursor& cursor ) const -{ - return m_refData != cursor.m_refData; -} - -bool wxCursor::Ok() const +bool wxCursor::IsOk() const { return (m_refData != NULL); } @@ -344,7 +379,9 @@ GdkCursor *wxCursor::GetCursor() const // busy cursor routines //----------------------------------------------------------------------------- -extern wxCursor g_globalCursor; +/* Current cursor, in order to hang on to + * cursor handle when setting the cursor globally */ +wxCursor g_globalCursor; static wxCursor gs_savedCursor; static int gs_busyCount = 0; @@ -396,8 +433,6 @@ bool wxIsBusy() void wxSetCursor( const wxCursor& cursor ) { - if (g_isIdle) - wxapp_install_idle_handler(); - g_globalCursor = cursor; + wxTheApp->WakeUpIdle(); }