Hi,

Here is a patch to render gtk3 button correctly. I send it now because I
won't have internet until tuesday, and it would be a bit stupid if
anyone made the same thing... So, you are aware that the patch exists,
if you need it :)

So, there are some warnings about unused variables, of course, they will
be used later. I didn't split drawNativeControl(), but I suppose it will
be necessary later.

Here is a screenshot:
http://pix.toile-libre.org/upload/original/1313519421.png

I don't know if it is worth to apply it now (it is not finished at all),
but it is under GPLv3+/MPL.

I will try to complete to work again on gtk3 next week...

Lucas

>From 0e3f8e8106985c51db320033a495fe05b7f6709e Mon Sep 17 00:00:00 2001
From: Lucas Baudin <xapa...@gmail.com>
Date: Tue, 16 Aug 2011 20:20:24 +0200
Subject: [PATCH] [GTK3] Add button rendering

---
 vcl/Library_vclplug_gtk3.mk                   |    1 +
 vcl/inc/unx/gtk/gtkgdi.hxx                    |   10 +++
 vcl/unx/gtk/window/gtkframe.cxx               |   13 ---
 vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx |  100 ++++++++++++++++++++++++-
 4 files changed, 109 insertions(+), 15 deletions(-)

diff --git a/vcl/Library_vclplug_gtk3.mk b/vcl/Library_vclplug_gtk3.mk
index 4642923..e71cb81 100644
--- a/vcl/Library_vclplug_gtk3.mk
+++ b/vcl/Library_vclplug_gtk3.mk
@@ -116,6 +116,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_gtk3,\
     vcl/unx/gtk3/app/gtk3gtksys \
     vcl/unx/gtk3/window/gtk3gtkframe \
     vcl/unx/gtk3/window/gtk3gtkobject \
+    vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk \
 ))
 
 ifeq ($(OS),LINUX)
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx
index 83d4aa8..47f4e34 100644
--- a/vcl/inc/unx/gtk/gtkgdi.hxx
+++ b/vcl/inc/unx/gtk/gtkgdi.hxx
@@ -47,6 +47,16 @@ class GtkSalFrame;
 class GtkSalGraphics : public X11SalGraphics {
 public:
     GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow );
+    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           *m_pWindow;
+    GtkStyleContext* m_buttonStyle;
 };
 #else
 
diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx
index faa8a71..fb20689 100644
--- a/vcl/unx/gtk/window/gtkframe.cxx
+++ b/vcl/unx/gtk/window/gtkframe.cxx
@@ -3880,17 +3880,4 @@ gboolean GtkSalFrame::IMHandler::signalIMDeleteSurrounding( GtkIMContext*, gint
     return sal_False;
 }
 
-#ifdef GTK_GRAPHICS_DISABLED
-
-void GtkData::initNWF() {}
-void GtkData::deInitNWF() {}
-
-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 ) ) );
-}
-
-#endif
 /* 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 aa68cc2..637be5f 100644
--- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
@@ -26,7 +26,103 @@
  * instead of those above.
  */
 
-#include "../../headless/svpdi.hxx"
-#include "../../headless/svpdi.hxx"
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_vcl.hxx"
+
+#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;
+        }
+    }
+}
+
+void GtkData::initNWF() {}
+void GtkData::deInitNWF() {}
+
+GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow )
+    : X11SalGraphics()
+{
+    m_pWindow = pWindow;
+    m_buttonStyle = NULL;
+    Init( pFrame, GDK_WINDOW_XID( widget_get_window( pWindow ) ),
+          gdk_x11_screen_get_screen_number( gtk_widget_get_screen( pWindow ) ) );
+}
+
+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(m_pWindow));
+    switch(nType)
+    {
+    case CTRL_PUSHBUTTON:
+        if(!GTK_IS_STYLE_CONTEXT(m_buttonStyle))
+        {
+            m_buttonStyle = gtk_widget_get_style_context(gtk_button_new());
+        }
+
+        gtk_style_context_set_state(m_buttonStyle, flags);
+
+        gtk_render_background(m_buttonStyle, cr,
+                rControlRegion.Left(), rControlRegion.Top(),
+                rControlRegion.GetWidth(), rControlRegion.GetHeight());
+        gtk_render_frame(m_buttonStyle, 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(nType == CTRL_PUSHBUTTON)
+        return sal_True;
+    return sal_False;
+}
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
-- 
1.7.4.1

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to