diff --git a/docs/latex/wx/cursor.tex b/docs/latex/wx/cursor.tex index 7a07cdd229..52f428b2a6 100644 --- a/docs/latex/wx/cursor.tex +++ b/docs/latex/wx/cursor.tex @@ -74,13 +74,20 @@ Constructs a cursor using a cursor identifier. \func{}{wxCursor}{\param{const wxImage\&}{ image}} -Constructs a cursor from a wxImage. The cursor is monochrome, colors with the RGB elements all greater -than 127 will be foreground, colors less than this background. The mask (if any) will be used as transparent. +Constructs a cursor from a wxImage. If the cursor is monochrome on the current +platform, colors with the RGB elements all greater than 127 will be foreground, +colors less than this will be background. The mask (if any) will be used to specify the +transparent area. -In MSW the foreground will be white and the background black. If the cursor is larger than 32x32 it is resized. -In GTK, the two most frequent colors will be used for foreground and background. The cursor will be displayed -at the size of the image. -On MacOS if the cursor is larger than 16x16 it is resized and currently only shown as black/white (mask respected). +In wxMSW the foreground will be white and the background black. If the cursor +is larger than 32x32 it is resized. + +In wxGTK, colour cursors and alpha channel are supported (starting from GTK+ +2.2). Otherwise the two most frequent colors will be used for foreground and +background. In any case, the cursor will be displayed at the size of the image. + +In wxMac, if the cursor is larger than 16x16 it is resized and currently only +shown as black/white (mask respected). \func{}{wxCursor}{\param{const wxCursor\&}{ cursor}} diff --git a/src/gtk/cursor.cpp b/src/gtk/cursor.cpp index e4d57ea455..a4f1a0aff3 100644 --- a/src/gtk/cursor.cpp +++ b/src/gtk/cursor.cpp @@ -152,13 +152,53 @@ 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 ) { int w = image.GetWidth() ; int h = image.GetHeight(); bool bHasMask = image.HasMask(); + int hotSpotX, hotSpotY; + GetHotSpot(image, hotSpotX, hotSpotY); + m_refData = new wxCursorRefData; wxImage image_copy(image); + GdkDisplay* display = gdk_drawable_get_display(wxGetRootWindow()->window); + if (gdk_display_supports_cursor_color(display)) + { + if (!image.HasAlpha()) + { + // add alpha, so wxBitmap will convert to pixbuf format + image_copy.InitAlpha(); + } + wxBitmap bitmap(image_copy); + wxASSERT(bitmap.HasPixbuf()); + M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixbuf + ( + display, + bitmap.GetPixbuf(), + hotSpotX, hotSpotY + ); + return; + } + unsigned long keyMaskColor = 0; GdkPixmap* mask; if (bHasMask) @@ -250,25 +290,6 @@ 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; - - m_refData = new wxCursorRefData; M_CURSORDATA->m_cursor = gdk_cursor_new_from_pixmap ( bitmap.GetPixmap(),