[Libreoffice-commits] core.git: vcl/unx

Corentin Noël (via logerrit) logerrit at kemper.freedesktop.org
Tue Sep 24 10:32:42 UTC 2019


 vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx |   96 +++++++++++++++++++++---------
 1 file changed, 69 insertions(+), 27 deletions(-)

New commits:
commit 058c406c1610df7e557b9405619388465d3f056b
Author:     Corentin Noël <corentin.noel at collabora.com>
AuthorDate: Fri Sep 20 18:30:15 2019 +0200
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Tue Sep 24 12:31:37 2019 +0200

    gtk3: Depend on the window stylecontext
    
    Make all GtkStyleContext children of the one from the current toplevel
    and ensures that the scale factor is the same as the parent.
    Also make sure to load images using the right scaling factor.
    
    Change-Id: I491d79941690fc69171e9aac950493dcca7c78f2
    Reviewed-on: https://gerrit.libreoffice.org/79311
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx
index 20d658c4a796..c74fe1bfbfcf 100644
--- a/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx
@@ -224,13 +224,14 @@ namespace
     void QuerySize(GtkStyleContext *pContext, Size &rSize)
     {
         GtkBorder margin, border, padding;
+        GtkStateFlags stateflags = gtk_style_context_get_state (pContext);
 
-        gtk_style_context_get_margin(pContext, gtk_style_context_get_state(pContext), &margin);
-        gtk_style_context_get_border(pContext, gtk_style_context_get_state(pContext), &border);
-        gtk_style_context_get_padding(pContext, gtk_style_context_get_state(pContext), &padding);
+        gtk_style_context_get_margin(pContext, stateflags, &margin);
+        gtk_style_context_get_border(pContext, stateflags, &border);
+        gtk_style_context_get_padding(pContext, stateflags, &padding);
 
         int nMinWidth, nMinHeight;
-        gtk_style_context_get(pContext, gtk_style_context_get_state(pContext),
+        gtk_style_context_get(pContext, stateflags,
                 "min-width", &nMinWidth, "min-height", &nMinHeight, nullptr);
 
         nMinWidth += margin.left + margin.right + border.left + border.right + padding.left + padding.right;
@@ -1084,9 +1085,10 @@ void GtkSalGraphics::PaintOneSpinButton( GtkStyleContext *context,
     tools::Rectangle buttonRect = NWGetSpinButtonRect( nPart, aAreaRect );
 
     gtk_style_context_set_state(context, stateFlags);
+    stateFlags = gtk_style_context_get_state(context);
 
-    gtk_style_context_get_padding(context, gtk_style_context_get_state(context), &padding);
-    gtk_style_context_get_border(context, gtk_style_context_get_state(context), &border);
+    gtk_style_context_get_padding(context, stateFlags, &padding);
+    gtk_style_context_get_border(context, stateFlags, &border);
 
     gtk_render_background(context, cr,
                           buttonRect.Left(), buttonRect.Top(),
@@ -1098,20 +1100,24 @@ void GtkSalGraphics::PaintOneSpinButton( GtkStyleContext *context,
     const char* icon = (nPart == ControlPart::ButtonUp) ? "list-add-symbolic" : "list-remove-symbolic";
     GtkIconTheme *pIconTheme = gtk_icon_theme_get_for_screen(gtk_widget_get_screen(mpWindow));
 
-    GtkIconInfo *info = gtk_icon_theme_lookup_icon(pIconTheme, icon, std::min(iconWidth, iconHeight),
+    gint scale = gtk_style_context_get_scale (context);
+    GtkIconInfo *info = gtk_icon_theme_lookup_icon_for_scale(pIconTheme, icon, std::min(iconWidth, iconHeight), scale,
                                                    static_cast<GtkIconLookupFlags>(0));
 
     GdkPixbuf *pixbuf = gtk_icon_info_load_symbolic_for_context(info, context, nullptr, nullptr);
     g_object_unref(info);
 
-    iconWidth = gdk_pixbuf_get_width(pixbuf);
-    iconHeight = gdk_pixbuf_get_height(pixbuf);
+    iconWidth = gdk_pixbuf_get_width(pixbuf)/scale;
+    iconHeight = gdk_pixbuf_get_height(pixbuf)/scale;
     tools::Rectangle arrowRect;
     arrowRect.SetSize(Size(iconWidth, iconHeight));
     arrowRect.setX( buttonRect.Left() + (buttonRect.GetWidth() - arrowRect.GetWidth()) / 2 );
     arrowRect.setY( buttonRect.Top() + (buttonRect.GetHeight() - arrowRect.GetHeight()) / 2 );
 
+    gtk_style_context_save (context);
+    gtk_style_context_set_scale (context, 1);
     gtk_render_icon(context, cr, pixbuf, arrowRect.Left(), arrowRect.Top());
+    gtk_style_context_restore (context);
     g_object_unref(pixbuf);
 
     gtk_render_frame(context, cr,
@@ -1189,6 +1195,10 @@ tools::Rectangle GtkSalGraphics::NWGetComboBoxButtonRect(ControlType nType,
             gtk_style_context_get_state(mpComboboxButtonArrowStyle),
             "min-width", &nArrowWidth, nullptr);
     }
+    else
+    {
+        nArrowWidth = nArrowWidth * gtk_style_context_get_scale (mpComboboxButtonArrowStyle);
+    }
 
     gint nButtonWidth = nArrowWidth + padding.left + padding.right;
     if( nPart == ControlPart::ButtonDown )
@@ -1256,6 +1266,19 @@ void GtkSalGraphics::PaintCombobox( GtkStateFlags flags, cairo_t *cr,
                 "min-width", &arrow_width, "min-height", &arrow_height, nullptr);
         }
     }
+    else
+    {
+        if (nType == ControlType::Combobox)
+        {
+            arrow_width = arrow_width * gtk_style_context_get_scale (mpComboboxButtonArrowStyle);
+            arrow_height = arrow_height * gtk_style_context_get_scale (mpComboboxButtonArrowStyle);
+        }
+        else if (nType == ControlType::Listbox)
+        {
+            arrow_width = arrow_width * gtk_style_context_get_scale (mpListboxButtonArrowStyle);
+            arrow_height = arrow_height * gtk_style_context_get_scale (mpListboxButtonArrowStyle);
+        }
+    }
 
     arrowRect.SetSize(Size(arrow_width, arrow_height));
     arrowRect.SetPos( Point( buttonRect.Left() + static_cast<gint>((buttonRect.GetWidth() - arrowRect.GetWidth()) / 2),
@@ -1361,7 +1384,18 @@ GtkStyleContext* GtkSalGraphics::makeContext(GtkWidgetPath *pPath, GtkStyleConte
     GtkStyleContext* context = gtk_style_context_new();
     gtk_style_context_set_screen(context, gtk_widget_get_screen(mpWindow));
     gtk_style_context_set_path(context, pPath);
-    gtk_style_context_set_parent(context, pParent);
+    if (pParent == nullptr)
+    {
+        GtkWidget* pTopLevel = gtk_widget_get_toplevel(mpWindow);
+        GtkStyleContext* pStyle = gtk_widget_get_style_context(pTopLevel);
+        gtk_style_context_set_parent(context, pStyle);
+        gtk_style_context_set_scale (context, gtk_style_context_get_scale (pStyle));
+    }
+    else
+    {
+        gtk_style_context_set_parent(context, pParent);
+        gtk_style_context_set_scale (context, gtk_style_context_get_scale (pParent));
+    }
     gtk_widget_path_unref(pPath);
     return context;
 }
@@ -2183,10 +2217,21 @@ void GtkSalGraphics::PaintRadio(cairo_t *cr, GtkStyleContext *context,
 
 static gfloat getArrowSize(GtkStyleContext* context)
 {
-    gfloat arrow_scaling = 1.0;
-    gtk_style_context_get_style(context, "arrow-scaling", &arrow_scaling, nullptr);
-    gfloat arrow_size = 11 * arrow_scaling;
-    return arrow_size;
+    if (gtk_check_version(3, 20, 0) == nullptr)
+    {
+        gint min_width, min_weight;
+        gtk_style_context_get_style(context, "min-width", &min_width, nullptr);
+        gtk_style_context_get_style(context, "min-height", &min_weight, nullptr);
+        gfloat arrow_size = 11 * MAX (min_width, min_weight);
+        return arrow_size;
+    }
+    else
+    {
+        gfloat arrow_scaling = 1.0;
+        gtk_style_context_get_style(context, "arrow-scaling", &arrow_scaling, nullptr);
+        gfloat arrow_size = 11 * arrow_scaling;
+        return arrow_size;
+    }
 }
 
 namespace
@@ -2383,7 +2428,7 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co
         case ControlPart::Button:
             /* For all checkbuttons in the toolbars */
             flags = static_cast<GtkStateFlags>(flags |
-                    ( (rValue.getTristateVal() == ButtonValue::On) ? GTK_STATE_FLAG_ACTIVE : GTK_STATE_FLAG_NORMAL));
+                    ( (rValue.getTristateVal() == ButtonValue::On) ? GTK_STATE_FLAG_CHECKED : GTK_STATE_FLAG_NORMAL));
             context = mpToolButtonStyle;
             break;
         case ControlPart::SeparatorVert:
@@ -2486,9 +2531,10 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co
         {
             const char* icon = (rValue.getNumericVal() & 1) ? "pan-down-symbolic" : "pan-up-symbolic";
             GtkIconTheme *pIconTheme = gtk_icon_theme_get_for_screen(gtk_widget_get_screen(mpWindow));
-            pixbuf = gtk_icon_theme_load_icon(pIconTheme, icon,
-                                              std::max(rControlRegion.GetWidth(), rControlRegion.GetHeight()),
-                                              static_cast<GtkIconLookupFlags>(0), nullptr);
+            pixbuf = gtk_icon_theme_load_icon_for_scale(pIconTheme, icon,
+                                                        std::max(rControlRegion.GetWidth(), rControlRegion.GetHeight()),
+                                                        gtk_style_context_get_scale (context),
+                                                        static_cast<GtkIconLookupFlags>(0), nullptr);
             flags = GTK_STATE_FLAG_SELECTED;
             renderType = RenderType::Icon;
         }
@@ -2573,7 +2619,10 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co
         PaintCombobox(flags, cr, rControlRegion, nType, nPart);
         break;
     case RenderType::Icon:
+        gtk_style_context_save (context);
+        gtk_style_context_set_scale (context, 1);
         gtk_render_icon(context, cr, pixbuf, nX, nY);
+        gtk_style_context_restore (context);
         g_object_unref(pixbuf);
         break;
     case RenderType::Focus:
@@ -2999,16 +3048,12 @@ bool GtkSalGraphics::updateSettings(AllSettings& rSettings)
 
     // tooltip colors
     {
-        GtkStyleContext *pCStyle = gtk_style_context_new();
-        gtk_style_context_set_screen(pCStyle, gtk_widget_get_screen(mpWindow));
         GtkWidgetPath *pCPath = gtk_widget_path_new();
         guint pos = gtk_widget_path_append_type(pCPath, GTK_TYPE_WINDOW);
         gtk_widget_path_iter_add_class(pCPath, pos, GTK_STYLE_CLASS_TOOLTIP);
         pos = gtk_widget_path_append_type (pCPath, GTK_TYPE_LABEL);
         gtk_widget_path_iter_add_class(pCPath, pos, GTK_STYLE_CLASS_LABEL);
-        pCStyle = gtk_style_context_new();
-        gtk_style_context_set_path(pCStyle, pCPath);
-        gtk_widget_path_free(pCPath);
+        GtkStyleContext *pCStyle = makeContext (pCPath, nullptr);
 
         GdkRGBA tooltip_bg_color, tooltip_fg_color;
         style_context_set_state(pCStyle, GTK_STATE_FLAG_NORMAL);
@@ -3022,13 +3067,10 @@ bool GtkSalGraphics::updateSettings(AllSettings& rSettings)
 
     {
         // construct style context for text view
-        GtkStyleContext *pCStyle = gtk_style_context_new();
-        gtk_style_context_set_screen(pCStyle, gtk_widget_get_screen(mpWindow));
         GtkWidgetPath *pCPath = gtk_widget_path_new();
         gtk_widget_path_append_type( pCPath, GTK_TYPE_TEXT_VIEW );
         gtk_widget_path_iter_add_class( pCPath, -1, GTK_STYLE_CLASS_VIEW );
-        gtk_style_context_set_path( pCStyle, pCPath );
-        gtk_widget_path_free( pCPath );
+        GtkStyleContext *pCStyle = makeContext( pCPath, nullptr );
 
         // highlighting colors
         style_context_set_state(pCStyle, GTK_STATE_FLAG_SELECTED);


More information about the Libreoffice-commits mailing list