From 035fcce011e31929a578c5da0ac27feb3f532396 Mon Sep 17 00:00:00 2001 From: Colomban Wendling Date: Wed, 27 Apr 2016 16:01:17 +0200 Subject: GTK: Fix fetching the frame border width on GTK 3.20 GTK 3.20 introduced a sub-node named "border" to the frame, requiring to lookup the border on that sub-node rather than on the frame itself. Unfortunately supporting this requires to be built against GTK 3.20, as it requires API this version introduced. This means that a build against an older version won't be able to get the popup sizing right if running on 3.20. To mitigate this, add reasonable fallback defaults when running 3.20 but built on an earlier version, to try and avoid 2px-scrolling on GTK 3.20's default theme. --- gtk/PlatGTK.cxx | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index e7cd9d2af..09752293f 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -1534,12 +1534,34 @@ PRectangle ListBoxX::GetDesiredRect() { int row_height = GetRowHeight(); #if GTK_CHECK_VERSION(3,0,0) GtkStyleContext *styleContextFrame = gtk_widget_get_style_context(PWidget(frame)); - GtkBorder padding, border; + GtkBorder padding, border, border_border = { 0, 0, 0, 0 }; gtk_style_context_get_padding(styleContextFrame, GTK_STATE_FLAG_NORMAL, &padding); gtk_style_context_get_border(styleContextFrame, GTK_STATE_FLAG_NORMAL, &border); + +# if GTK_CHECK_VERSION(3,20,0) + // on GTK 3.20 the frame border is in a sub-node "border". + // Unfortunately we need to be built against 3.20 to be able to support this, as it requires + // new API. + GtkStyleContext *styleContextFrameBorder = gtk_style_context_new(); + GtkWidgetPath *widget_path = gtk_widget_path_copy(gtk_style_context_get_path(styleContextFrame)); + gtk_widget_path_append_type(widget_path, GTK_TYPE_BORDER); // dummy type + gtk_widget_path_iter_set_object_name(widget_path, -1, "border"); + gtk_style_context_set_path(styleContextFrameBorder, widget_path); + gtk_widget_path_free(widget_path); + gtk_style_context_get_border(styleContextFrameBorder, GTK_STATE_FLAG_NORMAL, &border_border); + g_object_unref(styleContextFrameBorder); +# else // < 3.20 + if (gtk_check_version(3, 20, 0) == NULL) { + // default to 1px all around as it's likely what it is, and so we don't miss 2px height + // on GTK 3.20 when built against an earlier version. + border_border.top = border_border.bottom = border_border.left = border_border.right = 1; + } +# endif + height = (rows * row_height + padding.top + padding.bottom + border.top + border.bottom + + border_border.top + border_border.bottom + 2 * gtk_container_get_border_width(GTK_CONTAINER(PWidget(list)))); #else height = (rows * row_height @@ -1560,6 +1582,7 @@ PRectangle ListBoxX::GetDesiredRect() { #if GTK_CHECK_VERSION(3,0,0) rc.right += (padding.left + padding.right + border.left + border.right + + border_border.left + border_border.right + 2 * gtk_container_get_border_width(GTK_CONTAINER(PWidget(list)))); #else rc.right += 2 * (PWidget(frame)->style->xthickness -- cgit v1.2.3