[Libreoffice-commits] .: Branch 'feature/gtk3' - 2 commits - vcl/inc vcl/unx
Michael Meeks
michael at kemper.freedesktop.org
Wed Aug 17 06:57:34 PDT 2011
vcl/inc/svdata.hxx | 2
vcl/inc/unx/gtk/gtkgdi.hxx | 23 ++-
vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx | 9 +
vcl/unx/gtk/window/gtkframe.cxx | 116 -----------------
vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx | 177 ++++++++++++++++++++++++++
5 files changed, 205 insertions(+), 122 deletions(-)
New commits:
commit 802445bba7f6bffe6ebe6af0068a2f6eadaecb81
Author: Lucas Baudin <xapantu at gmail.com>
Date: Wed Aug 17 14:55:00 2011 +0100
gtk3: implement initial native widget support for buttons
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx
index b08fcf7..5074d16 100644
--- a/vcl/inc/unx/gtk/gtkgdi.hxx
+++ b/vcl/inc/unx/gtk/gtkgdi.hxx
@@ -52,6 +52,21 @@ public:
long nSrcWidth, long nSrcHeight,
sal_uInt16 /*nFlags*/ );
void updateSettings( AllSettings& rSettings );
+ virtual sal_Bool drawNativeControl( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion,
+ ControlState nState, const ImplControlValue& aValue,
+ const rtl::OUString& rCaption );
+ virtual sal_Bool IsNativeControlSupported( ControlType nType, ControlPart nPart );
+ virtual sal_Bool getNativeControlRegion( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion,
+ ControlState nState,
+ const ImplControlValue& aValue,
+ const rtl::OUString& rCaption,
+ Rectangle &rNativeBoundingRegion,
+ Rectangle &rNativeContentRegion );
+private:
+ GtkWidget *mpWindow;
+ GtkStyleContext *mpButtonStyle;
};
#else
diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
index 5a6179a..ae655dd 100644
--- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
@@ -29,6 +29,91 @@
// Gross inclusion hacks for now ...
#include "../../headless/svpgdi.cxx"
+#include <unx/gtk/gtkframe.hxx>
+#include <unx/gtk/gtkdata.hxx>
+#include <unx/gtk/gtkinst.hxx>
+#include <unx/gtk/gtkgdi.hxx>
+
+/************************************************************************
+ * State conversion
+ ************************************************************************/
+static void NWConvertVCLStateToGTKState( ControlState nVCLState,
+ GtkStateFlags* nGTKState, GtkShadowType* nGTKShadow )
+{
+ *nGTKShadow = GTK_SHADOW_OUT;
+ *nGTKState = GTK_STATE_FLAG_INSENSITIVE;
+
+ if ( nVCLState & CTRL_STATE_ENABLED )
+ {
+ if ( nVCLState & CTRL_STATE_PRESSED )
+ {
+ *nGTKState = GTK_STATE_FLAG_ACTIVE;
+ *nGTKShadow = GTK_SHADOW_IN;
+ }
+ else if ( nVCLState & CTRL_STATE_ROLLOVER )
+ {
+ *nGTKState = GTK_STATE_FLAG_PRELIGHT;
+ *nGTKShadow = GTK_SHADOW_OUT;
+ }
+ else
+ {
+ *nGTKState = GTK_STATE_FLAG_NORMAL;
+ *nGTKShadow = GTK_SHADOW_OUT;
+ }
+ }
+}
+
+sal_Bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion,
+ ControlState nState, const ImplControlValue& aValue,
+ const rtl::OUString& rCaption )
+{
+ GtkStateFlags flags;
+ GtkShadowType shadow;
+ NWConvertVCLStateToGTKState(nState, &flags, &shadow);
+ cairo_t* cr = gdk_cairo_create(gtk_widget_get_window(mpWindow));
+ switch(nType)
+ {
+ case CTRL_PUSHBUTTON:
+ if(!GTK_IS_STYLE_CONTEXT(mpButtonStyle))
+ {
+ mpButtonStyle = gtk_widget_get_style_context(gtk_button_new());
+ }
+
+ gtk_style_context_set_state(mpButtonStyle, flags);
+
+ gtk_render_background(mpButtonStyle, cr,
+ rControlRegion.Left(), rControlRegion.Top(),
+ rControlRegion.GetWidth(), rControlRegion.GetHeight());
+ gtk_render_frame(mpButtonStyle, cr,
+ rControlRegion.Left(), rControlRegion.Top(),
+ rControlRegion.GetWidth(), rControlRegion.GetHeight());
+
+ return sal_True;
+ default:
+ return sal_False;
+ }
+ cairo_destroy(cr);
+}
+
+sal_Bool GtkSalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion, ControlState nState,
+ const ImplControlValue& aValue, const rtl::OUString& rCaption,
+ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion )
+{
+ switch(nType)
+ {
+ default:
+ return sal_False;
+ }
+}
+
+sal_Bool GtkSalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart )
+{
+#if 0
+ if(nType == CTRL_PUSHBUTTON)
+ return sal_True;
+#endif
+ return sal_False;
+}
void GtkData::initNWF() {}
void GtkData::deInitNWF() {}
@@ -123,5 +208,4 @@ void GtkSalGraphics::copyArea( long nDestX, long nDestY,
cairo_region_destroy( region );
}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit bb5e3306dab8f52cb7dfb9a544ce44d3e31ac6e7
Author: Michael Meeks <michael.meeks at novell.com>
Date: Wed Aug 17 14:33:25 2011 +0100
remove conditionals, and split pieces into salnativewidgets
diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx
index 5918380..c27636c 100644
--- a/vcl/inc/svdata.hxx
+++ b/vcl/inc/svdata.hxx
@@ -306,7 +306,7 @@ struct ImplSVNWFData
// toolbox dropdown buttons
int mnMenuFormatExtraBorder; // inner popup menu border
bool mbFlatMenu; // no popup 3D border
- Color maMenuBarHighlightTextColor; // override higlight text color
+ ::Color maMenuBarHighlightTextColor; // override higlight text color
// in menubar if not transparent
bool mbOpenMenuOnF10; // on gnome the first menu opens on F10
bool mbNoFocusRects; // on Aqua focus rects are not used
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx
index e008089..b08fcf7 100644
--- a/vcl/inc/unx/gtk/gtkgdi.hxx
+++ b/vcl/inc/unx/gtk/gtkgdi.hxx
@@ -41,9 +41,6 @@
#include <unx/headless/svpgdi.hxx>
-// Disabled for gtk3 - use legacy theming code
-#define GTK_GRAPHICS_DISABLED
-
class GtkSalFrame;
class GtkSalGraphics : public SvpSalGraphics
{
@@ -65,10 +62,7 @@ class GtkSalGraphics : public X11SalGraphics
Region m_aClipRegion;
public:
- GtkSalGraphics( GtkSalFrame *, GtkWidget *window )
- : m_pWindow( window ),
- m_aClipRegion( REGION_NULL )
- {}
+ GtkSalGraphics( GtkSalFrame *, GtkWidget *window );
virtual ~GtkSalGraphics();
inline GtkWidget* GetGtkWidget() const { return m_pWindow; }
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
index 5901f86..c8cbdd5 100644
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
@@ -56,6 +56,15 @@ sal_Bool GtkSalGraphics::bGlobalNeedPixmapPaint = sal_False;
sal_Bool GtkSalGraphics::bToolbarGripWorkaround = sal_False;
sal_Bool GtkSalGraphics::bNeedButtonStyleAsEditBackgroundWorkaround = sal_False;
+GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow )
+ : X11SalGraphics(),
+ m_pWindow( pWindow ),
+ m_aClipRegion( REGION_NULL )
+{
+ Init( pFrame, GDK_WINDOW_XID( widget_get_window( pWindow ) ),
+ gdk_x11_screen_get_screen_number( gtk_widget_get_screen( pWindow ) ) );
+}
+
GtkSalGraphics::~GtkSalGraphics()
{
}
diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx
index 251ec93..f080e4f 100644
--- a/vcl/unx/gtk/window/gtkframe.cxx
+++ b/vcl/unx/gtk/window/gtkframe.cxx
@@ -2570,9 +2570,7 @@ void GtkSalFrame::createNewWindow( XLIB_Window aNewParent, bool bXEmbed, int nSc
if( m_aGraphics[i].bInUse )
{
m_aGraphics[i].pGraphics->SetDrawable( GDK_WINDOW_XWINDOW(widget_get_window(m_pWindow)), m_nScreen );
-#ifndef GTK_GRAPHICS_DISABLED
m_aGraphics[i].pGraphics->SetWindow( m_pWindow );
-#endif
}
}
#endif
@@ -3513,9 +3511,6 @@ void GtkSalFrame::signalStyleSet( GtkWidget*, GtkStyle* pPrevious, gpointer fram
aWin,
pThis->m_hBackgroundPixmap );
}
-#endif
-
-#ifndef GTK_GRAPHICS_DISABLED
if( ! pThis->m_pParent )
{
// signalize theme changed for NWF caches
@@ -4140,115 +4135,6 @@ gboolean GtkSalFrame::IMHandler::signalIMDeleteSurrounding( GtkIMContext*, gint
return sal_False;
}
-#ifdef GTK_GRAPHICS_DISABLED
-
-void GtkData::initNWF() {}
-void GtkData::deInitNWF() {}
-
-#if !GTK_CHECK_VERSION(3,0,0)
-
-GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow )
- : X11SalGraphics()
-{
- Init( pFrame, GDK_WINDOW_XID( widget_get_window( pWindow ) ),
- gdk_x11_screen_get_screen_number( gtk_widget_get_screen( pWindow ) ) );
-}
-
-#else
-
-GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow )
- : SvpSalGraphics(),
- mpFrame( pFrame )
-{
-}
-
-void GtkSalGraphics::updateSettings( AllSettings& rSettings )
-{
- g_warning ("unimplemented GtkSalGraphics update");
-}
-
-static void print_cairo_region (cairo_region_t *region, const char *msg)
-{
- if (!region) {
- fprintf (stderr, "%s - NULL\n", msg);
- return;
- }
- int numrect = cairo_region_num_rectangles (region);
- fprintf (stderr, "%s - %d rects\n", msg, numrect);
- for (int i = 0; i < numrect; i++) {
- cairo_rectangle_int_t rect;
- cairo_region_get_rectangle (region, i, &rect);
- fprintf( stderr, "\t%d -> %d,%d %dx%d\n", i,
- rect.x, rect.y, rect.width, rect.height );
- }
-}
-
-static void print_update_area (GdkWindow *window, const char *msg)
-{
- print_cairo_region (gdk_window_get_update_area (window), msg);
-}
-
-void GtkSalGraphics::copyArea( long nDestX, long nDestY,
- long nSrcX, long nSrcY,
- long nSrcWidth, long nSrcHeight,
- sal_uInt16 nFlags )
-{
- mpFrame->pushIgnoreDamage();
- SvpSalGraphics::copyArea( nDestX, nDestY, nSrcX, nSrcY, nSrcWidth, nSrcHeight, nFlags );
- mpFrame->popIgnoreDamage();
-
- cairo_rectangle_int_t rect = { (int)nSrcX, (int)nSrcY, (int)nSrcWidth, (int)nSrcHeight };
- cairo_region_t *region = cairo_region_create_rectangle( &rect );
-
- print_update_area( gtk_widget_get_window( mpFrame->getWindow() ), "before copy area" );
-
-// print_cairo_region( mpFrame->m_pRegion, "extremely odd SalFrame: shape combine region! - ");
-
- g_warning( "FIXME: copy area delta: %d %d needs clip intersect\n",
- nDestX - nSrcX, nDestY - nSrcY );
-
- // get clip region and translate it in the opposite direction & intersect ...
- cairo_region_t *clip_region;
-
- if( m_aClipRegion.GetRectCount() <= 0)
- {
- basegfx::B2IVector aSize = GetSize();
- cairo_rectangle_int_t aCairoSize = { 0, 0, aSize.getX(), aSize.getY() };
- clip_region = cairo_region_create_rectangle( &aCairoSize );
- }
- else
- {
- clip_region = cairo_region_create();
- Rectangle aClipRect;
- RegionHandle aHnd = m_aClipRegion.BeginEnumRects();
- while( m_aClipRegion.GetNextEnumRect( aHnd, aClipRect ) )
- {
- cairo_rectangle_int_t aRect = { aClipRect.Left(), aClipRect.Top(),
- aClipRect.Right(), aClipRect.Bottom() };
- cairo_region_union_rectangle( clip_region, &aRect );
- }
- m_aClipRegion.EndEnumRects (aHnd);
- }
- print_cairo_region( clip_region, "pristine clip region" );
- cairo_region_translate( clip_region, - (nDestX - nSrcX), - (nDestY - nSrcY) );
- print_cairo_region( clip_region, "translated clip region" );
- cairo_region_intersect( region, clip_region );
- print_cairo_region( region, "reduced copy area region" );
-
- // FIXME: this will queue (duplicate) gtk+ re-rendering for the exposed area, c'est la vie
- gdk_window_move_region( gtk_widget_get_window( mpFrame->getWindow() ),
- region, nDestX - nSrcX, nDestY - nSrcY );
-
- print_update_area( gtk_widget_get_window( mpFrame->getWindow() ), "after copy area" );
- cairo_region_destroy( clip_region );
- cairo_region_destroy( region );
-}
-
-#endif
-
-#endif
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
-
Size GtkSalDisplay::GetScreenSize( int nScreen )
{
GdkScreen *pScreen = gdk_display_get_screen (m_pGdkDisplay, nScreen);
@@ -4258,3 +4144,5 @@ Size GtkSalDisplay::GetScreenSize( int nScreen )
return Size( gdk_screen_get_width (pScreen),
gdk_screen_get_height (pScreen) );
}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
index c07cb44..5a6179a 100644
--- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
@@ -30,5 +30,98 @@
#include "../../headless/svpgdi.cxx"
+void GtkData::initNWF() {}
+void GtkData::deInitNWF() {}
+
+GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow )
+ : SvpSalGraphics(),
+ mpFrame( pFrame ),
+ mpWindow( pWindow ),
+ mpButtonStyle( NULL )
+{
+}
+
+void GtkSalGraphics::updateSettings( AllSettings& rSettings )
+{
+ g_warning ("unimplemented GtkSalGraphics update");
+}
+
+static void print_cairo_region (cairo_region_t *region, const char *msg)
+{
+ if (!region) {
+ fprintf (stderr, "%s - NULL\n", msg);
+ return;
+ }
+ int numrect = cairo_region_num_rectangles (region);
+ fprintf (stderr, "%s - %d rects\n", msg, numrect);
+ for (int i = 0; i < numrect; i++) {
+ cairo_rectangle_int_t rect;
+ cairo_region_get_rectangle (region, i, &rect);
+ fprintf( stderr, "\t%d -> %d,%d %dx%d\n", i,
+ rect.x, rect.y, rect.width, rect.height );
+ }
+}
+
+static void print_update_area (GdkWindow *window, const char *msg)
+{
+ print_cairo_region (gdk_window_get_update_area (window), msg);
+}
+
+void GtkSalGraphics::copyArea( long nDestX, long nDestY,
+ long nSrcX, long nSrcY,
+ long nSrcWidth, long nSrcHeight,
+ sal_uInt16 nFlags )
+{
+ mpFrame->pushIgnoreDamage();
+ SvpSalGraphics::copyArea( nDestX, nDestY, nSrcX, nSrcY, nSrcWidth, nSrcHeight, nFlags );
+ mpFrame->popIgnoreDamage();
+
+ cairo_rectangle_int_t rect = { (int)nSrcX, (int)nSrcY, (int)nSrcWidth, (int)nSrcHeight };
+ cairo_region_t *region = cairo_region_create_rectangle( &rect );
+
+ print_update_area( gtk_widget_get_window( mpFrame->getWindow() ), "before copy area" );
+
+// print_cairo_region( mpFrame->m_pRegion, "extremely odd SalFrame: shape combine region! - ");
+
+ g_warning( "FIXME: copy area delta: %d %d needs clip intersect\n",
+ nDestX - nSrcX, nDestY - nSrcY );
+
+ // get clip region and translate it in the opposite direction & intersect ...
+ cairo_region_t *clip_region;
+
+ if( m_aClipRegion.GetRectCount() <= 0)
+ {
+ basegfx::B2IVector aSize = GetSize();
+ cairo_rectangle_int_t aCairoSize = { 0, 0, aSize.getX(), aSize.getY() };
+ clip_region = cairo_region_create_rectangle( &aCairoSize );
+ }
+ else
+ {
+ clip_region = cairo_region_create();
+ Rectangle aClipRect;
+ RegionHandle aHnd = m_aClipRegion.BeginEnumRects();
+ while( m_aClipRegion.GetNextEnumRect( aHnd, aClipRect ) )
+ {
+ cairo_rectangle_int_t aRect = { aClipRect.Left(), aClipRect.Top(),
+ aClipRect.Right(), aClipRect.Bottom() };
+ cairo_region_union_rectangle( clip_region, &aRect );
+ }
+ m_aClipRegion.EndEnumRects (aHnd);
+ }
+ print_cairo_region( clip_region, "pristine clip region" );
+ cairo_region_translate( clip_region, - (nDestX - nSrcX), - (nDestY - nSrcY) );
+ print_cairo_region( clip_region, "translated clip region" );
+ cairo_region_intersect( region, clip_region );
+ print_cairo_region( region, "reduced copy area region" );
+
+ // FIXME: this will queue (duplicate) gtk+ re-rendering for the exposed area, c'est la vie
+ gdk_window_move_region( gtk_widget_get_window( mpFrame->getWindow() ),
+ region, nDestX - nSrcX, nDestY - nSrcY );
+
+ print_update_area( gtk_widget_get_window( mpFrame->getWindow() ), "after copy area" );
+ cairo_region_destroy( clip_region );
+ cairo_region_destroy( region );
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list