[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