Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package xfce4-panel for openSUSE:Factory checked in at 2026-03-04 21:11:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xfce4-panel (Old) and /work/SRC/openSUSE:Factory/.xfce4-panel.new.561 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xfce4-panel" Wed Mar 4 21:11:46 2026 rev:91 rq:1336554 version:4.20.7 Changes: -------- --- /work/SRC/openSUSE:Factory/xfce4-panel/xfce4-panel.changes 2026-01-02 14:31:29.983835901 +0100 +++ /work/SRC/openSUSE:Factory/.xfce4-panel.new.561/xfce4-panel.changes 2026-03-04 21:12:08.393588384 +0100 @@ -1,0 +2,21 @@ +Tue Mar 3 14:58:27 UTC 2026 - Manfred Hollstein <[email protected]> + +- Update to version 4.20.7 + * tasklist: Destroy group menu item if window is closed + * panel: Make non-GObject internal plugins resident + * Revert "plugins: Do not use g_intern_static_string" + * panel: Do not fall through when internal plugin failed to load + * wayland: panel: Track set_anchor_default source id + * plugins: Do not use g_intern_static_string + * panel: Fix wrong memory management + * panel: Be sure to set plugin properties when appropriate + * Set application name so internal plugins can't override it + * plugins: Reset workspace group when needed + * wayland: Guard layer-shell related code also at runtime + * wayland: Review screen layout change management + * common: Only remap widget if visible + * wayland: autohide: Fix autohide of floating panel + * wayland: Handle null workspace group list when a group is destroyed + * wayland: panel: Delay hiding panel window when screen layout changes + +------------------------------------------------------------------- Old: ---- xfce4-panel-4.20.6.tar.bz2 New: ---- xfce4-panel-4.20.7.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xfce4-panel.spec ++++++ --- /var/tmp/diff_new_pack.AV8Z5P/_old 2026-03-04 21:12:09.077616642 +0100 +++ /var/tmp/diff_new_pack.AV8Z5P/_new 2026-03-04 21:12:09.081616808 +0100 @@ -1,7 +1,7 @@ # # spec file for package xfce4-panel # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %define libname libxfce4panel-2_0-4 Name: xfce4-panel -Version: 4.20.6 +Version: 4.20.7 Release: 0 Summary: Panel for the Xfce Desktop Environment License: GPL-2.0-or-later AND LGPL-2.1-or-later ++++++ xfce4-panel-4.20.6.tar.bz2 -> xfce4-panel-4.20.7.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/ChangeLog new/xfce4-panel-4.20.7/ChangeLog --- old/xfce4-panel-4.20.6/ChangeLog 2025-12-29 17:33:11.000000000 +0100 +++ new/xfce4-panel-4.20.7/ChangeLog 2026-03-02 10:55:54.000000000 +0100 @@ -1,3 +1,198 @@ +commit f4e21b14a389fa6b7cc4fd756cb92e0a822ed3e5 +Author: Gaël Bonithon <[email protected]> +Date: Mon Mar 2 10:53:21 2026 +0100 + + Updates for release + +commit 796f7cf457f829c6c561b6d7a8d048de7cce11f5 +Author: Gaël Bonithon <[email protected]> +Date: Fri Feb 20 18:10:47 2026 +0100 + + tasklist: Destroy group menu item if window is closed + + Fixes: #971 + (cherry picked from commit 3fd181fd532ed7a4f277595019b11f3837f59fad) + +commit 7cb081d057be97ba103305327bec599ad1a98e99 +Author: Gaël Bonithon <[email protected]> +Date: Wed Jan 28 10:42:11 2026 +0100 + + panel: Make non-GObject internal plugins resident + + This seems to be the proper way to run these plugins in-process. + + (cherry picked from commit f3158265814b196f87fa9981bdc4c74a29478e94) + +commit fe13b29db0fc1c0c9227ffa20f86dc9db2ce9d32 +Author: Gaël Bonithon <[email protected]> +Date: Wed Jan 28 10:10:45 2026 +0100 + + Revert "plugins: Do not use g_intern_static_string" + + This reverts commit e772d4b4989bbab3d1892f0392f84bac712038ae. + + Actually not necessary for these plugins that use + XFCE_PANEL_DEFINE_PLUGIN, and I'm going to make other internal plugins + resident to avoid these static allocation issues. + + (cherry picked from commit 110cb1c654108b98735b48c661387453928a64ed) + +commit abb845b58690ba13fb4168d1fb00e5a050493979 +Author: Gaël Bonithon <[email protected]> +Date: Wed Jan 28 00:00:25 2026 +0100 + + panel: Do not fall through when internal plugin failed to load + + This makes check func in XFCE_PANEL_PLUGIN_REGISTER_WITH_CHECK check + twice, so typically a user dialog show twice, and it also causes + g_type_module_unuse() to be called twice, hence a critical warning. + If a plugin failed to load as internal, it should be set external by + regular means. + + (cherry picked from commit effe93848569df0b8cf0c4b6d3404e7375171970) + +commit c83f7da4c433a539a1a99e684dc81b3c0bea65ed +Author: Gaël Bonithon <[email protected]> +Date: Tue Jan 27 23:18:09 2026 +0100 + + wayland: panel: Track set_anchor_default source id + + This can cause critical warning when deleting a panel. + + Amends: 16f715b3b82cc57dadd54e1eef4894ae298dee13 + (cherry picked from commit 2a3e8db2ae3ca5124bb12514630e5c65947dec17) + +commit 7aba3e7a96b5fd1f07213ae08ad5b6a4f5445666 +Author: Gaël Bonithon <[email protected]> +Date: Tue Jan 27 16:20:57 2026 +0100 + + plugins: Do not use g_intern_static_string + + If plugin is run as internal and is removed, these interned strings + become invalid for the whole panel, while they could be used by other + object signals. + + (cherry picked from commit e772d4b4989bbab3d1892f0392f84bac712038ae) + +commit edd1bf1d5a891ef691f02722e22d444902f2393a +Author: Gaël Bonithon <[email protected]> +Date: Tue Jan 27 09:50:30 2026 +0100 + + panel: Fix wrong memory management + + Fixes: bf69d537db38769977767a7f982fb164c15d11ac + (cherry picked from commit 054b3f174be83ab04cf2be1d6fb2dd79caddab5b) + +commit 2ff59e4d6f17616060aba6dc2bbbde2d9d0e7065 +Author: Gaël Bonithon <[email protected]> +Date: Sun Jan 25 23:52:58 2026 +0100 + + panel: Be sure to set plugin properties when appropriate + + Fixes: #967 + (cherry picked from commit 1485e63e4e229c4a18023b8720d159634f458a7b) + +commit 6f9fecae486ef241d4e50201de4d9ede0f5a2f76 +Author: Gaël Bonithon <[email protected]> +Date: Mon Jan 26 18:15:03 2026 +0100 + + Set application name so internal plugins can't override it + + (cherry picked from commit 92a73afef4aef850bc416d8c575ce93b136c4e97) + +commit 878f1d0dfc514c0dbcca84d1d5ac0f412023a601 +Author: Gaël Bonithon <[email protected]> +Date: Sun Jan 25 19:18:42 2026 +0100 + + plugins: Reset workspace group when needed + + Fixes: 9c829ae45981274c26436268dd373ba97847ef44 + Closes: #966 + (cherry picked from commit 29d1ea798f6e51ea12989b3637d43482543a3aef) + +commit 71e963780b30f95c9d50c9c708e3cca1184a25cd +Author: Gaël Bonithon <[email protected]> +Date: Sun Jan 25 18:30:38 2026 +0100 + + wayland: Guard layer-shell related code also at runtime + + Fixes: 16f715b3b82cc57dadd54e1eef4894ae298dee13 + Closes: #965 + (cherry picked from commit c59391cabd1634718e91363a2215df20735a77eb) + +commit fbf42721ecbc249793d962feb0934e3541928b79 +Author: Gaël Bonithon <[email protected]> +Date: Fri Jan 16 19:17:11 2026 +0100 + + wayland: Review screen layout change management + + This minimizes the use of delayed code when handling + GdkScreen::{monitors-changed,size-changed} signals, in particular by + hiding the panel before calling gtk_layer_set_monitor(), to avoid any + remapping internal to gtk-layer-shell. Only the final gtk_widget_show() + cannot currently (gtk-layer-shell 0.10.0) be performed in this signal + handler without causing an infinite loop or protocol errors. + + Not all compositors necessarily produce the same errors in the same + place in the code, and it also depends on whether or not they add a fake + output when changing tty. For example, the set_anchor_id check is only + necessary on wayfire 0.10.0 (#962), not on labwc 0.9.3 (#940). But + overall, this seems to fix pretty much all the problems encountered so + far. + + Fixes: #962 + Related: #940, https://github.com/wmww/gtk-layer-shell/issues/217 + Amends: d2fb4e093588d3322f1c54ae2fc9e4e6d6471aab + (cherry picked from commit 16f715b3b82cc57dadd54e1eef4894ae298dee13) + +commit e72ab7465e2ced2da297defaa1d5f5a2c79801c9 +Author: Gaël Bonithon <[email protected]> +Date: Wed Jan 21 19:07:16 2026 +0100 + + common: Only remap widget if visible + + (cherry picked from commit b3f557af76e049ce45c07d8e8f125ef11bddc735) + +commit c27ac82a2652d26a18994ffa47e28c9fb9f750a3 +Author: Gaël Bonithon <[email protected]> +Date: Sun Jan 18 23:26:29 2026 +0100 + + wayland: autohide: Fix autohide of floating panel + + This caused protocol error or flickering when panel was between two + monitors, and therefore considered as floating. + + (cherry picked from commit 040ac3b3df687edf6a14643162f7ff04ed5260d2) + +commit cfc964494bdb006db47335e3bf96e2bddf1174ee +Author: Gaël Bonithon <[email protected]> +Date: Thu Jan 8 20:13:26 2026 +0100 + + wayland: Handle null workspace group list when a group is destroyed + + Fixes: 9c829ae45981274c26436268dd373ba97847ef44 + Closes: #963 + (cherry picked from commit 41abfb0b1f9929c905297d05f0ff1a2e3449b59e) + +commit bf348a988ed0c97f4d8332ac9b7fb64430c2ce96 +Author: Gaël Bonithon <[email protected]> +Date: Mon Jul 28 14:15:00 2025 +0200 + + wayland: panel: Delay hiding panel window when screen layout changes + + I strongly suspect the protocol error in #940 is related to internal + tinkering with gtk-layer-shell, unless it's coming from gtk, in any case + there doesn't seem to be any other solution at our level. + + Fixes: #940 + (cherry picked from commit d2fb4e093588d3322f1c54ae2fc9e4e6d6471aab) + +commit b822a23684d925671dc7a33d61bc41a9d85f4faa +Author: Gaël Bonithon <[email protected]> +Date: Mon Dec 29 17:44:49 2025 +0100 + + Back to development + commit 686840c0b5b2d3df4ca0a6dbbf9edbbc3143ddea Author: Gaël Bonithon <[email protected]> Date: Mon Dec 29 17:30:53 2025 +0100 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/NEWS new/xfce4-panel-4.20.7/NEWS --- old/xfce4-panel-4.20.6/NEWS 2025-12-29 17:30:37.000000000 +0100 +++ new/xfce4-panel-4.20.7/NEWS 2026-03-02 10:53:15.000000000 +0100 @@ -1,3 +1,22 @@ +4.20.7 (2026-03-02) +====== +- tasklist: Destroy group menu item if window is closed +- panel: Make non-GObject internal plugins resident +- Revert "plugins: Do not use g_intern_static_string" +- panel: Do not fall through when internal plugin failed to load +- wayland: panel: Track set_anchor_default source id +- plugins: Do not use g_intern_static_string +- panel: Fix wrong memory management +- panel: Be sure to set plugin properties when appropriate +- Set application name so internal plugins can't override it +- plugins: Reset workspace group when needed +- wayland: Guard layer-shell related code also at runtime +- wayland: Review screen layout change management +- common: Only remap widget if visible +- wayland: autohide: Fix autohide of floating panel +- wayland: Handle null workspace group list when a group is destroyed +- wayland: panel: Delay hiding panel window when screen layout changes + 4.20.6 (2025-12-29) ====== - arrow-fix: Restoring the button size after the arrow disappears diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/common/panel-utils.c new/xfce4-panel-4.20.7/common/panel-utils.c --- old/xfce4-panel-4.20.6/common/panel-utils.c 2025-12-29 17:25:53.000000000 +0100 +++ new/xfce4-panel-4.20.7/common/panel-utils.c 2026-03-02 10:43:18.000000000 +0100 @@ -257,8 +257,11 @@ void panel_utils_widget_remap (GtkWidget *widget) { - gtk_widget_hide (GTK_WIDGET (widget)); - gtk_widget_show (GTK_WIDGET (widget)); + if (gtk_widget_get_visible (widget)) + { + gtk_widget_hide (GTK_WIDGET (widget)); + gtk_widget_show (GTK_WIDGET (widget)); + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/configure new/xfce4-panel-4.20.7/configure --- old/xfce4-panel-4.20.6/configure 2025-12-29 17:32:14.000000000 +0100 +++ new/xfce4-panel-4.20.7/configure 2026-03-02 10:54:47.000000000 +0100 @@ -1,11 +1,11 @@ #! /bin/sh # From configure.ac . # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for xfce4-panel 4.20.6. +# Generated by GNU Autoconf 2.72 for xfce4-panel 4.20.7. # # Report bugs to <https://gitlab.xfce.org/xfce/xfce4-panel/-/issues>. # -# Copyright (c) 2004-2025 The Xfce development team. All rights reserved. +# Copyright (c) 2004-2026 The Xfce development team. All rights reserved. # Written for Xfce by Jasper Huijsmans <[email protected]> and Nick Schermer <[email protected]>. # # @@ -618,8 +618,8 @@ # Identity of this package. PACKAGE_NAME='xfce4-panel' PACKAGE_TARNAME='xfce4-panel' -PACKAGE_VERSION='4.20.6' -PACKAGE_STRING='xfce4-panel 4.20.6' +PACKAGE_VERSION='4.20.7' +PACKAGE_STRING='xfce4-panel 4.20.7' PACKAGE_BUGREPORT='https://gitlab.xfce.org/xfce/xfce4-panel/-/issues' PACKAGE_URL='' @@ -1558,7 +1558,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures xfce4-panel 4.20.6 to adapt to many kinds of systems. +'configure' configures xfce4-panel 4.20.7 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1629,7 +1629,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of xfce4-panel 4.20.6:";; + short | recursive ) echo "Configuration of xfce4-panel 4.20.7:";; esac cat <<\_ACEOF @@ -1797,14 +1797,14 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -xfce4-panel configure 4.20.6 +xfce4-panel configure 4.20.7 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. -Copyright (c) 2004-2025 The Xfce development team. All rights reserved. +Copyright (c) 2004-2026 The Xfce development team. All rights reserved. Written for Xfce by Jasper Huijsmans <[email protected]> and Nick Schermer <[email protected]>. _ACEOF exit @@ -2107,7 +2107,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by xfce4-panel $as_me 4.20.6, which was +It was created by xfce4-panel $as_me 4.20.7, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -2888,7 +2888,7 @@ printf "%s\n" "#define VERSION_FULL PACKAGE_VERSION" >>confdefs.h -COPYRIGHT_YEAR=2025 +COPYRIGHT_YEAR=2026 printf "%s\n" "#define COPYRIGHT_YEAR \"$COPYRIGHT_YEAR\"" >>confdefs.h @@ -3600,7 +3600,7 @@ # Define the identity of the package. PACKAGE='xfce4-panel' - VERSION='4.20.6' + VERSION='4.20.7' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -15391,11 +15391,11 @@ LIBXFCE4PANEL_VERINFO=4:0:0 -LIBXFCE4PANEL_VERSION=4.20.6 +LIBXFCE4PANEL_VERSION=4.20.7 LIBXFCE4PANEL_VERSION_API=2.0 LIBXFCE4PANEL_VERSION_MAJOR=4 LIBXFCE4PANEL_VERSION_MINOR=20 -LIBXFCE4PANEL_VERSION_MICRO=6 +LIBXFCE4PANEL_VERSION_MICRO=7 printf "%s\n" "#define LIBXFCE4PANEL_VERSION_API \"2.0\"" >>confdefs.h @@ -27419,7 +27419,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by xfce4-panel $as_me 4.20.6, which was +This file was extended by xfce4-panel $as_me 4.20.7, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -27487,7 +27487,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -xfce4-panel config.status 4.20.6 +xfce4-panel config.status 4.20.7 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/configure.ac new/xfce4-panel-4.20.7/configure.ac --- old/xfce4-panel-4.20.6/configure.ac 2025-12-29 17:30:30.000000000 +0100 +++ new/xfce4-panel-4.20.7/configure.ac 2026-03-02 10:52:29.000000000 +0100 @@ -11,8 +11,8 @@ m4_define([libxfce4panel_verinfo], [4:0:0]) dnl current:revision:age m4_define([libxfce4panel_version_api], [2.0]) m4_define([xfce4_panel_config_version], [2]) -m4_define([copyright_year], [2025]) -XDT_VERSION_INIT([4.20.6]) +m4_define([copyright_year], [2026]) +XDT_VERSION_INIT([4.20.7]) dnl minimum required versions m4_define([glib_minimum_version], [2.72.0]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/docs/reference/html/index.html new/xfce4-panel-4.20.7/docs/reference/html/index.html --- old/xfce4-panel-4.20.6/docs/reference/html/index.html 2025-12-29 17:35:13.000000000 +0100 +++ new/xfce4-panel-4.20.7/docs/reference/html/index.html 2026-03-02 10:57:45.000000000 +0100 @@ -15,7 +15,7 @@ <div> <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">xfce4-panel Reference Manual</p></th></tr></table></div> <div><p class="releaseinfo"> - for xfce4-panel 4.20.6. + for xfce4-panel 4.20.7. The latest version of this documentation can be found on-line at <a class="ulink" href="http://[SERVER]/xfce4-panel/index.html" target="_top">http://[SERVER]/xfce4-panel/</a>. </p></div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/docs/reference/html/libxfce4panel-Version-Information.html new/xfce4-panel-4.20.7/docs/reference/html/libxfce4panel-Version-Information.html --- old/xfce4-panel-4.20.6/docs/reference/html/libxfce4panel-Version-Information.html 2025-12-29 17:35:13.000000000 +0100 +++ new/xfce4-panel-4.20.7/docs/reference/html/libxfce4panel-Version-Information.html 2026-03-02 10:57:45.000000000 +0100 @@ -262,7 +262,7 @@ <hr> <div class="refsect2"> <a name="LIBXFCE4PANEL-VERSION:CAPS"></a><h3>LIBXFCE4PANEL_VERSION</h3> -<pre class="programlisting">#define LIBXFCE4PANEL_VERSION ("4.20.6") +<pre class="programlisting">#define LIBXFCE4PANEL_VERSION ("4.20.7") </pre> <p>String with the full version of the panel.</p> <p class="since">Since: <a class="link" href="api-index-4-8.html#api-index-4.8">4.8</a></p> @@ -292,7 +292,7 @@ <hr> <div class="refsect2"> <a name="LIBXFCE4PANEL-MICRO-VERSION:CAPS"></a><h3>LIBXFCE4PANEL_MICRO_VERSION</h3> -<pre class="programlisting">#define LIBXFCE4PANEL_MICRO_VERSION (6) +<pre class="programlisting">#define LIBXFCE4PANEL_MICRO_VERSION (7) </pre> <p>The micro version number of the libxfce4panel library. Like libxfce4panel_micro_version, but from the headers used at diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/libxfce4panel/libxfce4panel-config.h new/xfce4-panel-4.20.7/libxfce4panel/libxfce4panel-config.h --- old/xfce4-panel-4.20.6/libxfce4panel/libxfce4panel-config.h 2025-12-29 17:32:56.000000000 +0100 +++ new/xfce4-panel-4.20.7/libxfce4panel/libxfce4panel-config.h 2026-03-02 10:55:45.000000000 +0100 @@ -34,7 +34,7 @@ * * Since: 4.8 **/ -#define LIBXFCE4PANEL_VERSION ("4.20.6") +#define LIBXFCE4PANEL_VERSION ("4.20.7") /** * LIBXFCE4PANEL_MAJOR_VERSION: @@ -70,7 +70,7 @@ * * Since: 4.8 **/ -#define LIBXFCE4PANEL_MICRO_VERSION (6) +#define LIBXFCE4PANEL_MICRO_VERSION (7) /** * LIBXFCE4PANEL_CHECK_VERSION: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/meson.build new/xfce4-panel-4.20.7/meson.build --- old/xfce4-panel-4.20.6/meson.build 2025-12-29 17:30:33.000000000 +0100 +++ new/xfce4-panel-4.20.7/meson.build 2026-03-02 10:52:43.000000000 +0100 @@ -1,7 +1,7 @@ project( 'xfce4-panel', 'c', -version : '4.20.6', +version : '4.20.7', license : 'GPL-2.0-or-later', meson_version : '>= 0.56.0', default_options : ['c_std=gnu11', 'buildtype=debugoptimized', 'warning_level=2'] @@ -9,7 +9,7 @@ project_namespace = 'xfce' pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() -copyright_year = '2025' +copyright_year = '2026' libxfce4panel_version_api = '2.0' xfce4_panel_config_version = '2' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/panel/panel-application.c new/xfce4-panel-4.20.7/panel/panel-application.c --- old/xfce4-panel-4.20.6/panel/panel-application.c 2025-12-29 17:25:54.000000000 +0100 +++ new/xfce4-panel-4.20.7/panel/panel-application.c 2026-03-02 10:43:18.000000000 +0100 @@ -202,6 +202,9 @@ application->drop_occurred = FALSE; application->autohide_block = 0; + /* set application name so internal plugins can't override it */ + g_set_application_name (PACKAGE_NAME); + /* get the xfconf channel (singleton) */ application->xfconf = xfconf_channel_get (XFCE_PANEL_CHANNEL_NAME); @@ -867,7 +870,8 @@ GTK_WIDGET (provider), position); /* send all the needed info about the panel to the plugin */ - panel_window_set_provider_info (window, provider, FALSE); + if (gtk_widget_get_realized (GTK_WIDGET (window))) + panel_window_set_provider_info (window, provider, FALSE); /* show the plugin */ gtk_widget_show (provider); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/panel/panel-gdbus-exported-service.c new/xfce4-panel-4.20.7/panel/panel-gdbus-exported-service.c --- old/xfce4-panel-4.20.6/panel/panel-gdbus-exported-service.c 2025-12-29 17:34:39.000000000 +0100 +++ new/xfce4-panel-4.20.7/panel/panel-gdbus-exported-service.c 2026-03-02 10:56:57.000000000 +0100 @@ -1470,7 +1470,7 @@ gboolean xfce_panel_exported_service_call_plugin_event_finish ( XfcePanelExportedService *proxy, - gboolean *out_succeed, + gboolean* out_succeed, GAsyncResult *res, GError **error) { @@ -1508,7 +1508,7 @@ const gchar *arg_plugin_name, const gchar *arg_name, GVariant *arg_value, - gboolean *out_succeed, + gboolean* out_succeed, GCancellable *cancellable, GError **error) { @@ -2317,8 +2317,14 @@ { XfcePanelExportedServiceSkeleton *skeleton = XFCE_PANEL_EXPORTED_SERVICE_SKELETON (object); g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + /* coverity[missing_lock : SUPPRESS] */ + g_clear_pointer (&skeleton->priv->changed_properties_idle_source, g_source_destroy); +#else if (skeleton->priv->changed_properties_idle_source != NULL) g_source_destroy (skeleton->priv->changed_properties_idle_source); +skeleton->priv->changed_properties_idle_source = NULL; +#endif g_main_context_unref (skeleton->priv->context); g_mutex_clear (&skeleton->priv->lock); G_OBJECT_CLASS (xfce_panel_exported_service_skeleton_parent_class)->finalize (object); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/panel/panel-gdbus-exported-service.h new/xfce4-panel-4.20.7/panel/panel-gdbus-exported-service.h --- old/xfce4-panel-4.20.6/panel/panel-gdbus-exported-service.h 2025-12-29 17:34:39.000000000 +0100 +++ new/xfce4-panel-4.20.7/panel/panel-gdbus-exported-service.h 2026-03-02 10:56:57.000000000 +0100 @@ -185,7 +185,7 @@ gboolean xfce_panel_exported_service_call_plugin_event_finish ( XfcePanelExportedService *proxy, - gboolean *out_succeed, + gboolean* out_succeed, GAsyncResult *res, GError **error); @@ -194,7 +194,7 @@ const gchar *arg_plugin_name, const gchar *arg_name, GVariant *arg_value, - gboolean *out_succeed, + gboolean* out_succeed, GCancellable *cancellable, GError **error); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/panel/panel-module-factory.c new/xfce4-panel-4.20.7/panel/panel-module-factory.c --- old/xfce4-panel-4.20.6/panel/panel-module-factory.c 2025-12-29 17:25:54.000000000 +0100 +++ new/xfce4-panel-4.20.7/panel/panel-module-factory.c 2026-03-02 10:43:18.000000000 +0100 @@ -215,7 +215,7 @@ { const gchar *const *sys_datadirs = g_get_system_data_dirs (); const gchar *user_datadir = g_get_user_data_dir (); - GHashTable *unique = g_hash_table_new (g_str_hash, g_str_equal); + GHashTable *unique = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); for (const gchar *const *p = sys_datadirs; *p != NULL; p++) { @@ -234,8 +234,6 @@ build_dirs_added = TRUE; g_free (prefix); } - - g_free (path); } g_hash_table_destroy (unique); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/panel/panel-module.c new/xfce4-panel-4.20.7/panel/panel-module.c --- old/xfce4-panel-4.20.6/panel/panel-module.c 2025-12-29 17:25:54.000000000 +0100 +++ new/xfce4-panel-4.20.7/panel/panel-module.c 2026-03-02 10:43:18.000000000 +0100 @@ -221,15 +221,24 @@ if (make_resident) g_module_make_resident (module->library); } - else if (!g_module_symbol (module->library, "xfce_panel_module_construct", - (gpointer) &module->construct_func)) + else { - g_critical ("Module \"%s\" lacks a plugin register function.", - module->filename); - - panel_module_unload (type_module); - - return FALSE; + if (g_module_symbol (module->library, "xfce_panel_module_construct", + (gpointer) &module->construct_func)) + { + /* avoid static memory allocation issues when removing the plugin, with e.g + * g_intern_static_string() or G_PARAM_STATIC_STRINGS in signals/properties + * declarations, and keep plugin types in memory so plugin can be re-added + * after being removed */ + if (module->mode == PANEL_MODULE_RUN_MODE_INTERNAL) + g_module_make_resident (module->library); + } + else + { + g_critical ("Module \"%s\" lacks a plugin register function.", module->filename); + panel_module_unload (type_module); + return FALSE; + } } return TRUE; @@ -447,16 +456,10 @@ debug_type = "construct-func"; } - if (G_LIKELY (plugin != NULL)) - break; - else + if (G_UNLIKELY (plugin == NULL)) g_type_module_unuse (G_TYPE_MODULE (module)); } - - /* fall-through (make wrapper plugin), probably a plugin with - * preinit_func which is not supported for internal plugins - * note: next comment tells GCC7 to ignore the fallthrough */ - /* fall through */ + break; case PANEL_MODULE_RUN_MODE_EXTERNAL: plugin = panel_plugin_external_wrapper_new (module, unique_id, arguments); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/panel/panel-plugin-external-wrapper-exported.c new/xfce4-panel-4.20.7/panel/panel-plugin-external-wrapper-exported.c --- old/xfce4-panel-4.20.6/panel/panel-plugin-external-wrapper-exported.c 2025-12-29 17:34:39.000000000 +0100 +++ new/xfce4-panel-4.20.7/panel/panel-plugin-external-wrapper-exported.c 2026-03-02 10:56:58.000000000 +0100 @@ -1660,8 +1660,14 @@ { XfcePanelPluginWrapperExportedSkeleton *skeleton = XFCE_PANEL_PLUGIN_WRAPPER_EXPORTED_SKELETON (object); g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + /* coverity[missing_lock : SUPPRESS] */ + g_clear_pointer (&skeleton->priv->changed_properties_idle_source, g_source_destroy); +#else if (skeleton->priv->changed_properties_idle_source != NULL) g_source_destroy (skeleton->priv->changed_properties_idle_source); +skeleton->priv->changed_properties_idle_source = NULL; +#endif g_main_context_unref (skeleton->priv->context); g_mutex_clear (&skeleton->priv->lock); G_OBJECT_CLASS (xfce_panel_plugin_wrapper_exported_skeleton_parent_class)->finalize (object); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/panel/panel-window.c new/xfce4-panel-4.20.7/panel/panel-window.c --- old/xfce4-panel-4.20.6/panel/panel-window.c 2025-12-29 17:25:54.000000000 +0100 +++ new/xfce4-panel-4.20.7/panel/panel-window.c 2026-03-02 10:43:18.000000000 +0100 @@ -389,6 +389,12 @@ gboolean floating; guint span_monitors : 1; gchar *output_name; +#ifdef HAVE_GTK_LAYER_SHELL + guint show_id; + guint set_anchor_default_id; + gboolean in_screen_layout_changed; + gulong set_anchor_id; +#endif /* allocated position of the panel */ GdkRectangle alloc; @@ -1036,6 +1042,13 @@ if (G_UNLIKELY (window->opacity_timeout_id != 0)) g_source_remove (window->opacity_timeout_id); +#ifdef HAVE_GTK_LAYER_SHELL + if (G_UNLIKELY (window->show_id != 0)) + g_source_remove (window->show_id); + if (window->set_anchor_default_id != 0) + g_source_remove (window->set_anchor_default_id); +#endif + /* destroy the autohide window */ if (window->autohide_window != NULL) gtk_widget_destroy (window->autohide_window); @@ -1422,27 +1435,38 @@ static void set_anchor (PanelWindow *window) { - g_signal_handlers_disconnect_by_func (window, set_anchor, NULL); + g_signal_handler_disconnect (G_OBJECT (window), window->set_anchor_id); + window->set_anchor_id = 0; panel_window_layer_set_anchor (window); } static gboolean -set_anchor_default (gpointer window) +set_anchor_default (gpointer data) { + PanelWindow *window = data; + /* * Disable left/right or top/bottom anchor pairs during allocation, so that the panel * is not stretched between the two anchors, preventing it from shrinking. Quite an * ugly hack but it works until it gets better. This must be done around a full allocation, * however, not in the middle, otherwise protocol errors may occur (allocation limits are * not the same depending on whether the layer-shell surface has three anchors or only two). + * It may also be necessary to disable it if a _screen_layout_change() occurs in the + * meantime and the panel needs to be remapped, in order to avoid a protocol error or an + * infinite loop in gtk-layer-shell. */ - gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_TOP, TRUE); - gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_BOTTOM, FALSE); - gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_LEFT, TRUE); - gtk_layer_set_anchor (window, GTK_LAYER_SHELL_EDGE_RIGHT, FALSE); - g_signal_connect (window, "size-allocate", G_CALLBACK (set_anchor), NULL); + if (window->set_anchor_id == 0) + { + gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_TOP, TRUE); + gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_BOTTOM, FALSE); + gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_LEFT, TRUE); + gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_RIGHT, FALSE); + window->set_anchor_id = g_signal_connect (window, "size-allocate", G_CALLBACK (set_anchor), NULL); + } + + window->set_anchor_default_id = 0; return FALSE; } #endif @@ -1499,7 +1523,9 @@ && window->snap_position != SNAP_POSITION_NONE && n_width != window->alloc.width) { - g_idle_add (set_anchor_default, window); + if (window->set_anchor_default_id != 0) + g_source_remove (window->set_anchor_default_id); + window->set_anchor_default_id = g_idle_add (set_anchor_default, window); } #endif } @@ -1563,7 +1589,9 @@ && window->snap_position != SNAP_POSITION_NONE && n_height != window->alloc.height) { - g_idle_add (set_anchor_default, window); + if (window->set_anchor_default_id != 0) + g_source_remove (window->set_anchor_default_id); + window->set_anchor_default_id = g_idle_add (set_anchor_default, window); } #endif } @@ -1616,8 +1644,10 @@ && (window->autohide_state == AUTOHIDE_HIDDEN || window->autohide_state == AUTOHIDE_POPUP))) { + gboolean autohide_running = window->autohide_timeout_id != 0 || window->popdown_progress != -G_MAXINT; + /* autohide timeout is already running, so let's wait with hiding the panel */ - if ((window->autohide_timeout_id != 0 || window->popdown_progress != -G_MAXINT) + if (autohide_running /* may be false on wayland where gtk_widget_queue_resize() does not * always trigger size_allocate() */ && gtk_widget_get_visible (window->autohide_window)) @@ -1687,8 +1717,8 @@ window->floating = TRUE; /* make the panel invisible without animation */ - if (window->floating - || window->popdown_speed == 0) + if (!autohide_running + && (window->floating || window->popdown_speed == 0)) { /* cancel any pending animations */ if (window->autohide_ease_out_id != 0) @@ -2057,6 +2087,21 @@ +static gboolean +set_all_provider_info (gpointer data) +{ + PanelWindow *window = data; + GtkWidget *itembar = gtk_bin_get_child (GTK_BIN (window)); + GList *plugins = gtk_container_get_children (GTK_CONTAINER (itembar)); + for (GList *lp = plugins; lp != NULL; lp = lp->next) + panel_window_set_provider_info (window, lp->data, FALSE); + + g_list_free (plugins); + return FALSE; +} + + + static void panel_window_realize (GtkWidget *widget) { @@ -2075,6 +2120,9 @@ /* redirect some corner cases (see issue #227) */ gdk_window_add_filter (gdkwindow, panel_window_filter, window); + + /* be sure to set all provider infos if the panel was hidden at startup */ + g_idle_add (set_all_provider_info, window); } @@ -2618,6 +2666,42 @@ +#ifdef HAVE_GTK_LAYER_SHELL +static gboolean +panel_window_show (gpointer data) +{ + PanelWindow *window = data; + + /* showing the panel here should not trigger _screen_layout_changed(), but it does when + * things go wrong, so let's at least minimize the damage also in this case */ + window->in_screen_layout_changed = TRUE; + + /* + * The panel window may be hidden if the output to which it is assigned is disconnected, + * and must be shown when that output is reconnected. This is always true on X11, but on + * Wayland it should only be done if the window has not been autohidden, or if it's shown + * for the first time. + */ + if (!gtk_widget_get_visible (GTK_WIDGET (window)) + && (window->autohide_behavior == AUTOHIDE_BEHAVIOR_NEVER + || window->autohide_state == AUTOHIDE_VISIBLE + || !gtk_widget_get_realized (GTK_WIDGET (window)))) + { + /* see comment in set_anchor_default() */ + if (window->set_anchor_id != 0) + set_anchor (window); + + gtk_widget_show (GTK_WIDGET (window)); + } + + window->in_screen_layout_changed = FALSE; + window->show_id = 0; + return FALSE; +} +#endif + + + static void panel_window_screen_layout_changed (GdkScreen *screen, PanelWindow *window) @@ -2637,10 +2721,40 @@ if (window->base_x == -1 && window->base_y == -1) return; +#ifdef HAVE_GTK_LAYER_SHELL + /* avoid any recursion when remapping the panel, here or in gtk-layer-shell */ + if (gtk_layer_is_supported ()) + { + if (window->in_screen_layout_changed) + return; + window->in_screen_layout_changed = TRUE; + + if (G_UNLIKELY (window->show_id != 0)) + { + g_source_remove (window->show_id); + window->show_id = 0; + } + } +#endif + /* n_monitors == 0 should be a temporary state, it can happen on Wayland */ n_monitors = gdk_display_get_n_monitors (window->display); if (n_monitors == 0) - return; + { + panel_debug (PANEL_DEBUG_POSITIONING, "%p: no monitor found, hiding window", window); + + /* hide the panel first, so it is not remapped by gtk-layer-shell */ + gtk_widget_hide (GTK_WIDGET (window)); + +#ifdef HAVE_GTK_LAYER_SHELL + if (gtk_layer_is_supported ()) + { + gtk_layer_set_monitor (GTK_WINDOW (window), NULL); + window->in_screen_layout_changed = FALSE; + } +#endif + return; + } /* print the display layout when debugging is enabled */ if (G_UNLIKELY (panel_debug_has_domain (PANEL_DEBUG_YES))) @@ -2683,8 +2797,6 @@ a.width -= a.x; a.height -= a.y; - - panel_return_if_fail (a.width > 0 && a.height > 0); } else { @@ -2695,7 +2807,6 @@ monitor = gdk_display_get_monitor_at_point (window->display, window->base_x, window->base_y); gdk_monitor_get_geometry (monitor, &a); - panel_return_if_fail (a.width > 0 && a.height > 0); } else if (g_strcmp0 (window->output_name, "Primary") == 0) { @@ -2705,7 +2816,6 @@ monitor = gdk_display_get_monitor (window->display, 0); gdk_monitor_get_geometry (monitor, &a); - panel_return_if_fail (a.width > 0 && a.height > 0); } else { @@ -2751,31 +2861,28 @@ } } } - - if (G_UNLIKELY (a.height == 0 && a.width == 0)) - { - panel_debug (PANEL_DEBUG_POSITIONING, - "%p: monitor %s not found, hiding window", - window, window->output_name); - - /* hide the panel if the monitor was not found */ - if (gtk_widget_get_visible (GTK_WIDGET (window))) - gtk_widget_hide (GTK_WIDGET (window)); - return; - } } } -#ifdef HAVE_GTK_LAYER_SHELL - /* the compositor does not manage to display the panel on the right monitor - * by itself in general */ - if (gtk_layer_is_supported () && !window->span_monitors) + /* monitor was not found or is an unusable fake monitor on wayland */ + if (G_UNLIKELY (a.height == 0 || a.width == 0)) { - gtk_layer_set_monitor (GTK_WINDOW (window), monitor); - if (window->autohide_behavior != AUTOHIDE_BEHAVIOR_NEVER) - gtk_layer_set_monitor (GTK_WINDOW (window->autohide_window), monitor); - } + panel_debug (PANEL_DEBUG_POSITIONING, + "%p: monitor %s not found, hiding window", + window, window->output_name); + + /* hide the panel first, so it is not remapped by gtk-layer-shell */ + gtk_widget_hide (GTK_WIDGET (window)); + +#ifdef HAVE_GTK_LAYER_SHELL + if (gtk_layer_is_supported ()) + { + gtk_layer_set_monitor (GTK_WINDOW (window), NULL); + window->in_screen_layout_changed = FALSE; + } #endif + return; + } /* set the new working area of the panel */ window->area = a; @@ -2795,18 +2902,38 @@ if (force_struts_update) panel_window_screen_struts_set (window); - /* - * The panel window may be hidden if the output to which it is assigned is disconnected, - * and must be shown when that output is reconnected. This is always true on X11, but on - * Wayland it should only be done if the window has not been autohidden, or if it's shown - * for the first time. - */ - if (!gtk_widget_get_visible (GTK_WIDGET (window)) - && (!gtk_layer_is_supported () - || window->autohide_behavior == AUTOHIDE_BEHAVIOR_NEVER - || window->autohide_state == AUTOHIDE_VISIBLE - || !gtk_widget_get_realized (GTK_WIDGET (window)))) - gtk_widget_show (GTK_WIDGET (window)); +#ifdef HAVE_GTK_LAYER_SHELL + if (gtk_layer_is_supported ()) + { + /* we need to set this properly so it is consistent with e.g. "length-max" */ + if (monitor != gtk_layer_get_monitor (GTK_WINDOW (window))) + { + /* hide the panel first, so it is not remapped by gtk-layer-shell */ + gtk_widget_hide (GTK_WIDGET (window)); + + gtk_layer_set_monitor (GTK_WINDOW (window), monitor); + if (window->autohide_behavior != AUTOHIDE_BEHAVIOR_NEVER) + gtk_layer_set_monitor (GTK_WINDOW (window->autohide_window), monitor); + } + + /* + * We have to delay this to avoid gtk-layer-shell infinite loop and/or protocol errors + * https://gitlab.xfce.org/xfce/xfce4-panel/-/issues/940 + * https://gitlab.xfce.org/xfce/xfce4-panel/-/issues/962 + * https://github.com/wmww/gtk-layer-shell/issues/217 + */ + window->show_id = g_idle_add (panel_window_show, window); + + window->in_screen_layout_changed = FALSE; + } + else +#endif + /* + * The panel window may be hidden if the output to which it is assigned is disconnected, + * and must be shown when that output is reconnected. This is always true on X11. + */ + if (!gtk_widget_get_visible (GTK_WIDGET (window))) + gtk_widget_show (GTK_WIDGET (window)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/plugins/pager/pager-buttons.c new/xfce4-panel-4.20.7/plugins/pager/pager-buttons.c --- old/xfce4-panel-4.20.6/plugins/pager/pager-buttons.c 2025-12-29 17:25:54.000000000 +0100 +++ new/xfce4-panel-4.20.7/plugins/pager/pager-buttons.c 2026-03-02 10:43:18.000000000 +0100 @@ -56,6 +56,9 @@ XfwWorkspace *destroyed_workspace, PagerButtons *pager); static void +pager_buttons_screen_monitors_changed (XfwWorkspaceGroup *group, + PagerButtons *pager); +static void pager_buttons_screen_viewports_changed (XfwWorkspaceGroup *group, PagerButtons *pager); static void @@ -206,6 +209,8 @@ G_CALLBACK (pager_buttons_screen_workspace_created), pager); g_signal_connect (group, "workspace-removed", G_CALLBACK (pager_buttons_screen_workspace_destroyed), pager); + g_signal_connect (group, "monitors-changed", + G_CALLBACK (pager_buttons_screen_monitors_changed), pager); g_signal_connect (group, "viewports-changed", G_CALLBACK (pager_buttons_screen_viewports_changed), pager); } @@ -220,6 +225,7 @@ g_signal_handlers_disconnect_by_func (group, pager_buttons_screen_workspace_changed, pager); g_signal_handlers_disconnect_by_func (group, pager_buttons_screen_workspace_created, pager); g_signal_handlers_disconnect_by_func (group, pager_buttons_screen_workspace_destroyed, pager); + g_signal_handlers_disconnect_by_func (group, pager_buttons_screen_monitors_changed, pager); g_signal_handlers_disconnect_by_func (group, pager_buttons_screen_viewports_changed, pager); } @@ -586,6 +592,18 @@ panel_return_if_fail (PAGER_IS_BUTTONS (pager)); pager_buttons_queue_rebuild (pager); +} + + + +static void +pager_buttons_screen_monitors_changed (XfwWorkspaceGroup *group, + PagerButtons *pager) +{ + panel_return_if_fail (XFW_IS_WORKSPACE_GROUP (group)); + panel_return_if_fail (PAGER_IS_BUTTONS (pager)); + + pager_buttons_queue_rebuild (pager); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/plugins/systray/sn-watcher.c new/xfce4-panel-4.20.7/plugins/systray/sn-watcher.c --- old/xfce4-panel-4.20.6/plugins/systray/sn-watcher.c 2025-12-29 17:34:45.000000000 +0100 +++ new/xfce4-panel-4.20.7/plugins/systray/sn-watcher.c 2026-03-02 10:57:05.000000000 +0100 @@ -1899,8 +1899,14 @@ g_value_unset (&skeleton->priv->properties[n]); g_free (skeleton->priv->properties); g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + /* coverity[missing_lock : SUPPRESS] */ + g_clear_pointer (&skeleton->priv->changed_properties_idle_source, g_source_destroy); +#else if (skeleton->priv->changed_properties_idle_source != NULL) g_source_destroy (skeleton->priv->changed_properties_idle_source); +skeleton->priv->changed_properties_idle_source = NULL; +#endif g_main_context_unref (skeleton->priv->context); g_mutex_clear (&skeleton->priv->lock); G_OBJECT_CLASS (sn_watcher_skeleton_parent_class)->finalize (object); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/plugins/tasklist/tasklist-widget.c new/xfce4-panel-4.20.7/plugins/tasklist/tasklist-widget.c --- old/xfce4-panel-4.20.6/plugins/tasklist/tasklist-widget.c 2025-12-29 17:25:55.000000000 +0100 +++ new/xfce4-panel-4.20.7/plugins/tasklist/tasklist-widget.c 2026-03-02 10:43:18.000000000 +0100 @@ -1215,7 +1215,10 @@ /* swap integers with vertical orientation */ if (!xfce_tasklist_horizontal (tasklist)) TRANSPOSE_AREA (area); - panel_return_if_fail (area.height == tasklist->size); + + /* panel size has not been sent yet */ + if (area.height != tasklist->size) + return; /* TODO if we compare the allocation with the requisition we can * do a fast path to the child allocation, i think */ @@ -1663,11 +1666,11 @@ static void -workspace_group_destroyed (XfwWorkspaceManager *manager, - XfwWorkspaceGroup *group, - XfceTasklist *tasklist) +workspace_group_created (XfwWorkspaceManager *manager, + XfwWorkspaceGroup *group, + XfceTasklist *tasklist) { - if (group == tasklist->workspace_group) + if (tasklist->workspace_group == NULL) { tasklist->workspace_group = xfw_workspace_manager_list_workspace_groups (manager)->data; g_signal_connect (G_OBJECT (tasklist->workspace_group), "active-workspace-changed", @@ -1680,6 +1683,31 @@ static void +workspace_group_destroyed (XfwWorkspaceManager *manager, + XfwWorkspaceGroup *group, + XfceTasklist *tasklist) +{ + if (group == tasklist->workspace_group) + { + GList *groups = xfw_workspace_manager_list_workspace_groups (manager); + if (groups != NULL) + { + tasklist->workspace_group = groups->data; + g_signal_connect (G_OBJECT (tasklist->workspace_group), "active-workspace-changed", + G_CALLBACK (xfce_tasklist_active_workspace_changed), tasklist); + g_signal_connect (G_OBJECT (tasklist->workspace_group), "viewports-changed", + G_CALLBACK (xfce_tasklist_viewports_changed), tasklist); + } + else + { + tasklist->workspace_group = NULL; + } + } +} + + + +static void xfce_tasklist_connect_screen (XfceTasklist *tasklist) { GList *windows, *li; @@ -1701,6 +1729,7 @@ /* window button visibility based on window<->workspace association only works on X11, * where there is only one workspace group, but it can be destroyed on wayland, so let's * manage this in a minimalist way */ + g_signal_connect_object (manager, "workspace-group-created", G_CALLBACK (workspace_group_created), tasklist, 0); g_signal_connect_object (manager, "workspace-group-destroyed", G_CALLBACK (workspace_group_destroyed), tasklist, 0); workspace_group_destroyed (manager, NULL, tasklist); @@ -1788,6 +1817,7 @@ panel_assert (tasklist->skipped_windows == NULL); g_clear_object (&tasklist->screen); + tasklist->workspace_group = NULL; tasklist->display = NULL; } @@ -3477,6 +3507,8 @@ g_signal_connect (G_OBJECT (mi), "button-release-event", G_CALLBACK (xfce_tasklist_button_button_release_event), child); + g_signal_connect_object (child->window, "closed", G_CALLBACK (gtk_widget_destroy), mi, G_CONNECT_SWAPPED); + /* TODO item dnd */ return mi; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/plugins/windowmenu/windowmenu.c new/xfce4-panel-4.20.7/plugins/windowmenu/windowmenu.c --- old/xfce4-panel-4.20.6/plugins/windowmenu/windowmenu.c 2025-12-29 17:25:55.000000000 +0100 +++ new/xfce4-panel-4.20.7/plugins/windowmenu/windowmenu.c 2026-03-02 10:43:18.000000000 +0100 @@ -407,12 +407,26 @@ static void +workspace_group_created (XfwWorkspaceManager *manager, + XfwWorkspaceGroup *group, + WindowMenuPlugin *plugin) +{ + if (plugin->workspace_group == NULL) + plugin->workspace_group = xfw_workspace_manager_list_workspace_groups (manager)->data; +} + + + +static void workspace_group_destroyed (XfwWorkspaceManager *manager, XfwWorkspaceGroup *group, WindowMenuPlugin *plugin) { if (group == plugin->workspace_group) - plugin->workspace_group = xfw_workspace_manager_list_workspace_groups (manager)->data; + { + GList *groups = xfw_workspace_manager_list_workspace_groups (manager); + plugin->workspace_group = groups == NULL ? NULL : groups->data; + } } @@ -445,6 +459,7 @@ g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen), window_menu_plugin_active_window_changed, plugin); g_object_unref (plugin->screen); + plugin->workspace_group = NULL; } /* set the new screen */ @@ -453,6 +468,7 @@ /* window<->workspace association only works on X11, where there is only one workspace group, * but it can be destroyed on wayland, so let's manage this in a minimalist way */ + g_signal_connect_object (manager, "workspace-group-created", G_CALLBACK (workspace_group_created), plugin, 0); g_signal_connect_object (manager, "workspace-group-destroyed", G_CALLBACK (workspace_group_destroyed), plugin, 0); workspace_group_destroyed (manager, NULL, plugin); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/po/xfce4-panel.pot new/xfce4-panel-4.20.7/po/xfce4-panel.pot --- old/xfce4-panel-4.20.6/po/xfce4-panel.pot 2025-12-29 17:35:18.000000000 +0100 +++ new/xfce4-panel-4.20.7/po/xfce4-panel.pot 2026-03-02 10:57:54.000000000 +0100 @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: xfce4-panel 4.20.6\n" +"Project-Id-Version: xfce4-panel 4.20.7\n" "Report-Msgid-Bugs-To: https://gitlab.xfce.org/xfce/xfce4-panel/-/issues\n" -"POT-Creation-Date: 2025-12-13 18:49+0100\n" +"POT-Creation-Date: 2026-02-20 18:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <[email protected]>\n" @@ -33,7 +33,7 @@ "menu;start;buttons;launcher;notification area;status;icons;plugins;" msgstr "" -#: panel-preferences.desktop.in:14 panel/panel-window.c:3740 +#: panel-preferences.desktop.in:14 panel/panel-window.c:3867 msgid "Panel" msgstr "" @@ -111,7 +111,7 @@ #: common/resources/tasklist-dialog.glade:93 #: common/resources/windowmenu-dialog.glade:63 #: libxfce4panel/xfce-panel-plugin.c:1348 panel/panel-item-dialog.c:207 -#: panel/panel-window.c:3806 +#: panel/panel-window.c:3933 msgid "_Help" msgstr "" @@ -302,7 +302,7 @@ #. remove #: common/resources/panel-preferences-dialog.glade:1240 -#: libxfce4panel/xfce-panel-plugin.c:1278 panel/panel-application.c:357 +#: libxfce4panel/xfce-panel-plugin.c:1278 panel/panel-application.c:360 #: panel/panel-plugin-external.c:424 panel/panel-preferences-dialog.c:1085 #: plugins/launcher/launcher-dialog.c:840 msgid "_Remove" @@ -1126,7 +1126,7 @@ msgstr "" #. about item -#: libxfce4panel/xfce-panel-plugin.c:1251 panel/panel-window.c:3815 +#: libxfce4panel/xfce-panel-plugin.c:1251 panel/panel-window.c:3942 msgid "_About" msgstr "" @@ -1140,17 +1140,17 @@ msgstr "" #. add new items -#: libxfce4panel/xfce-panel-plugin.c:1304 panel/panel-window.c:3752 +#: libxfce4panel/xfce-panel-plugin.c:1304 panel/panel-window.c:3879 msgid "Add _New Items..." msgstr "" #. customize panel -#: libxfce4panel/xfce-panel-plugin.c:1315 panel/panel-window.c:3763 +#: libxfce4panel/xfce-panel-plugin.c:1315 panel/panel-window.c:3890 msgid "Panel Pr_eferences..." msgstr "" #. logout item -#: libxfce4panel/xfce-panel-plugin.c:1332 panel/panel-window.c:3790 +#: libxfce4panel/xfce-panel-plugin.c:1332 panel/panel-window.c:3917 msgid "Log _Out" msgstr "" @@ -1273,18 +1273,18 @@ msgid "Execute" msgstr "" -#: panel/panel-application.c:214 +#: panel/panel-application.c:217 msgid "Failed to launch the migration application" msgstr "" -#: panel/panel-application.c:347 +#: panel/panel-application.c:350 #, c-format msgid "" "Plugin \"%s\" could not be loaded, do you want to remove it from xfce4-panel " "configuration?" msgstr "" -#: panel/panel-application.c:349 +#: panel/panel-application.c:352 #, c-format msgid "" "This plugin is in the current xfce4-panel configuration but could not be " @@ -1294,46 +1294,46 @@ "installation and trying to start xfce4-panel again." msgstr "" -#: panel/panel-application.c:356 +#: panel/panel-application.c:359 msgid "Plugin loading failure" msgstr "" -#: panel/panel-application.c:357 +#: panel/panel-application.c:360 msgid "_Quit" msgstr "" -#: panel/panel-application.c:1037 +#: panel/panel-application.c:1041 msgid "" "This will create a new launcher plugin on the panel and inserts the dropped " "files as menu items." msgstr "" -#: panel/panel-application.c:1040 +#: panel/panel-application.c:1044 msgid "Create _Launcher" msgstr "" -#: panel/panel-application.c:1041 +#: panel/panel-application.c:1045 #, c-format msgid "Create new launcher from %d desktop file" msgid_plural "Create new launcher from %d desktop files" msgstr[0] "" msgstr[1] "" -#: panel/panel-application.c:1808 +#: panel/panel-application.c:1812 msgid "" "You have started X without session manager. Clicking Quit will close the X " "server." msgstr "" -#: panel/panel-application.c:1811 +#: panel/panel-application.c:1815 msgid "Quit" msgstr "" -#: panel/panel-application.c:1811 +#: panel/panel-application.c:1815 msgid "Are you sure you want to quit the panel?" msgstr "" -#: panel/panel-application.c:1819 +#: panel/panel-application.c:1823 #, c-format msgid "Failed to execute command \"%s\"" msgstr "" @@ -1499,7 +1499,7 @@ msgid "Expert" msgstr "" -#: panel/panel-window.c:3777 +#: panel/panel-window.c:3904 msgid "_Lock Panel" msgstr "" @@ -2154,7 +2154,7 @@ msgid "Unable to open the workspace settings" msgstr "" -#: plugins/pager/pager-buttons.c:632 plugins/windowmenu/windowmenu.c:963 +#: plugins/pager/pager-buttons.c:650 plugins/windowmenu/windowmenu.c:979 #, c-format msgid "Workspace %d" msgstr "" @@ -2217,32 +2217,32 @@ "items" msgstr "" -#: plugins/tasklist/tasklist-widget.c:3175 +#: plugins/tasklist/tasklist-widget.c:3205 #, c-format msgid "Unable to start new instance of '%s'" msgstr "" -#: plugins/tasklist/tasklist-widget.c:3202 +#: plugins/tasklist/tasklist-widget.c:3232 msgid "Launch New Instance" msgstr "" -#: plugins/tasklist/tasklist-widget.c:3957 +#: plugins/tasklist/tasklist-widget.c:3989 msgid "Mi_nimize All" msgstr "" -#: plugins/tasklist/tasklist-widget.c:3964 +#: plugins/tasklist/tasklist-widget.c:3996 msgid "Un_minimize All" msgstr "" -#: plugins/tasklist/tasklist-widget.c:3971 +#: plugins/tasklist/tasklist-widget.c:4003 msgid "Ma_ximize All" msgstr "" -#: plugins/tasklist/tasklist-widget.c:3978 +#: plugins/tasklist/tasklist-widget.c:4010 msgid "_Unmaximize All" msgstr "" -#: plugins/tasklist/tasklist-widget.c:3989 +#: plugins/tasklist/tasklist-widget.c:4021 msgid "_Close All" msgstr "" @@ -2250,28 +2250,28 @@ msgid "Switch between open windows using buttons" msgstr "" -#: plugins/windowmenu/windowmenu.c:742 +#: plugins/windowmenu/windowmenu.c:758 msgid "Desktop" msgstr "" -#: plugins/windowmenu/windowmenu.c:1358 +#: plugins/windowmenu/windowmenu.c:1374 msgid "No Windows" msgstr "" -#: plugins/windowmenu/windowmenu.c:1373 +#: plugins/windowmenu/windowmenu.c:1389 msgid "Urgent Windows" msgstr "" -#: plugins/windowmenu/windowmenu.c:1424 +#: plugins/windowmenu/windowmenu.c:1440 msgid "Add Workspace" msgstr "" -#: plugins/windowmenu/windowmenu.c:1446 +#: plugins/windowmenu/windowmenu.c:1462 #, c-format msgid "Remove Workspace \"%s\"" msgstr "" -#: plugins/windowmenu/windowmenu.c:1448 +#: plugins/windowmenu/windowmenu.c:1464 #, c-format msgid "Remove Workspace %d" msgstr "" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/wrapper/wrapper-external-exported.c new/xfce4-panel-4.20.7/wrapper/wrapper-external-exported.c --- old/xfce4-panel-4.20.6/wrapper/wrapper-external-exported.c 2025-12-29 17:34:47.000000000 +0100 +++ new/xfce4-panel-4.20.7/wrapper/wrapper-external-exported.c 2026-03-02 10:57:09.000000000 +0100 @@ -706,7 +706,7 @@ gboolean wrapper_external_exported_call_pointer_is_outside_finish ( WrapperExternalExported *proxy, - gboolean *out_is_outside, + gboolean* out_is_outside, GAsyncResult *res, GError **error) { @@ -738,7 +738,7 @@ gboolean wrapper_external_exported_call_pointer_is_outside_sync ( WrapperExternalExported *proxy, - gboolean *out_is_outside, + gboolean* out_is_outside, GCancellable *cancellable, GError **error) { @@ -1446,8 +1446,14 @@ { WrapperExternalExportedSkeleton *skeleton = WRAPPER_EXTERNAL_EXPORTED_SKELETON (object); g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 + /* coverity[missing_lock : SUPPRESS] */ + g_clear_pointer (&skeleton->priv->changed_properties_idle_source, g_source_destroy); +#else if (skeleton->priv->changed_properties_idle_source != NULL) g_source_destroy (skeleton->priv->changed_properties_idle_source); +skeleton->priv->changed_properties_idle_source = NULL; +#endif g_main_context_unref (skeleton->priv->context); g_mutex_clear (&skeleton->priv->lock); G_OBJECT_CLASS (wrapper_external_exported_skeleton_parent_class)->finalize (object); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xfce4-panel-4.20.6/wrapper/wrapper-external-exported.h new/xfce4-panel-4.20.7/wrapper/wrapper-external-exported.h --- old/xfce4-panel-4.20.6/wrapper/wrapper-external-exported.h 2025-12-29 17:34:47.000000000 +0100 +++ new/xfce4-panel-4.20.7/wrapper/wrapper-external-exported.h 2026-03-02 10:57:09.000000000 +0100 @@ -89,13 +89,13 @@ gboolean wrapper_external_exported_call_pointer_is_outside_finish ( WrapperExternalExported *proxy, - gboolean *out_is_outside, + gboolean* out_is_outside, GAsyncResult *res, GError **error); gboolean wrapper_external_exported_call_pointer_is_outside_sync ( WrapperExternalExported *proxy, - gboolean *out_is_outside, + gboolean* out_is_outside, GCancellable *cancellable, GError **error);
