[neon/snap-packaging/kf6-core-sdk/work.core24] /: Add patches

Scarlett Moore null at kde.org
Mon Apr 21 12:13:53 BST 2025


Git commit 55894924cc8b23fc064239d4fba70f93b6afad93 by Scarlett Moore.
Committed on 21/04/2025 at 11:13.
Pushed by scarlettmoore into branch 'work.core24'.

Add patches

A  +225  -0    patches/libcanberra/gtk-module-Handle-display-closing-gracefully.patch
A  +121  -0    patches/libcanberra/gtk_dont_assume_x11.patch
M  +0    -2    snapcraft.yaml

https://invent.kde.org/neon/snap-packaging/kf6-core-sdk/-/commit/55894924cc8b23fc064239d4fba70f93b6afad93

diff --git a/patches/libcanberra/gtk-module-Handle-display-closing-gracefully.patch b/patches/libcanberra/gtk-module-Handle-display-closing-gracefully.patch
new file mode 100644
index 0000000..1f7023d
--- /dev/null
+++ b/patches/libcanberra/gtk-module-Handle-display-closing-gracefully.patch
@@ -0,0 +1,225 @@
+From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail at 3v1n0.net>
+Date: Fri, 8 Apr 2022 20:12:04 +0200
+Subject: gtk-module: Handle display closing gracefully
+
+Modern desktop environments may have X running optionally, so the
+canberra module may be unloaded because of this reason.
+
+However we didn't handle it properly because of a long-standing issue
+due to missing quit signal on Gtk 3, also we it may happen that a
+widget gets destroyed because of that, but we were still trying to unref
+them again during the dispatch_queue() idle.
+
+To avoid this, let's track the "closed" display signal and let's monitor
+for disposed (same as using "destroy" signal) objects, removing them from
+the queue earlier.
+
+ #0  g_log_writer_default (log_level=<optimized out>, fields=0x7ffcf2f236c0,
+     n_fields=6, user_data=0x0) at ../../../glib/gmessages.c:557
+ #1  0x00007f355eb3cc93 in g_log_structured_array (n_fields=6,
+     fields=0x7ffcf2f236c0, log_level=G_LOG_LEVEL_ERROR)
+     at ../../../glib/gmessages.c:1973
+ #2  g_log_structured_array (log_level=G_LOG_LEVEL_ERROR,
+     fields=0x7ffcf2f236c0, n_fields=6) at ../../../glib/gmessages.c:1946
+ #3  0x00007f355eb3ce93 in g_log_structured_standard (
+     log_domain=log_domain at entry=0x7f355e6be063 "Gtk",
+     log_level=log_level at entry=G_LOG_LEVEL_ERROR,
+     file=file at entry=0x7f355e724138 "../../../../gtk/gtkstylecontext.c",
+     line=line at entry=0x7f355e6ddea4 "348",
+     func=func at entry=0x7f355e724c70 <__func__.70> "gtk_style_context_init",
+     message_format=message_format at entry=0x7f355e724458
+     "Can't create a GtkStyleContext without a display connection")
+     at ../../../glib/gmessages.c:2030
+ #4  0x00007f355e5b45cf in gtk_style_context_init (context=0x555ee32475d0)
+     at ../../../../gtk/gtkstylecontext.c:348
+ #5  0x00007f355ec57efa in g_type_create_instance (type=<optimized out>)
+     at ../../../gobject/gtype.c:1929
+ #6  0x00007f355ec3ef4d in g_object_new_internal (
+     class=class at entry=0x555ee2ec1c60, params=params at entry=0x0,
+     n_params=n_params at entry=0) at ../../../gobject/gobject.c:2011
+ #7  0x00007f355ec401ad in g_object_new_with_properties (
+     object_type=93866027507792, n_properties=0, names=names at entry=0x0,
+     values=values at entry=0x0) at ../../../gobject/gobject.c:2181
+ #8  0x00007f355ec40cb1 in g_object_new (object_type=<optimized out>,
+     first_property_name=<optimized out>) at ../../../gobject/gobject.c:1821
+ #9  0x00007f355e393f80 in _gtk_style_new_for_path (screen=0x0,
+     path=path at entry=0x555ee2ccd4b0)
+     at ../../../../gtk/deprecated/gtkstyle.c:854
+ #10 0x00007f355e3941f3 in gtk_style_new ()
+     at ../../../../gtk/deprecated/gtkstyle.c:888
+ #11 0x00007f355e398b71 in gtk_widget_get_default_style ()
+     at ../../../../gtk/deprecated/gtkstyle.c:4061
+ #12 gtk_widget_get_default_style ()
+     at ../../../../gtk/deprecated/gtkstyle.c:4050
+ #13 0x00007f355e65e8ee in gtk_widget_real_destroy (object=0x555ee3d54320)
+     at ../../../../gtk/gtkwidget.c:12356
+ #14 0x00007f355dec62a7 in ?? () from /lib/x86_64-linux-gnu/libmutter-10.so.0
+ #15 0x00007f355ec2ed2f in g_closure_invoke (closure=0x555ee10ccac0,
+     return_value=0x0, n_param_values=1, param_values=0x7ffcf2f24180,
+     invocation_hint=0x7ffcf2f24100) at ../../../gobject/gclosure.c:830
+ #16 0x00007f355ec4aae0 in signal_emit_unlocked_R (
+     node=node at entry=0x555ee0fcd450, detail=detail at entry=0,
+     instance=instance at entry=0x555ee3d54320,
+     emission_return=emission_return at entry=0x0,
+     instance_and_params=instance_and_params at entry=0x7ffcf2f24180)
+     at ../../../gobject/gsignal.c:3861
+ #17 0x00007f355ec4c554 in g_signal_emit_valist (instance=<optimized out>,
+     signal_id=<optimized out>, detail=<optimized out>,
+     var_args=var_args at entry=0x7ffcf2f24330)
+     at ../../../gobject/gsignal.c:3496
+ #18 0x00007f355ec4c7a3 in g_signal_emit (
+     instance=instance at entry=0x555ee3d54320, signal_id=<optimized out>,
+     detail=detail at entry=0) at ../../../gobject/gsignal.c:3553
+ #19 0x00007f355e65e600 in gtk_widget_dispose (object=0x555ee3d54320)
+     at ../../../../gtk/gtkwidget.c:12166
+ #20 0x00007f355e66e0ee in gtk_window_dispose (object=0x555ee3d54320)
+     at ../../../../gtk/gtkwindow.c:3168
+ #21 0x00007f355ec3cd31 in g_object_unref (_object=<optimized out>)
+     at ../../../gobject/gobject.c:3636
+ #22 g_object_unref (_object=0x555ee3d54320)
+     at ../../../gobject/gobject.c:3553
+ #23 0x00007f352d6f1bfe in free_sound_event (d=0x7f3544280870)
+     at /build/libcanberra-DU1C23/libcanberra-0.30/src/canberra-gtk-module.c:184
+ #24 dispatch_queue ()
+     at /build/libcanberra-DU1C23/libcanberra-0.30/src/canberra-gtk-module.c:840
+ #25 idle_cb (userdata=<optimized out>)
+     at /build/libcanberra-DU1C23/libcanberra-0.30/src/canberra-gtk-module.c:847
+ #26 0x00007f355da452ad in gdk_threads_dispatch (data=0x7f35080db680)
+     at ../../../../gdk/gdk.c:769
+ #27 0x00007f355eb35c24 in g_main_dispatch (context=0x555ee08d8bd0)
+     at ../../../glib/gmain.c:3417
+ #28 g_main_context_dispatch (context=0x555ee08d8bd0)
+     at ../../../glib/gmain.c:4135
+ #29 0x00007f355eb8a6f8 in g_main_context_iterate.constprop.0 (
+     context=0x555ee08d8bd0, block=block at entry=1, dispatch=dispatch at entry=1,
+     self=<optimized out>) at ../../../glib/gmain.c:4211
+ #30 0x00007f355eb35293 in g_main_loop_run (loop=0x555ee29a8f50)
+     at ../../../glib/gmain.c:4411
+ #31 0x00007f355dea6209 in meta_context_run_main_loop ()
+    from /lib/x86_64-linux-gnu/libmutter-10.so.0
+ #32 0x0000555edf819ed2 in ?? ()
+ #33 0x00007f355dbd7d90 in __libc_start_call_main (
+     main=main at entry=0x555edf819a30, argc=argc at entry=1,
+     argv=argv at entry=0x7ffcf2f24838)
+     at ../sysdeps/nptl/libc_start_call_main.h:58
+ #34 0x00007f355dbd7e40 in __libc_start_main_impl (main=0x555edf819a30,
+     argc=1, argv=0x7ffcf2f24838, init=<optimized out>, fini=<optimized out>,
+     rtld_fini=<optimized out>, stack_end=0x7ffcf2f24828)
+     at ../csu/libc-start.c:392
+ #35 0x0000555edf81a155 in ?? ()
+
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1949200
+---
+ src/canberra-gtk-module.c | 57 ++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 52 insertions(+), 5 deletions(-)
+
+diff --git a/src/canberra-gtk-module.c b/src/canberra-gtk-module.c
+index c1532ab..dbeca5e 100644
+--- a/src/canberra-gtk-module.c
++++ b/src/canberra-gtk-module.c
+@@ -114,6 +114,8 @@ static GQuark
+  * exported function */
+ void gtk_module_init(gint *argc, gchar ***argv[]);
+ 
++static void on_object_disposed(gpointer data, GObject *object);
++
+ static const char *translate_message_tye(GtkMessageType mt) {
+         static const char *const message_type_table[] = {
+                 [GTK_MESSAGE_INFO] = "dialog-information",
+@@ -180,8 +182,10 @@ static GtkDialog* find_parent_dialog(GtkWidget *w) {
+ }
+ 
+ static void free_sound_event(SoundEventData *d) {
+-
+-        g_object_unref(d->object);
++        if (d->object) {
++                g_object_weak_unref(d->object, on_object_disposed, d);
++                g_clear_object(&d->object);
++        }
+ 
+         if (d->arg1_is_set)
+                 g_value_unset(&d->arg1);
+@@ -851,6 +855,34 @@ static gboolean idle_cb(void *userdata) {
+ 
+ static void connect_settings(void);
+ 
++static void on_object_disposed(gpointer data, GObject *object)
++{
++        /* Workaround missing handler for gtk_quit in gtk 3.0, but safe to use in 2.0.
++         * As we may try to remove disposed objects on idle, so let's avoid this
++         * by just removing the queued events, if an object gets disposed earlier than
++         * we expect.
++         * https://gitlab.gnome.org/GNOME/glib/-/issues/389
++         */
++        SoundEventData *d = data;
++
++        /* If the object is set here, it means that we're running this as per
++         * the object being disposed when the reference count has not dropped to
++         * 0 yet, as per a manual call of g_object_run_dispose (or
++         * gtk_widget_destroy), so it means that we can safely release the extra
++         * reference that had been added in emission_hook_cb()
++         */
++        g_assert(d->object == NULL || d->object->ref_count > 1);
++        g_clear_object(&d->object);
++
++        g_queue_remove(&sound_event_queue, d);
++        free_sound_event(d);
++
++        if (idle_id && !sound_event_queue.length) {
++                g_source_remove(idle_id);
++                idle_id = 0;
++        }
++}
++
+ static gboolean emission_hook_cb(GSignalInvocationHint *hint, guint n_param_values, const GValue *param_values, gpointer data) {
+         static SoundEventData *d = NULL;
+         GdkEvent *e;
+@@ -889,6 +921,7 @@ static gboolean emission_hook_cb(GSignalInvocationHint *hint, guint n_param_valu
+         d = g_slice_new0(SoundEventData);
+ 
+         d->object = g_object_ref(object);
++        g_object_weak_ref(object, on_object_disposed, d);
+ 
+         d->signal_id = hint->signal_id;
+ 
+@@ -956,8 +989,21 @@ static void connect_settings(void) {
+         connected = TRUE;
+ }
+ 
+-#if GTK_CHECK_VERSION(3,0,0)
+-#warning "We really need a quit handler in Gtk 3.0, https://bugzilla.gnome.org/show_bug.cgi?id=639770"
++#if GTK_CHECK_VERSION(3, 0, 0)
++/* Workaround missing quit_handler on gtk3
++ * https://gitlab.gnome.org/GNOME/glib/-/issues/389
++ */
++
++static void
++on_display_closed(GdkDisplay *display)
++{
++        if (idle_id) {
++                g_source_remove(idle_id);
++                idle_id = 0;
++        }
++
++        dispatch_queue();
++}
+ #else
+ static gboolean quit_handler(gpointer data) {
+         dispatch_queue();
+@@ -966,7 +1012,6 @@ static gboolean quit_handler(gpointer data) {
+ #endif
+ 
+ G_MODULE_EXPORT void gtk_module_init(gint *argc, gchar ***argv[]) {
+-
+         /* This is the same quark libgnomeui uses! */
+         disable_sound_quark = g_quark_from_string("gnome_disable_sound_events");
+         was_iconized_quark = g_quark_from_string("canberra_was_iconized");
+@@ -994,6 +1039,8 @@ G_MODULE_EXPORT void gtk_module_init(gint *argc, gchar ***argv[]) {
+ 
+ #if !GTK_CHECK_VERSION(3,0,0)
+         gtk_quit_add(1, quit_handler, NULL);
++#else
++        g_signal_connect(gdk_display_get_default (), "closed", G_CALLBACK (on_display_closed), NULL);
+ #endif
+ }
+ 
diff --git a/patches/libcanberra/gtk_dont_assume_x11.patch b/patches/libcanberra/gtk_dont_assume_x11.patch
new file mode 100644
index 0000000..f520907
--- /dev/null
+++ b/patches/libcanberra/gtk_dont_assume_x11.patch
@@ -0,0 +1,121 @@
+From: Michael Meeks <michael.meeks at suse.com>
+Date: Fri, 9 Nov 2012 16:16:40 +0000
+Subject: gtk: Don't assume all GdkDisplays are GdkX11Displays:
+ broadway/wayland
+
+Co-Authored-By: Bastien Nocera <hadess at hadess.net>
+
+Origin: https://src.fedoraproject.org/rpms/libcanberra/blob/rawhide/f/0001-gtk-Don-t-assume-all-GdkDisplays-are-GdkX11Displays-.patch
+---
+ src/canberra-gtk-module.c | 15 +++++++++++++++
+ src/canberra-gtk.c        | 28 ++++++++++++++++++++++------
+ 2 files changed, 37 insertions(+), 6 deletions(-)
+
+diff --git a/src/canberra-gtk-module.c b/src/canberra-gtk-module.c
+index 67791f0..c1532ab 100644
+--- a/src/canberra-gtk-module.c
++++ b/src/canberra-gtk-module.c
+@@ -307,6 +307,11 @@ static gint window_get_desktop(GdkDisplay *d, GdkWindow *w) {
+         guchar *data = NULL;
+         gint ret = -1;
+ 
++#ifdef GDK_IS_X11_DISPLAY
++        if (!GDK_IS_X11_DISPLAY(d))
++                return 0;
++#endif
++
+         if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), GDK_WINDOW_XID(w),
+                                gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"),
+                                0, G_MAXLONG, False, XA_CARDINAL, &type_return,
+@@ -335,6 +340,11 @@ static gint display_get_desktop(GdkDisplay *d) {
+         guchar *data = NULL;
+         gint ret = -1;
+ 
++#ifdef GDK_IS_X11_DISPLAY
++        if (!GDK_IS_X11_DISPLAY(d))
++                return 0;
++#endif
++
+         if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), DefaultRootWindow(GDK_DISPLAY_XDISPLAY(d)),
+                                gdk_x11_get_xatom_by_name_for_display(d, "_NET_CURRENT_DESKTOP"),
+                                0, G_MAXLONG, False, XA_CARDINAL, &type_return,
+@@ -365,6 +375,11 @@ static gboolean window_is_xembed(GdkDisplay *d, GdkWindow *w) {
+         gboolean ret = FALSE;
+         Atom xembed;
+ 
++#ifdef GDK_IS_X11_DISPLAY
++        if (!GDK_IS_X11_DISPLAY(d))
++                return FALSE;
++#endif
++
+         /* Gnome Panel applets are XEMBED windows. We need to make sure we
+          * ignore them */
+ 
+diff --git a/src/canberra-gtk.c b/src/canberra-gtk.c
+index 34446f5..47285f8 100644
+--- a/src/canberra-gtk.c
++++ b/src/canberra-gtk.c
+@@ -185,6 +185,11 @@ static gint window_get_desktop(GdkDisplay *d, GdkWindow *w) {
+         guchar *data = NULL;
+         gint ret = -1;
+ 
++#ifdef GDK_IS_X11_DISPLAY
++        if (!GDK_IS_X11_DISPLAY(d))
++                return 0;
++#endif
++
+         if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), GDK_WINDOW_XID(w),
+                                gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"),
+                                0, G_MAXLONG, False, XA_CARDINAL, &type_return,
+@@ -254,18 +259,28 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
+ 
+         if (gtk_widget_get_realized(GTK_WIDGET(w))) {
+                 GdkWindow *dw = NULL;
++#ifdef GDK_IS_X11_DISPLAY
+                 GdkScreen *screen = NULL;
++#endif
+                 GdkDisplay *display = NULL;
+                 gint x = -1, y = -1, width = -1, height = -1, screen_width = -1, screen_height = -1;
+ 
+-                if ((dw = gtk_widget_get_window(GTK_WIDGET(w))))
+-                        if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long) GDK_WINDOW_XID(dw))) < 0)
+-                                return ret;
++                if ((dw = gtk_widget_get_window(GTK_WIDGET(w)))) {
++#ifdef GDK_IS_X11_DISPLAY
++                        if (GDK_IS_X11_DISPLAY(display)) {
++                                if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long) GDK_WINDOW_XID(dw))) < 0)
++                                        return ret;
++                        }
++#endif
++                }
+ 
+                 if ((display = gtk_widget_get_display(GTK_WIDGET(w)))) {
+-                        if ((t = gdk_display_get_name(display)))
++#ifdef GDK_IS_X11_DISPLAY
++                        if (GDK_IS_X11_DISPLAY(display) && (t = gdk_display_get_name(display))) {
+                                 if ((ret = ca_proplist_sets(p, CA_PROP_WINDOW_X11_DISPLAY, t)) < 0)
+                                         return ret;
++                        }
++#endif
+ 
+                         if (dw)  {
+                                 gint desktop = window_get_desktop(display, dw);
+@@ -276,7 +291,8 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
+                         }
+                 }
+ 
+-                if ((screen = gtk_widget_get_screen(GTK_WIDGET(w)))) {
++#ifdef GDK_IS_X11_DISPLAY
++                if (GDK_IS_X11_DISPLAY(display) && (screen = gtk_widget_get_screen(GTK_WIDGET(w)))) {
+ 
+                         if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_SCREEN, "%i", gdk_screen_get_number(screen))) < 0)
+                                 return ret;
+@@ -285,7 +301,7 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
+                                 if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_MONITOR, "%i", gdk_screen_get_monitor_at_window(screen, dw))) < 0)
+                                         return ret;
+                 }
+-
++#endif
+                 /* FIXME, this might cause a round trip */
+ 
+                 if (dw) {
diff --git a/snapcraft.yaml b/snapcraft.yaml
index 96215d4..50b6b6e 100644
--- a/snapcraft.yaml
+++ b/snapcraft.yaml
@@ -51,7 +51,6 @@ parts:
       - --prefix=/usr
       - -Doptimization=3
       - -Ddebug=true
-    build-environment: *buildenvironment
     override-pull: |
       craftctl default
       patch -p1 < $CRAFT_PROJECT_DIR/patches/libffi-enable-building-on-riscv64.patch
@@ -66,7 +65,6 @@ parts:
       - --prefix=/usr
       - -Doptimization=3
       - -Ddebug=true
-    build-environment: *buildenvironment
     override-build: |
       set -eux
       craftctl default


More information about the Neon-commits mailing list