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

New commits:
commit 058c406c1610df7e557b9405619388465d3f056b
Author:     Corentin Noël <corentin.n...@collabora.com>
AuthorDate: Fri Sep 20 18:30:15 2019 +0200
Commit:     Caolán McNamara <caol...@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 <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@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);
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to