vcl/inc/unx/gtk/gtkgdi.hxx | 12 ++- vcl/inc/vcl/sysdata.hxx | 1 vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx | 90 ++++++++++++++++++++++---- 3 files changed, 85 insertions(+), 18 deletions(-)
New commits: commit 38069129838811512e4dfc5ec459d46779bb96bf Author: Lucas Baudin <xapa...@gmail.com> Date: Mon Oct 24 14:23:18 2011 +0200 gtk3: add <cstddef> to vcl/inc/vcl/sysdata.hxx, it seems that g++ 4.6.1 doesn't like to have 'NULL' in plan C++ without this include diff --git a/vcl/inc/vcl/sysdata.hxx b/vcl/inc/vcl/sysdata.hxx index 59a174d..4e4e71f 100644 --- a/vcl/inc/vcl/sysdata.hxx +++ b/vcl/inc/vcl/sysdata.hxx @@ -30,6 +30,7 @@ #define _SV_SYSDATA_HXX #include <vector> +#include <cstddef> #ifdef QUARTZ // predeclare the native classes to avoid header/include problems commit a94ac9b347f004d0dd7b793c1da8e14c6eef9e34 Author: Lucas Baudin <xapa...@gmail.com> Date: Sat Oct 22 18:07:07 2011 +0200 gtk3: Use some static variable in GtkSalGraphics in order to avoid re-loading all GtkStylaContexts diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx index 6ca6c47..4604751 100644 --- a/vcl/inc/unx/gtk/gtkgdi.hxx +++ b/vcl/inc/unx/gtk/gtkgdi.hxx @@ -66,16 +66,17 @@ public: void updateSettings( AllSettings& rSettings ); private: GtkWidget *mpWindow; - GtkStyleContext *mpButtonStyle; - GtkStyleContext *mpEntryStyle; - GtkStyleContext *mpScrollbarStyle; - GtkStyleContext *mpToolbarStyle; - GtkStyleContext *mpToolButtonStyle; - GtkStyleContext *mpCheckButtonStyle; + static GtkStyleContext *mpButtonStyle; + static GtkStyleContext *mpEntryStyle; + static GtkStyleContext *mpScrollbarStyle; + static GtkStyleContext *mpToolbarStyle; + static GtkStyleContext *mpToolButtonStyle; + static GtkStyleContext *mpCheckButtonStyle; void renderAreaToPix( cairo_t* cr, cairo_rectangle_t* rect ); void drawStyleContext( GtkStyleContext* style, GtkStateFlags flags, const Rectangle& rControlRegion, bool render_background = true ); void getStyleContext( GtkStyleContext** style, GtkWidget* widget ); + static bool style_loaded; }; #else diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx index a5877dd..fb88bc4 100644 --- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx +++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx @@ -34,6 +34,13 @@ #include <unx/gtk/gtkinst.hxx> #include <unx/gtk/gtkgdi.hxx> +GtkStyleContext* GtkSalGraphics::mpButtonStyle = NULL; +GtkStyleContext* GtkSalGraphics::mpEntryStyle = NULL; +GtkStyleContext* GtkSalGraphics::mpScrollbarStyle = NULL; +GtkStyleContext* GtkSalGraphics::mpToolbarStyle = NULL; +GtkStyleContext* GtkSalGraphics::mpToolButtonStyle = NULL; +GtkStyleContext* GtkSalGraphics::mpCheckButtonStyle = NULL; +bool GtkSalGraphics::style_loaded = false; /************************************************************************ * State conversion ************************************************************************/ @@ -107,11 +114,11 @@ void GtkSalGraphics::drawStyleContext( GtkStyleContext* style, GtkStateFlags fla */ gtk_render_background(gtk_widget_get_style_context(mpWindow), cr, - -2, -2, - rControlRegion.GetWidth() + 6, rControlRegion.GetHeight() + 6); + 1, -2, + rControlRegion.GetWidth(), rControlRegion.GetHeight() + 6); gtk_render_background(mpToolbarStyle, cr, - -4, -4, - rControlRegion.GetWidth() + 8, rControlRegion.GetHeight() + 8); + 1, -4, + rControlRegion.GetWidth(), rControlRegion.GetHeight() + 8); } gtk_style_context_set_state(style, flags); @@ -556,7 +563,7 @@ void GtkSalGraphics::getStyleContext(GtkStyleContext** style, GtkWidget* widget) { *style = gtk_widget_get_style_context(widget); g_object_ref(*style); - //gtk_widget_destroy(widget); + gtk_widget_destroy(widget); } GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) @@ -565,6 +572,9 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) mpWindow( pWindow ) { + if(style_loaded) + return; + style_loaded = true; gtk_init(NULL, NULL); /* Load the GtkStyleContexts, it might be a bit slow, but usually, * gtk apps create a lot of widgets at startup, so, it shouldn't be commit d8be64b02a5ec468a76fbbcab6afdb1f87329ecf Author: Lucas Baudin <xapa...@gmail.com> Date: Sat Oct 22 17:45:27 2011 +0200 gtk3: add toolbar rendering, there is some graphical bugs if you have more than one row in the toolbar (is it detectable in GtkSalGraphices?) diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx index b021036..a5877dd 100644 --- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx +++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx @@ -92,7 +92,27 @@ void GtkSalGraphics::drawStyleContext( GtkStyleContext* style, GtkStateFlags fla rect.width = rControlRegion.GetWidth() + 2; if(render_background) - gtk_render_background(gtk_widget_get_style_context(mpWindow), cr, 0, 0, rControlRegion.GetWidth() + 2, rControlRegion.GetHeight() + 2); + gtk_render_background(gtk_widget_get_style_context(mpWindow), + cr, + 0, 0, + rControlRegion.GetWidth() + 2, rControlRegion.GetHeight() + 2); + + else if(style == mpToolButtonStyle) + { + /* For toolbuttons, we need to re-draw the toolbar. We also need to re-draw + * the window background which is under the toolbar. + * + * FIXME: the width and height of the toolbar are hardcoded, it would be better + * if we could get the size, and the coords of the parent before re-drawing. + */ + gtk_render_background(gtk_widget_get_style_context(mpWindow), + cr, + -2, -2, + rControlRegion.GetWidth() + 6, rControlRegion.GetHeight() + 6); + gtk_render_background(mpToolbarStyle, cr, + -4, -4, + rControlRegion.GetWidth() + 8, rControlRegion.GetHeight() + 8); + } gtk_style_context_set_state(style, flags); @@ -136,7 +156,10 @@ sal_Bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart drawStyleContext(mpToolbarStyle, flags, rControlRegion); return sal_True; case PART_BUTTON: - drawStyleContext(mpToolButtonStyle, flags, rControlRegion); + /* For all checkbuttons in the toolbars */ + flags = (GtkStateFlags)(flags | + ( (aValue.getTristateVal() == BUTTONVALUE_ON) ? GTK_STATE_FLAG_ACTIVE : GTK_STATE_FLAG_NORMAL)); + drawStyleContext(mpToolButtonStyle, flags, rControlRegion, false); return sal_True; } break; @@ -518,7 +541,9 @@ sal_Bool GtkSalGraphics::IsNativeControlSupported( ControlType nType, ControlPar if( (nType == CTRL_PUSHBUTTON && nPart == PART_ENTIRE_CONTROL) || (nType == CTRL_CHECKBOX && nPart == PART_ENTIRE_CONTROL) || nType == CTRL_SCROLLBAR - || nType == CTRL_EDITBOX /*|| + || nType == CTRL_EDITBOX + || (nType == CTRL_TOOLBAR && nPart == PART_ENTIRE_CONTROL) + || (nType == CTRL_TOOLBAR && nPart == PART_BUTTON)/*|| segfault with recent code, needs investigating nType == CTRL_TOOLBAR*/ ) return sal_True; return sal_False; @@ -531,7 +556,7 @@ void GtkSalGraphics::getStyleContext(GtkStyleContext** style, GtkWidget* widget) { *style = gtk_widget_get_style_context(widget); g_object_ref(*style); - gtk_widget_destroy(widget); + //gtk_widget_destroy(widget); } GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) @@ -546,13 +571,25 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) * too slow */ GtkWidget* toolbar = gtk_toolbar_new(); GtkWidget* toolbutton = gtk_button_new(); - //gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(toolbutton)); getStyleContext(&mpEntryStyle, gtk_entry_new()); getStyleContext(&mpButtonStyle, gtk_button_new()); getStyleContext(&mpToolbarStyle, toolbar); + gtk_style_context_add_class(mpToolbarStyle, "primary-toolbar"); + gtk_style_context_add_class(mpToolbarStyle, "toolbar"); getStyleContext(&mpToolButtonStyle, GTK_WIDGET(toolbutton)); - gtk_style_context_add_class(mpToolButtonStyle, "button"); /* TODO */ + + /* Create a widget path for our toolbutton widget */ + GtkWidgetPath* path = gtk_widget_path_new (); + gtk_widget_path_append_type(path, GTK_TYPE_TOOLBAR); + gtk_widget_path_append_type(path, GTK_TYPE_TOOL_BUTTON); + gtk_widget_path_append_type(path, GTK_TYPE_BUTTON); + + gtk_widget_path_iter_add_class (path, 0, "primary-toolbar"); + gtk_widget_path_iter_add_class (path, 0, "toolbar"); + gtk_widget_path_iter_add_class (path, 2, "button"); + gtk_style_context_set_path(mpToolButtonStyle, path); + getStyleContext(&mpScrollbarStyle, gtk_vscrollbar_new(NULL)); getStyleContext(&mpCheckButtonStyle, gtk_check_button_new()); gtk_style_context_add_class(mpCheckButtonStyle, "check"); commit 9a8c097459622e6436da87077efc5990c9002ba6 Author: Lucas Baudin <xapa...@gmail.com> Date: Fri Oct 21 22:21:39 2011 +0200 gtk3: Use CheckBox style (there is still a problem with the hover stage) diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx index 589a109..6ca6c47 100644 --- a/vcl/inc/unx/gtk/gtkgdi.hxx +++ b/vcl/inc/unx/gtk/gtkgdi.hxx @@ -71,6 +71,7 @@ private: GtkStyleContext *mpScrollbarStyle; GtkStyleContext *mpToolbarStyle; GtkStyleContext *mpToolButtonStyle; + GtkStyleContext *mpCheckButtonStyle; void renderAreaToPix( cairo_t* cr, cairo_rectangle_t* rect ); void drawStyleContext( GtkStyleContext* style, GtkStateFlags flags, const Rectangle& rControlRegion, bool render_background = true ); diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx index 6058924..b021036 100644 --- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx +++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx @@ -96,19 +96,28 @@ void GtkSalGraphics::drawStyleContext( GtkStyleContext* style, GtkStateFlags fla gtk_style_context_set_state(style, flags); - gtk_render_background(style, cr, - 1, 1, - rControlRegion.GetWidth(), rControlRegion.GetHeight()); - gtk_render_frame(style, cr, - 1, 1, - rControlRegion.GetWidth(), rControlRegion.GetHeight()); + if(!(style == mpCheckButtonStyle)) + { + gtk_render_background(style, cr, + 1, 1, + rControlRegion.GetWidth(), rControlRegion.GetHeight()); + gtk_render_frame(style, cr, + 1, 1, + rControlRegion.GetWidth(), rControlRegion.GetHeight()); + } + else + { + gtk_render_check(style, cr, + 1, 1, + rControlRegion.GetWidth(), rControlRegion.GetHeight()); + } renderAreaToPix(cr, &rect); cairo_destroy(cr); } sal_Bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion, - ControlState nState, const ImplControlValue&, + ControlState nState, const ImplControlValue& aValue, const rtl::OUString& ) { GtkStateFlags flags; @@ -131,6 +140,10 @@ sal_Bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart return sal_True; } break; + case CTRL_CHECKBOX: + flags = (GtkStateFlags)(flags | ( (aValue.getTristateVal() == BUTTONVALUE_ON) ? GTK_STATE_FLAG_ACTIVE : GTK_STATE_FLAG_NORMAL)); + drawStyleContext(mpCheckButtonStyle, flags, rControlRegion); + return sal_True; case CTRL_PUSHBUTTON: drawStyleContext(mpButtonStyle, flags, rControlRegion); return sal_True; @@ -502,7 +515,10 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) sal_Bool GtkSalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart ) { - if((nType == CTRL_PUSHBUTTON && nPart == PART_ENTIRE_CONTROL) || nType == CTRL_SCROLLBAR || nType == CTRL_EDITBOX /*|| + if( (nType == CTRL_PUSHBUTTON && nPart == PART_ENTIRE_CONTROL) + || (nType == CTRL_CHECKBOX && nPart == PART_ENTIRE_CONTROL) + || nType == CTRL_SCROLLBAR + || nType == CTRL_EDITBOX /*|| segfault with recent code, needs investigating nType == CTRL_TOOLBAR*/ ) return sal_True; return sal_False; @@ -538,6 +554,8 @@ GtkSalGraphics::GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ) getStyleContext(&mpToolButtonStyle, GTK_WIDGET(toolbutton)); gtk_style_context_add_class(mpToolButtonStyle, "button"); /* TODO */ getStyleContext(&mpScrollbarStyle, gtk_vscrollbar_new(NULL)); + getStyleContext(&mpCheckButtonStyle, gtk_check_button_new()); + gtk_style_context_add_class(mpCheckButtonStyle, "check"); } @@ -567,7 +585,6 @@ void GtkSalGraphics::copyArea( long nDestX, long nDestY, long nSrcWidth, long nSrcHeight, sal_uInt16 nFlags ) { - return; mpFrame->pushIgnoreDamage(); SvpSalGraphics::copyArea( nDestX, nDestY, nSrcX, nSrcY, nSrcWidth, nSrcHeight, nFlags ); mpFrame->popIgnoreDamage(); _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits