Kaydet (Commit) 7adec6ba authored tarafından Caolán McNamara's avatar Caolán McNamara

split gtkdata into gtk3 and gtk3 versions

Change-Id: Ic102a5a1193a8bc50b460e5897b1ca488f0d4a65
üst 2ba53aee
...@@ -47,15 +47,6 @@ ...@@ -47,15 +47,6 @@
#include <vcl/svapp.hxx> #include <vcl/svapp.hxx>
#if GTK_CHECK_VERSION(3,0,0)
# ifdef GDK_WINDOWING_X11
# include <gdk/gdkx.h>
# endif
#else
# define GDK_WINDOWING_X11
# define GDK_IS_X11_DISPLAY(foo) (true)
#endif
using namespace vcl_sal; using namespace vcl_sal;
/*************************************************************** /***************************************************************
...@@ -72,19 +63,15 @@ GdkFilterReturn call_filterGdkEvent( GdkXEvent* sys_event, ...@@ -72,19 +63,15 @@ GdkFilterReturn call_filterGdkEvent( GdkXEvent* sys_event,
} }
GtkSalDisplay::GtkSalDisplay( GdkDisplay* pDisplay ) : GtkSalDisplay::GtkSalDisplay( GdkDisplay* pDisplay ) :
#if !GTK_CHECK_VERSION(3,0,0)
SalDisplay( gdk_x11_display_get_xdisplay( pDisplay ) ), SalDisplay( gdk_x11_display_get_xdisplay( pDisplay ) ),
#endif
m_pSys( GtkSalSystem::GetSingleton() ), m_pSys( GtkSalSystem::GetSingleton() ),
m_pGdkDisplay( pDisplay ), m_pGdkDisplay( pDisplay ),
m_bStartupCompleted( false ) m_bStartupCompleted( false )
{ {
for(GdkCursor* & rpCsr : m_aCursors) for(GdkCursor* & rpCsr : m_aCursors)
rpCsr = nullptr; rpCsr = nullptr;
#if !GTK_CHECK_VERSION(3,0,0)
m_bUseRandRWrapper = false; // use gdk signal instead m_bUseRandRWrapper = false; // use gdk signal instead
Init (); Init ();
#endif
// FIXME: unify this with SalInst's filter too ? // FIXME: unify this with SalInst's filter too ?
gdk_window_add_filter( nullptr, call_filterGdkEvent, this ); gdk_window_add_filter( nullptr, call_filterGdkEvent, this );
...@@ -92,23 +79,7 @@ GtkSalDisplay::GtkSalDisplay( GdkDisplay* pDisplay ) : ...@@ -92,23 +79,7 @@ GtkSalDisplay::GtkSalDisplay( GdkDisplay* pDisplay ) :
if ( getenv( "SAL_IGNOREXERRORS" ) ) if ( getenv( "SAL_IGNOREXERRORS" ) )
GetGenericData()->ErrorTrapPush(); // and leak the trap GetGenericData()->ErrorTrapPush(); // and leak the trap
#if GTK_CHECK_VERSION(3,0,0)
m_bX11Display = GDK_IS_X11_DISPLAY( m_pGdkDisplay );
#else
m_bX11Display = true; m_bX11Display = true;
#endif
#if GTK_CHECK_VERSION(3,10,0)
#ifdef GDK_WINDOWING_X11
if (m_bX11Display)
{
if (!getenv("GDK_SCALE"))
{
gdk_x11_display_set_window_scale(m_pGdkDisplay, 1);
}
}
#endif
#endif
gtk_widget_set_default_direction(AllSettings::GetLayoutRTL() ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR); gtk_widget_set_default_direction(AllSettings::GetLayoutRTL() ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
} }
...@@ -120,10 +91,8 @@ GtkSalDisplay::~GtkSalDisplay() ...@@ -120,10 +91,8 @@ GtkSalDisplay::~GtkSalDisplay()
if( !m_bStartupCompleted ) if( !m_bStartupCompleted )
gdk_notify_startup_complete(); gdk_notify_startup_complete();
#if !GTK_CHECK_VERSION(3,0,0)
doDestruct(); doDestruct();
pDisp_ = nullptr; pDisp_ = nullptr;
#endif
for(GdkCursor* & rpCsr : m_aCursors) for(GdkCursor* & rpCsr : m_aCursors)
if( rpCsr ) if( rpCsr )
...@@ -149,7 +118,6 @@ void signalMonitorsChanged( GdkScreen* pScreen, gpointer data ) ...@@ -149,7 +118,6 @@ void signalMonitorsChanged( GdkScreen* pScreen, gpointer data )
GdkFilterReturn GtkSalDisplay::filterGdkEvent( GdkXEvent* sys_event, GdkFilterReturn GtkSalDisplay::filterGdkEvent( GdkXEvent* sys_event,
GdkEvent* ) GdkEvent* )
{ {
#if !GTK_CHECK_VERSION(3,0,0)
GdkFilterReturn aFilterReturn = GDK_FILTER_CONTINUE; GdkFilterReturn aFilterReturn = GDK_FILTER_CONTINUE;
XEvent *pEvent = static_cast<XEvent *>(sys_event); XEvent *pEvent = static_cast<XEvent *>(sys_event);
...@@ -192,12 +160,6 @@ GdkFilterReturn GtkSalDisplay::filterGdkEvent( GdkXEvent* sys_event, ...@@ -192,12 +160,6 @@ GdkFilterReturn GtkSalDisplay::filterGdkEvent( GdkXEvent* sys_event,
} }
return aFilterReturn; return aFilterReturn;
#else
(void) this; // loplugin:staticmethods
(void) sys_event;
//FIXME: implement filterGdkEvent ...
return GDK_FILTER_CONTINUE;
#endif
} }
void GtkSalDisplay::screenSizeChanged( GdkScreen* pScreen ) void GtkSalDisplay::screenSizeChanged( GdkScreen* pScreen )
...@@ -214,7 +176,6 @@ void GtkSalDisplay::monitorsChanged( GdkScreen* pScreen ) ...@@ -214,7 +176,6 @@ void GtkSalDisplay::monitorsChanged( GdkScreen* pScreen )
emitDisplayChanged(); emitDisplayChanged();
} }
#if !GTK_CHECK_VERSION(3,0,0)
SalDisplay::ScreenData * SalDisplay::ScreenData *
GtkSalDisplay::initScreen( SalX11Screen nXScreen ) const GtkSalDisplay::initScreen( SalX11Screen nXScreen ) const
{ {
...@@ -262,73 +223,12 @@ bool GtkSalDisplay::Dispatch( XEvent* pEvent ) ...@@ -262,73 +223,12 @@ bool GtkSalDisplay::Dispatch( XEvent* pEvent )
return false; return false;
} }
#endif
#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::getFromXBM( const unsigned char *pBitmap, GdkCursor* GtkSalDisplay::getFromXBM( 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)
int cairo_stride = cairo_format_stride_for_width(CAIRO_FORMAT_A1, nWidth);
unsigned char *pPaddedXBM = ensurePaddedForCairo(pBitmap, nWidth, nHeight, cairo_stride);
cairo_surface_t *s = cairo_image_surface_create_for_data(
pPaddedXBM,
CAIRO_FORMAT_A1, nWidth, nHeight,
cairo_stride);
cairo_t *cr = cairo_create(s);
unsigned char *pPaddedMaskXBM = ensurePaddedForCairo(pMask, nWidth, nHeight, cairo_stride);
cairo_surface_t *mask = cairo_image_surface_create_for_data(
pPaddedMaskXBM,
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
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) );
GdkBitmap *pBitmapPix = gdk_bitmap_create_from_data GdkBitmap *pBitmapPix = gdk_bitmap_create_from_data
...@@ -346,7 +246,6 @@ GdkCursor* GtkSalDisplay::getFromXBM( const unsigned char *pBitmap, ...@@ -346,7 +246,6 @@ GdkCursor* GtkSalDisplay::getFromXBM( const unsigned char *pBitmap,
return gdk_cursor_new_from_pixmap return gdk_cursor_new_from_pixmap
( pBitmapPix, pMaskPix, ( pBitmapPix, pMaskPix,
&aBlack, &aWhite, nXHot, nYHot); &aBlack, &aWhite, nXHot, nYHot);
#endif
} }
#define MAKE_CURSOR( vcl_name, name ) \ #define MAKE_CURSOR( vcl_name, name ) \
...@@ -521,11 +420,7 @@ int GtkSalDisplay::CaptureMouse( SalFrame* pSFrame ) ...@@ -521,11 +420,7 @@ int GtkSalDisplay::CaptureMouse( SalFrame* pSFrame )
**********************************************************************/ **********************************************************************/
GtkData::GtkData( SalInstance *pInstance ) GtkData::GtkData( SalInstance *pInstance )
#if GTK_CHECK_VERSION(3,0,0)
: SalGenericData( SAL_DATA_GTK3, pInstance )
#else
: SalGenericData( SAL_DATA_GTK, pInstance ) : SalGenericData( SAL_DATA_GTK, pInstance )
#endif
, m_aDispatchMutex() , m_aDispatchMutex()
, blockIdleTimeout( false ) , blockIdleTimeout( false )
{ {
...@@ -533,7 +428,6 @@ GtkData::GtkData( SalInstance *pInstance ) ...@@ -533,7 +428,6 @@ GtkData::GtkData( SalInstance *pInstance )
m_aDispatchCondition = osl_createCondition(); m_aDispatchCondition = osl_createCondition();
} }
#if defined(GDK_WINDOWING_X11)
XIOErrorHandler aOrigXIOErrorHandler = nullptr; XIOErrorHandler aOrigXIOErrorHandler = nullptr;
extern "C" { extern "C" {
...@@ -547,7 +441,6 @@ static int XIOErrorHdl(Display *) ...@@ -547,7 +441,6 @@ static int XIOErrorHdl(Display *)
} }
} }
#endif
GtkData::~GtkData() GtkData::~GtkData()
{ {
...@@ -566,10 +459,7 @@ GtkData::~GtkData() ...@@ -566,10 +459,7 @@ GtkData::~GtkData()
m_pUserEvent = nullptr; m_pUserEvent = nullptr;
} }
osl_destroyCondition( m_aDispatchCondition ); osl_destroyCondition( m_aDispatchCondition );
#if defined(GDK_WINDOWING_X11) XSetIOErrorHandler(aOrigXIOErrorHandler);
if (GDK_IS_X11_DISPLAY(gdk_display_get_default()))
XSetIOErrorHandler(aOrigXIOErrorHandler);
#endif
} }
void GtkData::Dispose() void GtkData::Dispose()
...@@ -642,9 +532,7 @@ void GtkData::Init() ...@@ -642,9 +532,7 @@ void GtkData::Init()
SAL_INFO( "vcl.gtk", "GtkMainloop::Init()" ); SAL_INFO( "vcl.gtk", "GtkMainloop::Init()" );
XrmInitialize(); XrmInitialize();
#if !GTK_CHECK_VERSION(3,0,0)
gtk_set_locale(); gtk_set_locale();
#endif
/* /*
* open connection to X11 Display * open connection to X11 Display
...@@ -724,12 +612,8 @@ void GtkData::Init() ...@@ -724,12 +612,8 @@ void GtkData::Init()
exit(0); exit(0);
} }
#if defined(GDK_WINDOWING_X11) aOrigXIOErrorHandler = XSetIOErrorHandler(XIOErrorHdl);
if (GDK_IS_X11_DISPLAY(pGdkDisp))
aOrigXIOErrorHandler = XSetIOErrorHandler(XIOErrorHdl);
#endif
#if !GTK_CHECK_VERSION(3,0,0)
/* /*
* if a -display switch was used, we need * if a -display switch was used, we need
* to set the environment accordingly since * to set the environment accordingly since
...@@ -740,12 +624,10 @@ void GtkData::Init() ...@@ -740,12 +624,10 @@ void GtkData::Init()
const gchar *name = gdk_display_get_name( pGdkDisp ); const gchar *name = gdk_display_get_name( pGdkDisp );
OUString envValue(name, strlen(name), aEnc); OUString envValue(name, strlen(name), aEnc);
osl_setEnvironment(envVar.pData, envValue.pData); osl_setEnvironment(envVar.pData, envValue.pData);
#endif
GtkSalDisplay *pDisplay = new GtkSalDisplay( pGdkDisp ); GtkSalDisplay *pDisplay = new GtkSalDisplay( pGdkDisp );
SetDisplay( pDisplay ); SetDisplay( pDisplay );
#if !GTK_CHECK_VERSION(3,0,0)
Display *pDisp = gdk_x11_display_get_xdisplay( pGdkDisp ); Display *pDisp = gdk_x11_display_get_xdisplay( pGdkDisp );
gdk_error_trap_push(); gdk_error_trap_push();
...@@ -755,9 +637,6 @@ void GtkData::Init() ...@@ -755,9 +637,6 @@ void GtkData::Init()
pKbdExtension->UseExtension( bErrorOccured ); pKbdExtension->UseExtension( bErrorOccured );
gdk_error_trap_pop(); gdk_error_trap_pop();
GetGtkDisplay()->SetKbdExtension( pKbdExtension ); GetGtkDisplay()->SetKbdExtension( pKbdExtension );
#else
//FIXME: unwind keyboard extension bits
#endif
// add signal handler to notify screen size changes // add signal handler to notify screen size changes
int nScreens = gdk_display_get_n_screens( pGdkDisp ); int nScreens = gdk_display_get_n_screens( pGdkDisp );
...@@ -783,15 +662,7 @@ void GtkData::ErrorTrapPush() ...@@ -783,15 +662,7 @@ void GtkData::ErrorTrapPush()
bool GtkData::ErrorTrapPop( bool bIgnoreError ) bool GtkData::ErrorTrapPop( bool bIgnoreError )
{ {
#if GTK_CHECK_VERSION(3,0,0)
if( bIgnoreError )
{
gdk_error_trap_pop_ignored (); // faster
return false;
}
#else
(void) bIgnoreError; (void) bIgnoreError;
#endif
return gdk_error_trap_pop () != 0; return gdk_error_trap_pop () != 0;
} }
......
This diff is collapsed.
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