Kaydet (Commit) 83a5d1ee authored tarafından Caolán McNamara's avatar Caolán McNamara

figure out how to make new-style cursors from ye-oldy xbms

üst 0d2916e0
...@@ -333,25 +333,70 @@ long GtkSalDisplay::Dispatch( XEvent* pEvent ) ...@@ -333,25 +333,70 @@ long GtkSalDisplay::Dispatch( XEvent* pEvent )
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
} }
#if GTK_CHECK_VERSION(3,0,0)
namespace
{
//cairo annoyingly won't take raw xbm data unless it fits
//the required cairo stride
unsigned char* ensurePaddedForCairo(const unsigned char *pXBM,
int nWidth, int nHeight, int nStride)
{
unsigned char *pPaddedXBM = const_cast<unsigned char*>(pXBM);
int bytes_per_row = (nWidth + 7) / 8;
if (nStride != bytes_per_row)
{
pPaddedXBM = new unsigned char[nStride * nHeight];
for (int row = 0; row < nHeight; ++row)
{
memcpy(pPaddedXBM + (nStride * row),
pXBM + (bytes_per_row * row), bytes_per_row);
memset(pPaddedXBM + (nStride * row) + bytes_per_row,
0, nStride - bytes_per_row);
}
}
return pPaddedXBM;
}
}
#endif
GdkCursor* GtkSalDisplay::getFromXPM( const unsigned char *pBitmap, GdkCursor* GtkSalDisplay::getFromXPM( const unsigned char *pBitmap,
const unsigned char *pMask, const unsigned char *pMask,
int nWidth, int nHeight, int nWidth, int nHeight,
int nXHot, int nYHot ) int nXHot, int nYHot )
{ {
#if GTK_CHECK_VERSION(3,0,0) #if GTK_CHECK_VERSION(3,0,0)
g_warning ("FIXME: to use gdk_cursor_new_from_pixbuf instead of spiders"); int cairo_stride = cairo_format_stride_for_width(CAIRO_FORMAT_A1, nWidth);
// We need to do something like:
/* unsigned char *pPaddedXBM = ensurePaddedForCairo(pBitmap, nWidth, nHeight, cairo_stride);
GdkPixbuf *pPix = gdk_pixbuf_new_from_xpm_data (pBitmap); cairo_surface_t *s = cairo_image_surface_create_for_data(
GdkPixbuf *pMask = gdk_pixbuf_new_from_xpm_data (pMask); pPaddedXBM,
CAIRO_FORMAT_A1, nWidth, nHeight,
GdkCursor* gdk_cursor_new_from_pixbuf (GdkDisplay *display, cairo_stride);
GdkPixbuf *pixbuf,
gint x, cairo_t *cr = cairo_create(s);
gint y); unsigned char *pPaddedMaskXBM = ensurePaddedForCairo(pMask, nWidth, nHeight, cairo_stride);
*/ cairo_surface_t *mask = cairo_image_surface_create_for_data(
return gdk_cursor_new_for_display (gdk_display_get_default(), pPaddedMaskXBM,
GDK_SPIDER); CAIRO_FORMAT_A1, nWidth, nHeight,
cairo_stride);
cairo_mask_surface(cr, mask, 0, 0);
cairo_destroy(cr);
cairo_surface_destroy(mask);
if (pPaddedMaskXBM != pMask)
delete [] pPaddedMaskXBM;
GdkPixbuf *pixbuf = gdk_pixbuf_get_from_surface(s, 0, 0, nWidth, nHeight);
cairo_surface_destroy(s);
if (pPaddedXBM != pBitmap)
delete [] pPaddedXBM;
GdkCursor *cursor = gdk_cursor_new_from_pixbuf(m_pGdkDisplay, pixbuf, nXHot, nYHot);
g_object_unref(pixbuf);
return cursor;
#else #else
GdkScreen *pScreen = gdk_display_get_default_screen( m_pGdkDisplay ); GdkScreen *pScreen = gdk_display_get_default_screen( m_pGdkDisplay );
GdkDrawable *pDrawable = GDK_DRAWABLE( gdk_screen_get_root_window (pScreen) ); GdkDrawable *pDrawable = GDK_DRAWABLE( gdk_screen_get_root_window (pScreen) );
......
...@@ -2371,6 +2371,8 @@ void GtkSalFrame::UpdateSettings( AllSettings& rSettings ) ...@@ -2371,6 +2371,8 @@ void GtkSalFrame::UpdateSettings( AllSettings& rSettings )
#ifndef GTK_GRAPHICS_DISABLED #ifndef GTK_GRAPHICS_DISABLED
pGraphics->updateSettings( rSettings ); pGraphics->updateSettings( rSettings );
#else
(void)rSettings;
#endif #endif
if( bFreeGraphics ) if( bFreeGraphics )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment