Auto sync2gitlab import of gtk3-3.22.30-10.el8.src.rpm

This commit is contained in:
James Antill 2022-05-26 09:19:31 -04:00
parent 1544175d85
commit 476af5d827
17 changed files with 2151 additions and 1 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/gtk+-3.22.30.tar.xz

View File

@ -0,0 +1,79 @@
From 044383fe4533c59a0bbd58c977ed2ba5fb5862b8 Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Fri, 31 May 2019 11:46:19 -0400
Subject: [PATCH 1/2] Add a gtk-overlay-scrolling setting
This is in preparation for letting user opt out of
overlay scrolling in the control-center.
---
gdk/wayland/gdkscreen-wayland.c | 2 +-
gdk/x11/gdksettings.c | 1 +
gtk/gtksettings.c | 21 ++++++++++++++++++++-
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c
index 6aff3a5a1a..5e156072f2 100644
--- a/gdk/wayland/gdkscreen-wayland.c
+++ b/gdk/wayland/gdkscreen-wayland.c
@@ -502,6 +502,7 @@ static TranslationEntry translations[] = {
{ FALSE, "org.gnome.desktop.interface", "gtk-im-module", "gtk-im-module", G_TYPE_STRING, { .s = "simple" } },
{ FALSE, "org.gnome.desktop.interface", "enable-animations", "gtk-enable-animations", G_TYPE_BOOLEAN, { .b = TRUE } },
{ FALSE, "org.gnome.desktop.interface", "gtk-enable-primary-paste", "gtk-enable-primary-paste", G_TYPE_BOOLEAN, { .b = TRUE } },
+ { FALSE, "org.gnome.desktop.interface", "overlay-scrolling", "gtk-overlay-scrolling", G_TYPE_BOOLEAN, { .b = TRUE } },
{ FALSE, "org.gnome.settings-daemon.peripherals.mouse", "double-click", "gtk-double-click-time", G_TYPE_INT, { .i = 400 } },
{ FALSE, "org.gnome.settings-daemon.peripherals.mouse", "drag-threshold", "gtk-dnd-drag-threshold", G_TYPE_INT, {.i = 8 } },
{ FALSE, "org.gnome.desktop.sound", "theme-name", "gtk-sound-theme-name", G_TYPE_STRING, { .s = "freedesktop" } },
diff --git a/gdk/x11/gdksettings.c b/gdk/x11/gdksettings.c
index f8bb6d896b..869c239b18 100644
--- a/gdk/x11/gdksettings.c
+++ b/gdk/x11/gdksettings.c
@@ -69,6 +69,7 @@ static const struct {
{"Gtk/RecentFilesMaxAge", "gtk-recent-files-max-age"},
{"Gtk/RecentFilesEnabled", "gtk-recent-files-enabled"},
{"Gtk/KeynavUseCaret", "gtk-keynav-use-caret"},
+ {"Gtk/OverlayScrolling", "gtk-overlay-scrolling"},
/* These are here in order to be recognized, but are not sent to
gtk as they are handled internally by gdk: */
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index 571ae11cd4..b83d9d5561 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -224,7 +224,8 @@ enum {
PROP_ENABLE_PRIMARY_PASTE,
PROP_RECENT_FILES_ENABLED,
PROP_LONG_PRESS_TIME,
- PROP_KEYNAV_USE_CARET
+ PROP_KEYNAV_USE_CARET,
+ PROP_OVERLAY_SCROLLING
};
/* --- prototypes --- */
@@ -1767,6 +1768,24 @@ gtk_settings_class_init (GtkSettingsClass *class)
GTK_PARAM_READWRITE),
NULL);
g_assert (result == PROP_KEYNAV_USE_CARET);
+
+ /**
+ * GtkSettings:gtk-overlay-scrolling:
+ *
+ * Whether scrolled windows may use overlayed scrolling indicators.
+ * If this is set to %FALSE, scrolled windows will have permanent
+ * scrollbars.
+ *
+ * Since: 3.24.9
+ */
+ result = settings_install_property_parser (class,
+ g_param_spec_boolean ("gtk-overlay-scrolling",
+ P_("Whether to use overlay scrollbars"),
+ P_("Whether to use overlay scrollbars"),
+ TRUE,
+ GTK_PARAM_READWRITE),
+ NULL);
+ g_assert (result == PROP_OVERLAY_SCROLLING);
}
static void
--
2.23.0

View File

@ -0,0 +1,41 @@
From 6b91ab848b86aa7968bb421f2f3f30b1c8ad6ba2 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 10 Dec 2018 17:05:53 +0100
Subject: [PATCH] a11y: Check X11 display at runtime
`gtk_widget_accessible_grab_focus()` code checks that X11 isenabled at
build time and uses X11 specific functions such as
`gdk_x11_get_server_time()` regardless of the actual backend being used.
Check that we are using an X11 display when X11 is backend enabled, so
we do not crash when running on Wayland
Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1507
---
gtk/a11y/gtkwidgetaccessible.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/gtk/a11y/gtkwidgetaccessible.c b/gtk/a11y/gtkwidgetaccessible.c
index 2154e88239..b1b866c39c 100644
--- a/gtk/a11y/gtkwidgetaccessible.c
+++ b/gtk/a11y/gtkwidgetaccessible.c
@@ -648,11 +648,12 @@ gtk_widget_accessible_grab_focus (AtkComponent *component)
if (gtk_widget_is_toplevel (toplevel))
{
#ifdef GDK_WINDOWING_X11
- gtk_window_present_with_time (GTK_WINDOW (toplevel),
- gdk_x11_get_server_time (gtk_widget_get_window (widget)));
-#else
- gtk_window_present (GTK_WINDOW (toplevel));
+ if (GDK_IS_X11_DISPLAY (gtk_widget_get_display (toplevel)))
+ gtk_window_present_with_time (GTK_WINDOW (toplevel),
+ gdk_x11_get_server_time (gtk_widget_get_window (widget)));
+ else
#endif
+ gtk_window_present (GTK_WINDOW (toplevel));
}
return TRUE;
}
--
2.19.2

View File

@ -0,0 +1,40 @@
From e91197a37f6841ada71204cd41f7d0459adffd9a Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 17 Dec 2018 14:13:05 +0100
Subject: [PATCH] a11y: Check display in `*grab_cell_focus()`
Calling the accessibility function `grab_focus()` on a `GtkCell` under
Wayland will cause the client to crash.
This is another case of `gdk_x11_get_server_time()` being called
regardless of the actual windowing backend used.
Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1507
---
gtk/a11y/gtktreeviewaccessible.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c
index efb9c9bc53..eec4480f29 100644
--- a/gtk/a11y/gtktreeviewaccessible.c
+++ b/gtk/a11y/gtktreeviewaccessible.c
@@ -1174,11 +1174,12 @@ gtk_tree_view_accessible_grab_cell_focus (GtkCellAccessibleParent *parent,
if (gtk_widget_is_toplevel (toplevel))
{
#ifdef GDK_WINDOWING_X11
- gtk_window_present_with_time (GTK_WINDOW (toplevel),
- gdk_x11_get_server_time (gtk_widget_get_window (widget)));
-#else
- gtk_window_present (GTK_WINDOW (toplevel));
+ if (GDK_IS_X11_DISPLAY (gtk_widget_get_display (toplevel)))
+ gtk_window_present_with_time (GTK_WINDOW (toplevel),
+ gdk_x11_get_server_time (gtk_widget_get_window (widget)));
+ else
#endif
+ gtk_window_present (GTK_WINDOW (toplevel));
}
return TRUE;
--
2.20.1

View File

@ -0,0 +1,290 @@
From bc1c0584b76e19d5d65bfa2ae809f95113e53c83 Mon Sep 17 00:00:00 2001
From: Benjamin Otte <otte@redhat.com>
Date: Sun, 21 Jul 2019 23:15:00 +0200
Subject: [PATCH] a11y: Include window management buttons in headerbar
---
gtk/a11y/Makefile.inc | 2 +
gtk/a11y/gtkheaderbaraccessible.c | 87 +++++++++++++++++++++++++++++++
gtk/a11y/gtkheaderbaraccessible.h | 55 +++++++++++++++++++
gtk/gtkcontainerprivate.h | 1 +
gtk/gtkheaderbar.c | 3 +-
6 files changed, 149 insertions(+), 1 deletion(-)
create mode 100644 gtk/a11y/gtkheaderbaraccessible.c
create mode 100644 gtk/a11y/gtkheaderbaraccessible.h
diff --git a/gtk/a11y/Makefile.inc b/gtk/a11y/Makefile.inc
index 8529c7ae57..3ed6c5decd 100644
--- a/gtk/a11y/Makefile.inc
+++ b/gtk/a11y/Makefile.inc
@@ -14,6 +14,7 @@ a11y_h_sources = \
a11y/gtkflowboxaccessible.h \
a11y/gtkflowboxchildaccessible.h \
a11y/gtkframeaccessible.h \
+ a11y/gtkheaderbaraccessible.h \
a11y/gtkiconviewaccessible.h \
a11y/gtkimageaccessible.h \
a11y/gtkimagecellaccessible.h \
@@ -88,6 +89,7 @@ a11y_c_sources = \
a11y/gtkflowboxaccessible.c \
a11y/gtkflowboxchildaccessible.c \
a11y/gtkframeaccessible.c \
+ a11y/gtkheaderbaraccessible.c \
a11y/gtkiconviewaccessible.c \
a11y/gtkimageaccessible.c \
a11y/gtkimagecellaccessible.c \
--- a/gtk/Makefile.in
+++ b/gtk/Makefile.in
@@ -281,6 +281,7 @@
a11y/gtkcontainercellaccessible.c a11y/gtkentryaccessible.c \
a11y/gtkexpanderaccessible.c a11y/gtkflowboxaccessible.c \
a11y/gtkflowboxchildaccessible.c a11y/gtkframeaccessible.c \
+ a11y/gtkheaderbaraccessible.c \
a11y/gtkiconviewaccessible.c a11y/gtkimageaccessible.c \
a11y/gtkimagecellaccessible.c a11y/gtklabelaccessible.c \
a11y/gtklevelbaraccessible.c a11y/gtklinkbuttonaccessible.c \
@@ -487,6 +488,7 @@
a11y/libgtk_3_la-gtkflowboxaccessible.lo \
a11y/libgtk_3_la-gtkflowboxchildaccessible.lo \
a11y/libgtk_3_la-gtkframeaccessible.lo \
+ a11y/libgtk_3_la-gtkheaderbaraccessible.lo \
a11y/libgtk_3_la-gtkiconviewaccessible.lo \
a11y/libgtk_3_la-gtkimageaccessible.lo \
a11y/libgtk_3_la-gtkimagecellaccessible.lo \
@@ -1389,6 +1391,7 @@
a11y/gtkflowboxaccessible.h \
a11y/gtkflowboxchildaccessible.h \
a11y/gtkframeaccessible.h \
+ a11y/gtkheaderbaraccessible.h \
a11y/gtkiconviewaccessible.h \
a11y/gtkimageaccessible.h \
a11y/gtkimagecellaccessible.h \
@@ -1463,6 +1466,7 @@
a11y/gtkflowboxaccessible.c \
a11y/gtkflowboxchildaccessible.c \
a11y/gtkframeaccessible.c \
+ a11y/gtkheaderbaraccessible.c \
a11y/gtkiconviewaccessible.c \
a11y/gtkimageaccessible.c \
a11y/gtkimagecellaccessible.c \
@@ -2702,6 +2706,8 @@
a11y/$(DEPDIR)/$(am__dirstamp)
a11y/libgtk_3_la-gtkframeaccessible.lo: a11y/$(am__dirstamp) \
a11y/$(DEPDIR)/$(am__dirstamp)
+a11y/libgtk_3_la-gtkheaderbaraccessible.lo: a11y/$(am__dirstamp) \
+ a11y/$(DEPDIR)/$(am__dirstamp)
a11y/libgtk_3_la-gtkiconviewaccessible.lo: a11y/$(am__dirstamp) \
a11y/$(DEPDIR)/$(am__dirstamp)
a11y/libgtk_3_la-gtkimageaccessible.lo: a11y/$(am__dirstamp) \
@@ -3447,6 +3453,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@a11y/$(DEPDIR)/libgtk_3_la-gtkflowboxaccessible.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@a11y/$(DEPDIR)/libgtk_3_la-gtkflowboxchildaccessible.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@a11y/$(DEPDIR)/libgtk_3_la-gtkframeaccessible.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@a11y/$(DEPDIR)/libgtk_3_la-gtkheaderbaraccessible.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@a11y/$(DEPDIR)/libgtk_3_la-gtkiconviewaccessible.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@a11y/$(DEPDIR)/libgtk_3_la-gtkimageaccessible.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@a11y/$(DEPDIR)/libgtk_3_la-gtkimagecellaccessible.Plo@am__quote@
@@ -3705,6 +3712,13 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtk_3_la_CFLAGS) $(CFLAGS) -c -o a11y/libgtk_3_la-gtkframeaccessible.lo `test -f 'a11y/gtkframeaccessible.c' || echo '$(srcdir)/'`a11y/gtkframeaccessible.c
+a11y/libgtk_3_la-gtkheaderbaraccessible.lo: a11y/gtkheaderbaraccessible.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtk_3_la_CFLAGS) $(CFLAGS) -MT a11y/libgtk_3_la-gtkheaderbaraccessible.lo -MD -MP -MF a11y/$(DEPDIR)/libgtk_3_la-gtkheaderbaraccessible.Tpo -c -o a11y/libgtk_3_la-gtkheaderbaraccessible.lo `test -f 'a11y/gtkheaderbaraccessible.c' || echo '$(srcdir)/'`a11y/gtkheaderbaraccessible.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) a11y/$(DEPDIR)/libgtk_3_la-gtkheaderbaraccessible.Tpo a11y/$(DEPDIR)/libgtk_3_la-gtkheaderbaraccessible.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a11y/gtkheaderbaraccessible.c' object='a11y/libgtk_3_la-gtkheaderbaraccessible.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtk_3_la_CFLAGS) $(CFLAGS) -c -o a11y/libgtk_3_la-gtkheaderbaraccessible.lo `test -f 'a11y/gtkheaderbaraccessible.c' || echo '$(srcdir)/'`a11y/gtkheaderbaraccessible.c
+
a11y/libgtk_3_la-gtkiconviewaccessible.lo: a11y/gtkiconviewaccessible.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtk_3_la_CFLAGS) $(CFLAGS) -MT a11y/libgtk_3_la-gtkiconviewaccessible.lo -MD -MP -MF a11y/$(DEPDIR)/libgtk_3_la-gtkiconviewaccessible.Tpo -c -o a11y/libgtk_3_la-gtkiconviewaccessible.lo `test -f 'a11y/gtkiconviewaccessible.c' || echo '$(srcdir)/'`a11y/gtkiconviewaccessible.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) a11y/$(DEPDIR)/libgtk_3_la-gtkiconviewaccessible.Tpo a11y/$(DEPDIR)/libgtk_3_la-gtkiconviewaccessible.Plo
diff --git a/gtk/a11y/gtkheaderbaraccessible.c b/gtk/a11y/gtkheaderbaraccessible.c
new file mode 100644
index 0000000000..3610ac0d1f
--- /dev/null
+++ b/gtk/a11y/gtkheaderbaraccessible.c
@@ -0,0 +1,87 @@
+/* GTK+ - accessibility implementations
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gtkheaderbaraccessible.h"
+
+#include "gtkcontainerprivate.h"
+
+G_DEFINE_TYPE (GtkHeaderBarAccessible, gtk_header_bar_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE)
+
+static void
+count_widget (GtkWidget *widget,
+ gint *count)
+{
+ (*count)++;
+}
+
+static gint
+gtk_header_bar_accessible_get_n_children (AtkObject* obj)
+{
+ GtkWidget *widget;
+ gint count = 0;
+
+ widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
+ if (widget == NULL)
+ return 0;
+
+ gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) count_widget, &count);
+ return count;
+}
+
+static AtkObject *
+gtk_header_bar_accessible_ref_child (AtkObject *obj,
+ gint i)
+{
+ GList *children, *tmp_list;
+ AtkObject *accessible;
+ GtkWidget *widget;
+
+ widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
+ if (widget == NULL)
+ return NULL;
+
+ children = gtk_container_get_all_children (GTK_CONTAINER (widget));
+ tmp_list = g_list_nth (children, i);
+ if (!tmp_list)
+ {
+ g_list_free (children);
+ return NULL;
+ }
+ accessible = gtk_widget_get_accessible (GTK_WIDGET (tmp_list->data));
+
+ g_list_free (children);
+ g_object_ref (accessible);
+
+ return accessible;
+}
+
+static void
+gtk_header_bar_accessible_class_init (GtkHeaderBarAccessibleClass *klass)
+{
+ AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
+
+ class->get_n_children = gtk_header_bar_accessible_get_n_children;
+ class->ref_child = gtk_header_bar_accessible_ref_child;
+}
+
+static void
+gtk_header_bar_accessible_init (GtkHeaderBarAccessible *header_bar)
+{
+}
+
diff --git a/gtk/a11y/gtkheaderbaraccessible.h b/gtk/a11y/gtkheaderbaraccessible.h
new file mode 100644
index 0000000000..fca9428a94
--- /dev/null
+++ b/gtk/a11y/gtkheaderbaraccessible.h
@@ -0,0 +1,55 @@
+/* GTK+ - accessibility implementations
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GTK_HEADER_BAR_ACCESSIBLE_H__
+#define __GTK_HEADER_BAR_ACCESSIBLE_H__
+
+#if !defined (__GTK_A11Y_H_INSIDE__) && !defined (GTK_COMPILATION)
+#error "Only <gtk/gtk-a11y.h> can be included directly."
+#endif
+
+#include <gtk/a11y/gtkcontaineraccessible.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_HEADER_BAR_ACCESSIBLE (gtk_header_bar_accessible_get_type ())
+#define GTK_HEADER_BAR_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_HEADER_BAR_ACCESSIBLE, GtkHeaderBarAccessible))
+#define GTK_HEADER_BAR_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_HEADER_BAR_ACCESSIBLE, GtkHeaderBarAccessibleClass))
+#define GTK_IS_HEADER_BAR_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_HEADER_BAR_ACCESSIBLE))
+#define GTK_IS_HEADER_BAR_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_HEADER_BAR_ACCESSIBLE))
+#define GTK_HEADER_BAR_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_HEADER_BAR_ACCESSIBLE, GtkHeaderBarAccessibleClass))
+
+typedef struct _GtkHeaderBarAccessible GtkHeaderBarAccessible;
+typedef struct _GtkHeaderBarAccessibleClass GtkHeaderBarAccessibleClass;
+typedef struct _GtkHeaderBarAccessiblePrivate GtkHeaderBarAccessiblePrivate;
+
+struct _GtkHeaderBarAccessible
+{
+ GtkContainerAccessible parent;
+};
+
+struct _GtkHeaderBarAccessibleClass
+{
+ GtkContainerAccessibleClass parent_class;
+};
+
+GDK_AVAILABLE_IN_ALL
+GType gtk_header_bar_accessible_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GTK_HEADER_BAR_ACCESSIBLE_H__ */
diff --git a/gtk/gtkcontainerprivate.h b/gtk/gtkcontainerprivate.h
index 7402a6676b..547e0295c3 100644
--- a/gtk/gtkcontainerprivate.h
+++ b/gtk/gtkcontainerprivate.h
@@ -42,6 +42,7 @@ void _gtk_container_maybe_start_idle_sizer (GtkContainer *container);
gboolean _gtk_container_get_border_width_set (GtkContainer *container);
void _gtk_container_set_border_width_set (GtkContainer *container,
gboolean border_width_set);
+GList * gtk_container_get_all_children (GtkContainer *container);
void gtk_container_get_children_clip (GtkContainer *container,
GtkAllocation *out_clip);
void gtk_container_set_default_resize_mode (GtkContainer *container,
diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c
index dd7d2093c9..0ef94e3c84 100644
--- a/gtk/gtkheaderbar.c
+++ b/gtk/gtkheaderbar.c
@@ -30,7 +30,7 @@
#include "gtkwindowprivate.h"
#include "gtkwidgetprivate.h"
#include "gtkcontainerprivate.h"
-#include "a11y/gtkcontaineraccessible.h"
+#include "a11y/gtkheaderbaraccessible.h"
#include <string.h>
@@ -2118,6 +2118,7 @@ gtk_header_bar_class_init (GtkHeaderBarClass *class)
g_object_class_install_properties (object_class, LAST_PROP, header_bar_props);
+ gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_HEADER_BAR_ACCESSIBLE);
gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_PANEL);
gtk_widget_class_set_css_name (widget_class, "headerbar");
}
--
2.21.0

View File

@ -0,0 +1,41 @@
From 12a00f024c16a4540d5f457389fada2a4886d884 Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Tue, 25 May 2021 16:07:58 -0400
Subject: [PATCH] entry: Only offer Emoji if requested
Only offer the "Insert Emoji" context menu when input
hints explicitly suggest supporting Emoji.
---
gtk/gtkentry.c | 2 +-
gtk/gtktextview.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index a01684101f..1f5a790ccc 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -9591,7 +9591,7 @@ popup_targets_received (GtkClipboard *clipboard,
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
if (info_entry_priv->show_emoji_icon ||
- (gtk_entry_get_input_hints (entry) & GTK_INPUT_HINT_NO_EMOJI) == 0)
+ (gtk_entry_get_input_hints (entry) & GTK_INPUT_HINT_EMOJI) != 0)
{
menuitem = gtk_menu_item_new_with_mnemonic (_("Insert _Emoji"));
gtk_widget_set_sensitive (menuitem,
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index e0b1e20e87..eb53843fa6 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -9521,7 +9521,7 @@ popup_targets_received (GtkClipboard *clipboard,
gtk_widget_show (menuitem);
gtk_menu_shell_append (GTK_MENU_SHELL (priv->popup_menu), menuitem);
- if ((gtk_text_view_get_input_hints (text_view) & GTK_INPUT_HINT_NO_EMOJI) == 0)
+ if ((gtk_text_view_get_input_hints (text_view) & GTK_INPUT_HINT_EMOJI) != 0)
{
menuitem = gtk_menu_item_new_with_mnemonic (_("Insert _Emoji"));
gtk_widget_set_sensitive (menuitem, can_insert);
--
2.31.1

View File

@ -0,0 +1,72 @@
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 19090772201388c31bffba9f56db0e6e707f6093..a931d2bad5094aec76fc91c57792034357ed94d1 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -1900,10 +1900,19 @@ gtk_scrolled_window_measure (GtkCssGadget *gadget,
*/
if (policy_may_be_visible (priv->hscrollbar_policy))
{
- minimum_req.width = MAX (minimum_req.width, hscrollbar_requisition.width + sborder.left + sborder.right);
- natural_req.width = MAX (natural_req.width, hscrollbar_requisition.width + sborder.left + sborder.right);
+ int vscrollbar_extra_size;
- if (!priv->use_indicators && priv->hscrollbar_policy == GTK_POLICY_ALWAYS)
+ if (!priv->use_indicators && policy_may_be_visible (priv->vscrollbar_policy))
+ vscrollbar_extra_size = vscrollbar_requisition.width;
+ else
+ vscrollbar_extra_size = 0;
+
+ minimum_req.width = MAX (minimum_req.width,
+ hscrollbar_requisition.width + sborder.left + sborder.right + vscrollbar_extra_size);
+ natural_req.width = MAX (natural_req.width,
+ hscrollbar_requisition.width + sborder.left + sborder.right + vscrollbar_extra_size);
+
+ if (!priv->use_indicators)
{
minimum_req.height += scrollbar_spacing + hscrollbar_requisition.height;
natural_req.height += scrollbar_spacing + hscrollbar_requisition.height;
@@ -1912,10 +1921,19 @@ gtk_scrolled_window_measure (GtkCssGadget *gadget,
if (policy_may_be_visible (priv->vscrollbar_policy))
{
- minimum_req.height = MAX (minimum_req.height, vscrollbar_requisition.height + sborder.top + sborder.bottom);
- natural_req.height = MAX (natural_req.height, vscrollbar_requisition.height + sborder.top + sborder.bottom);
+ int hscrollbar_extra_size;
+
+ if (!priv->use_indicators && policy_may_be_visible (priv->hscrollbar_policy))
+ hscrollbar_extra_size = hscrollbar_requisition.height;
+ else
+ hscrollbar_extra_size = 0;
+
+ minimum_req.height = MAX (minimum_req.height,
+ vscrollbar_requisition.height + sborder.top + sborder.bottom + hscrollbar_extra_size);
+ natural_req.height = MAX (natural_req.height,
+ vscrollbar_requisition.height + sborder.top + sborder.bottom + hscrollbar_extra_size);
- if (!priv->use_indicators && priv->vscrollbar_policy == GTK_POLICY_ALWAYS)
+ if (!priv->use_indicators)
{
minimum_req.width += scrollbar_spacing + vscrollbar_requisition.width;
natural_req.width += scrollbar_spacing + vscrollbar_requisition.width;
diff --git a/testsuite/gtk/scrolledwindow.c b/testsuite/gtk/scrolledwindow.c
index c6093d8256e52071e00885d266d92b5bb7e664f7..e141fe35baa628592114e6cceebe8863b7b078dd 100644
--- a/testsuite/gtk/scrolledwindow.c
+++ b/testsuite/gtk/scrolledwindow.c
@@ -58,7 +58,7 @@ test_size (gboolean overlay,
/* If the relevant scrollbar is non-overlay and always shown, it is added
* to the preferred size. When comparing to the expected size, we need to
* to exclude that extra, as we are only interested in the content size */
- if (!overlay && policy == GTK_POLICY_ALWAYS)
+ if (!overlay)
{
GtkWidget *scrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (scrolledwindow));
gtk_widget_get_preferred_width (scrollbar, &scrollbar_size, NULL);
@@ -87,7 +87,7 @@ test_size (gboolean overlay,
gtk_widget_get_preferred_height (box, &child_size, NULL);
}
- if (!overlay && policy == GTK_POLICY_ALWAYS)
+ if (!overlay)
{
GtkWidget *scrollbar = gtk_scrolled_window_get_hscrollbar (GTK_SCROLLED_WINDOW (scrolledwindow));
gtk_widget_get_preferred_height (scrollbar, &scrollbar_size, NULL);

View File

@ -0,0 +1,49 @@
From 8ce68a519414df141e3de7432ab4d55564e933a0 Mon Sep 17 00:00:00 2001
From: Philip Withnall <withnall@endlessm.com>
Date: Fri, 4 Oct 2019 18:25:34 +0100
Subject: [PATCH] =?UTF-8?q?gtklistbox:=20Only=20unparent=20header=20rows?=
=?UTF-8?q?=20if=20they=20haven=E2=80=99t=20been=20reused?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Its possible for code which uses a `GtkListBox` to reuse a single
header row, and move it around between rows. For example, this might
happen if the code has interactive widgets (like buttons) in the row,
and doesnt want to continually recreate them and reattach signals to
them whenever the row headers change.
Unfortunately, this was broken, as the old header widget was
unconditionally unparented, even if it had just been set as the header
for a different row in the same `GtkListBox`. This left it assigned as
a child widget in the `GtkListBox` (so it was iterated over by
`forall`), but without its parent widget set.
Fix that by only unparenting the header if it hasnt already been
assigned as the parent of a different row.
Signed-off-by: Philip Withnall <withnall@endlessm.com>
---
gtk/gtklistbox.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index 36f9ec5246..db3ec5cbb8 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -2426,8 +2426,11 @@ gtk_list_box_update_header (GtkListBox *box,
priv->update_header_func_target);
if (old_header != ROW_PRIV (row)->header)
{
- if (old_header != NULL)
+ if (old_header != NULL &&
+ g_hash_table_lookup (priv->header_hash, old_header) == row)
{
+ /* Only unparent the @old_header if it hasnt been re-used as the
+ * header for a different row. */
gtk_widget_unparent (old_header);
g_hash_table_remove (priv->header_hash, old_header);
}
--
2.18.2

View File

@ -0,0 +1,70 @@
From b541ad48d1c7060e2d38205d4874675e27578b9b Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Mon, 19 Jul 2021 13:10:31 -0400
Subject: [PATCH] reftests: Enforce default settings
Set all settings to their default values, so we
are less dependent on the environment to be set
up just right. In particular, this fixes animations
being disabled when we happen to run in a vm.
---
testsuite/reftests/gtk-reftest.c | 36 ++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/testsuite/reftests/gtk-reftest.c b/testsuite/reftests/gtk-reftest.c
index 585e1c393d..1a51a9756b 100644
--- a/testsuite/reftests/gtk-reftest.c
+++ b/testsuite/reftests/gtk-reftest.c
@@ -368,6 +368,40 @@ add_test_for_file (GFile *file)
g_list_free_full (files, g_object_unref);
}
+static void
+enforce_default_settings (void)
+{
+ GtkSettings *settings;
+ GTypeClass *klass;
+ GParamSpec **pspecs;
+ guint n_pspecs;
+ int i;
+
+ settings = gtk_settings_get_default ();
+
+ klass = g_type_class_ref (G_OBJECT_TYPE (settings));
+
+ pspecs = g_object_class_list_properties (klass, &n_pspecs);
+ for (i = 0; i < n_pspecs; i++)
+ {
+ GParamSpec *pspec = pspecs[i];
+ const GValue *value;
+
+ if ((pspec->flags & G_PARAM_WRITABLE) == 0)
+ continue;
+
+ if (pspec->value_type == G_TYPE_HASH_TABLE)
+ continue;
+
+ value = g_param_spec_get_default_value (pspec);
+ g_object_set_property (settings, pspec->name, value);
+ }
+
+ g_free (pspecs);
+
+ g_type_class_unref (klass);
+}
+
int
main (int argc, char **argv)
{
@@ -382,6 +416,8 @@ main (int argc, char **argv)
if (!parse_command_line (&argc, &argv))
return 1;
+ enforce_default_settings ();
+
if (arg_base_dir)
basedir = arg_base_dir;
else
--
2.31.1

View File

@ -0,0 +1,50 @@
From 26b24916c8570a73bdc9d7a736584ceb68384c81 Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Fri, 31 May 2019 11:51:20 -0400
Subject: [PATCH 2/2] scrolled window: respect overlay-scrolling setting
If the gtk-overlay-scrolling setting is FALSE,
don't use overlay scrollbars.
---
gtk/gtkscrolledwindow.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index d52ccf646c..b2dc1d1c79 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -704,6 +704,9 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
* is present. Otherwise, they are overlayed on top of the content,
* as narrow indicators.
*
+ * Note that overlay scrolling can also be globally disabled, with
+ * the #GtkSettings::gtk-overlay-scrolling setting.
+ *
* Since: 3.16
*/
properties[PROP_OVERLAY_SCROLLING] =
@@ -4163,6 +4166,7 @@ gtk_scrolled_window_map (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_scrolled_window_parent_class)->map (widget);
gtk_scrolled_window_update_animating (scrolled_window);
+ gtk_scrolled_window_update_use_indicators (scrolled_window);
}
static void
@@ -4439,8 +4443,12 @@ gtk_scrolled_window_update_use_indicators (GtkScrolledWindow *scrolled_window)
{
GtkScrolledWindowPrivate *priv = scrolled_window->priv;
gboolean use_indicators;
+ GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (scrolled_window));
+ gboolean overlay_scrolling;
+
+ g_object_get (settings, "gtk-overlay-scrolling", &overlay_scrolling, NULL);
- use_indicators = priv->overlay_scrolling;
+ use_indicators = overlay_scrolling && priv->overlay_scrolling;
if (g_strcmp0 (g_getenv ("GTK_OVERLAY_SCROLLING"), "0") == 0)
use_indicators = FALSE;
--
2.23.0

1
EMPTY
View File

@ -1 +0,0 @@

View File

@ -0,0 +1,40 @@
From 4ba89f25b8a88616afc1915bdb4fb87d13efae6f Mon Sep 17 00:00:00 2001
From: Benjamin Otte <otte@redhat.com>
Date: Tue, 15 Jun 2021 19:34:37 +0200
Subject: [PATCH] cellarea: Don't shrink area too much
Do not compute rectangles with negative width/height. This avoids
assertion failures further down when those rectangles were actually
checked.
https://bugzilla.redhat.com/show_bug.cgi?id=1962215
---
gtk/gtkcellarea.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/gtk/gtkcellarea.c b/gtk/gtkcellarea.c
index 575e1c7fde..d1b3b1a279 100644
--- a/gtk/gtkcellarea.c
+++ b/gtk/gtkcellarea.c
@@ -3563,8 +3563,18 @@ gtk_cell_area_inner_cell_area (GtkCellArea *area,
*inner_area = *cell_area;
+ if (border.left + border.right > cell_area->width)
+ {
+ border.left = cell_area->width / 2;
+ border.right = (cell_area->width + 1) / 2;
+ }
inner_area->x += border.left;
inner_area->width -= border.left + border.right;
+ if (border.top + border.bottom > cell_area->height)
+ {
+ border.top = cell_area->height / 2;
+ border.bottom = (cell_area->height + 1) / 2;
+ }
inner_area->y += border.top;
inner_area->height -= border.top + border.bottom;
}
--
GitLab

View File

@ -0,0 +1,91 @@
From d4f62b44d47e3dddfb57add4f1f76cab0297584d Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Fri, 11 Jun 2021 08:53:46 -0400
Subject: [PATCH 1/2] a11y: Fix ref counting in tree views
GtkContainerCellAccessible wasn't unsetting accessible
parents. Fix that.
By itself, this doesn't help for freeing a memory leak,
since AtkObject keeps a ref on its parent, so we never
free the GtkContainerCellAccessible as long as it has children.
---
gtk/a11y/gtkcontainercellaccessible.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/gtk/a11y/gtkcontainercellaccessible.c b/gtk/a11y/gtkcontainercellaccessible.c
index a756e3cadf..a40446fb47 100644
--- a/gtk/a11y/gtkcontainercellaccessible.c
+++ b/gtk/a11y/gtkcontainercellaccessible.c
@@ -30,12 +30,19 @@ struct _GtkContainerCellAccessiblePrivate
G_DEFINE_TYPE_WITH_PRIVATE (GtkContainerCellAccessible, gtk_container_cell_accessible, GTK_TYPE_CELL_ACCESSIBLE)
+static void
+unset_child (gpointer child)
+{
+ atk_object_set_parent (ATK_OBJECT (child), NULL);
+ g_object_unref (child);
+}
+
static void
gtk_container_cell_accessible_finalize (GObject *obj)
{
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (obj);
- g_list_free_full (container->priv->children, g_object_unref);
+ g_list_free_full (container->priv->children, unset_child);
G_OBJECT_CLASS (gtk_container_cell_accessible_parent_class)->finalize (obj);
}
@@ -157,6 +164,7 @@ gtk_container_cell_accessible_remove_child (GtkContainerCellAccessible *containe
g_return_if_fail (GTK_IS_CELL_ACCESSIBLE (child));
g_return_if_fail (container->priv->n_children > 0);
+ atk_object_set_parent (ATK_OBJECT (child), NULL);
container->priv->children = g_list_remove (container->priv->children, child);
container->priv->n_children--;
--
GitLab
From 21f8098261486417db371b202bc0494c12017468 Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Fri, 11 Jun 2021 08:55:48 -0400
Subject: [PATCH 2/2] a11y: Plug a memory leak with treeviews
We need to explicitly remove the children from
a GtkContainerCellAccessible, since they otherwise
keep the parent alive.
Fixes: #3981
---
gtk/a11y/gtktreeviewaccessible.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c
index adad462064..c1a2097a1e 100644
--- a/gtk/a11y/gtktreeviewaccessible.c
+++ b/gtk/a11y/gtktreeviewaccessible.c
@@ -104,6 +104,17 @@ static void
cell_info_free (GtkTreeViewAccessibleCellInfo *cell_info)
{
gtk_accessible_set_widget (GTK_ACCESSIBLE (cell_info->cell), NULL);
+ if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (cell_info->cell))
+ {
+ GList *children;
+
+ while ((children = gtk_container_cell_accessible_get_children (GTK_CONTAINER_CELL_ACCESSIBLE (cell_info->cell))) != NULL)
+ {
+ GtkCellAccessible *child = children->data;
+ gtk_container_cell_accessible_remove_child (GTK_CONTAINER_CELL_ACCESSIBLE (cell_info->cell), child);
+ }
+ }
+
g_object_unref (cell_info->cell);
g_free (cell_info);
--
GitLab

View File

@ -0,0 +1,27 @@
From cc977be580b9a7c2683810fe36fe485ee8583ec0 Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Fri, 11 Feb 2022 18:39:55 -0500
Subject: [PATCH] Fix a leak of cell accessibles
gtk_container_cell_accessible_add_child is transfer none,
so we need to drop the reference we hold, otherwise it
leaks.
---
gtk/a11y/gtktreeviewaccessible.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c
index c1a2097a1e..c2b7e8add0 100644
--- a/gtk/a11y/gtktreeviewaccessible.c
+++ b/gtk/a11y/gtktreeviewaccessible.c
@@ -413,6 +413,7 @@ create_cell_accessible (GtkTreeView *treeview,
{
cell = create_cell_accessible_for_renderer (l->data, GTK_WIDGET (treeview), ATK_OBJECT (container));
gtk_container_cell_accessible_add_child (container, cell);
+ g_object_unref (cell);
}
cell = GTK_CELL_ACCESSIBLE (container);
--
GitLab

View File

@ -0,0 +1,51 @@
From c3503fcc84eec0bcf857cc744580aa9a4d5dc7eb Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Tue, 13 Apr 2021 14:10:27 -0400
Subject: [PATCH] x11: Be quiet on exit by default
The condition we check for to catch X servers going away
may not be accurate anymore, and the warning shows up in
logs, causing customers to be concerned. So, be quiet by
default, unless the user explicitly asked for a message.
---
gdk/x11/gdkmain-x11.c | 23 ++++++-----------------
1 file changed, 6 insertions(+), 17 deletions(-)
diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c
index 64c7cb4302..cd877ce3e4 100644
--- a/gdk/x11/gdkmain-x11.c
+++ b/gdk/x11/gdkmain-x11.c
@@ -240,24 +240,13 @@ gdk_x_io_error (Display *display)
/* This is basically modelled after the code in XLib. We need
* an explicit error handler here, so we can disable our atexit()
* which would otherwise cause a nice segfault.
- * We fprintf(stderr, instead of g_warning() because g_warning()
- * could possibly be redirected to a dialog
+ * We g_debug() instead of g_warning(), because g_warning()
+ * could possibly be redirected to the log
*/
- if (errno == EPIPE)
- {
- g_message ("The application '%s' lost its connection to the display %s;\n"
- "most likely the X server was shut down or you killed/destroyed\n"
- "the application.\n",
- g_get_prgname (),
- display ? DisplayString (display) : gdk_get_display_arg_name ());
- }
- else
- {
- g_message ("%s: Fatal IO error %d (%s) on X server %s.\n",
- g_get_prgname (),
- errno, g_strerror (errno),
- display ? DisplayString (display) : gdk_get_display_arg_name ());
- }
+ g_debug ("%s: Fatal IO error %d (%s) on X server %s.\n",
+ g_get_prgname (),
+ errno, g_strerror (errno),
+ display ? DisplayString (display) : gdk_get_display_arg_name ());
_exit (1);
}
--
GitLab

1208
gtk3.spec Normal file

File diff suppressed because it is too large Load Diff

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (gtk+-3.22.30.tar.xz) = 31440a615cb2f406d0f904e59febb8f876106f27818ddd6951c76ab9bcb421ca480dae2bebfb1c4b1e03b833fc7c42e9feede053d9d71f19a02fe778e3197b38