[Pkg-xfce-commits] [Git][xfce-team/desktop/xfce4-panel][upstream/latest] New upstream version 4.20.7
Yves-Alexis Perez (@corsac)
gitlab at salsa.debian.org
Sat Mar 7 13:32:03 GMT 2026
Yves-Alexis Perez pushed to branch upstream/latest at xfce / desktop / xfce4-panel
Commits:
a2daf55d by Yves-Alexis Perez at 2026-03-06T19:08:21+01:00
New upstream version 4.20.7
- - - - -
23 changed files:
- ChangeLog
- NEWS
- common/panel-utils.c
- configure
- configure.ac
- docs/reference/html/index.html
- docs/reference/html/libxfce4panel-Version-Information.html
- libxfce4panel/libxfce4panel-config.h
- meson.build
- panel/panel-application.c
- panel/panel-gdbus-exported-service.c
- panel/panel-gdbus-exported-service.h
- panel/panel-module-factory.c
- panel/panel-module.c
- panel/panel-plugin-external-wrapper-exported.c
- panel/panel-window.c
- plugins/pager/pager-buttons.c
- plugins/systray/sn-watcher.c
- plugins/tasklist/tasklist-widget.c
- plugins/windowmenu/windowmenu.c
- po/xfce4-panel.pot
- wrapper/wrapper-external-exported.c
- wrapper/wrapper-external-exported.h
Changes:
=====================================
ChangeLog
=====================================
@@ -1,3 +1,198 @@
+commit f4e21b14a389fa6b7cc4fd756cb92e0a822ed3e5
+Author: Gaël Bonithon <gael at xfce.org>
+Date: Mon Mar 2 10:53:21 2026 +0100
+
+ Updates for release
+
+commit 796f7cf457f829c6c561b6d7a8d048de7cce11f5
+Author: Gaël Bonithon <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+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 <gael at xfce.org>
+Date: Mon Dec 29 17:44:49 2025 +0100
+
+ Back to development
+
commit 686840c0b5b2d3df4ca0a6dbbf9edbbc3143ddea
Author: Gaël Bonithon <gael at xfce.org>
Date: Mon Dec 29 17:30:53 2025 +0100
=====================================
NEWS
=====================================
@@ -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
=====================================
common/panel-utils.c
=====================================
@@ -257,8 +257,11 @@ panel_utils_wl_surface_commit (GtkWidget *widget)
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));
+ }
}
=====================================
configure
=====================================
@@ -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 <jasper at xfce.org> and Nick Schermer <nick at xfce.org>.
#
#
@@ -618,8 +618,8 @@ MAKEFLAGS=
# 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 @@ if test "$ac_init_help" = "long"; then
# 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 @@ fi
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 @@ fi
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 <jasper at xfce.org> and Nick Schermer <nick at xfce.org>.
_ACEOF
exit
@@ -2107,7 +2107,7 @@ cat >config.log <<_ACEOF
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 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
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 @@ fi
# 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 @@ CC=$lt_save_CC
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 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# 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 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
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\\"
=====================================
configure.ac
=====================================
@@ -11,8 +11,8 @@ dnl ***************************
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])
=====================================
docs/reference/html/index.html
=====================================
@@ -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>
=====================================
docs/reference/html/libxfce4panel-Version-Information.html
=====================================
@@ -262,7 +262,7 @@ version of the libxfce4panel headers you have included.</p>
<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 @@ linked against at application run time.</p>
<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
=====================================
libxfce4panel/libxfce4panel-config.h
=====================================
@@ -34,7 +34,7 @@ G_BEGIN_DECLS
*
* Since: 4.8
**/
-#define LIBXFCE4PANEL_VERSION ("4.20.6")
+#define LIBXFCE4PANEL_VERSION ("4.20.7")
/**
* LIBXFCE4PANEL_MAJOR_VERSION:
@@ -70,7 +70,7 @@ G_BEGIN_DECLS
*
* Since: 4.8
**/
-#define LIBXFCE4PANEL_MICRO_VERSION (6)
+#define LIBXFCE4PANEL_MICRO_VERSION (7)
/**
* LIBXFCE4PANEL_CHECK_VERSION:
=====================================
meson.build
=====================================
@@ -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 @@ version : '4.20.6',
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'
=====================================
panel/panel-application.c
=====================================
@@ -202,6 +202,9 @@ panel_application_init (PanelApplication *application)
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 @@ panel_application_plugin_insert (PanelApplication *application,
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);
=====================================
panel/panel-gdbus-exported-service.c
=====================================
@@ -1470,7 +1470,7 @@ xfce_panel_exported_service_call_plugin_event (
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 @@ xfce_panel_exported_service_call_plugin_event_sync (
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 @@ xfce_panel_exported_service_skeleton_finalize (GObject *object)
{
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);
=====================================
panel/panel-gdbus-exported-service.h
=====================================
@@ -185,7 +185,7 @@ void xfce_panel_exported_service_call_plugin_event (
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 @@ gboolean xfce_panel_exported_service_call_plugin_event_sync (
const gchar *arg_plugin_name,
const gchar *arg_name,
GVariant *arg_value,
- gboolean *out_succeed,
+ gboolean* out_succeed,
GCancellable *cancellable,
GError **error);
=====================================
panel/panel-module-factory.c
=====================================
@@ -215,7 +215,7 @@ panel_module_factory_load_modules (PanelModuleFactory *factory)
{
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 @@ panel_module_factory_load_modules (PanelModuleFactory *factory)
build_dirs_added = TRUE;
g_free (prefix);
}
-
- g_free (path);
}
g_hash_table_destroy (unique);
=====================================
panel/panel-module.c
=====================================
@@ -221,15 +221,24 @@ panel_module_load (GTypeModule *type_module)
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 @@ panel_module_new_plugin (PanelModule *module,
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);
=====================================
panel/panel-plugin-external-wrapper-exported.c
=====================================
@@ -1660,8 +1660,14 @@ xfce_panel_plugin_wrapper_exported_skeleton_finalize (GObject *object)
{
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);
=====================================
panel/panel-window.c
=====================================
@@ -389,6 +389,12 @@ struct _PanelWindow
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 @@ panel_window_finalize (GObject *object)
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 @@ panel_window_button_release_event (GtkWidget *widget,
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 @@ panel_window_get_preferred_width (GtkWidget *widget,
&& 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 @@ panel_window_get_preferred_height (GtkWidget *widget,
&& 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 @@ panel_window_size_allocate (GtkWidget *widget,
&& (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 @@ panel_window_size_allocate (GtkWidget *widget,
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 @@ panel_window_filter (GdkXEvent *xev,
+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 @@ panel_window_realize (GtkWidget *widget)
/* 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 @@ panel_window_display_layout_debug (GtkWidget *widget)
+#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 @@ panel_window_screen_layout_changed (GdkScreen *screen,
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 @@ panel_window_screen_layout_changed (GdkScreen *screen,
a.width -= a.x;
a.height -= a.y;
-
- panel_return_if_fail (a.width > 0 && a.height > 0);
}
else
{
@@ -2695,7 +2807,6 @@ panel_window_screen_layout_changed (GdkScreen *screen,
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 @@ panel_window_screen_layout_changed (GdkScreen *screen,
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 @@ panel_window_screen_layout_changed (GdkScreen *screen,
}
}
}
-
- 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 @@ panel_window_screen_layout_changed (GdkScreen *screen,
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));
}
=====================================
plugins/pager/pager-buttons.c
=====================================
@@ -56,6 +56,9 @@ pager_buttons_screen_workspace_destroyed (XfwWorkspaceGroup *group,
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 @@ workspace_group_created (XfwWorkspaceManager *manager,
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 @@ workspace_group_destroyed (XfwWorkspaceManager *manager,
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);
}
@@ -590,6 +596,18 @@ pager_buttons_screen_workspace_destroyed (XfwWorkspaceGroup *group,
+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);
+}
+
+
+
static void
pager_buttons_screen_viewports_changed (XfwWorkspaceGroup *group,
PagerButtons *pager)
=====================================
plugins/systray/sn-watcher.c
=====================================
@@ -1899,8 +1899,14 @@ sn_watcher_skeleton_finalize (GObject *object)
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);
=====================================
plugins/tasklist/tasklist-widget.c
=====================================
@@ -1215,7 +1215,10 @@ xfce_tasklist_size_allocate (GtkWidget *widget,
/* 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 @@ xfce_tasklist_arrow_button_toggled (GtkWidget *button,
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",
@@ -1679,6 +1682,31 @@ workspace_group_destroyed (XfwWorkspaceManager *manager,
+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)
{
@@ -1701,6 +1729,7 @@ xfce_tasklist_connect_screen (XfceTasklist *tasklist)
/* 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 @@ xfce_tasklist_disconnect_screen (XfceTasklist *tasklist)
panel_assert (tasklist->skipped_windows == NULL);
g_clear_object (&tasklist->screen);
+ tasklist->workspace_group = NULL;
tasklist->display = NULL;
}
@@ -3477,6 +3507,8 @@ xfce_tasklist_button_proxy_menu_item (XfceTasklistChild *child,
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;
=====================================
plugins/windowmenu/windowmenu.c
=====================================
@@ -406,13 +406,27 @@ window_menu_plugin_style_updated (GtkWidget *widget)
+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 @@ window_menu_plugin_screen_changed (GtkWidget *widget,
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_menu_plugin_screen_changed (GtkWidget *widget,
/* 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);
=====================================
po/xfce4-panel.pot
=====================================
@@ -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 at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -33,7 +33,7 @@ msgid ""
"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 @@ msgstr ""
#: 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 @@ msgstr ""
#. 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 @@ msgid "_Properties"
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 @@ msgid "Pane_l"
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 @@ msgstr ""
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 @@ msgid ""
"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 @@ msgstr ""
msgid "Expert"
msgstr ""
-#: panel/panel-window.c:3777
+#: panel/panel-window.c:3904
msgid "_Lock Panel"
msgstr ""
@@ -2154,7 +2154,7 @@ msgstr ""
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 @@ msgid ""
"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 @@ msgstr ""
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 ""
=====================================
wrapper/wrapper-external-exported.c
=====================================
@@ -706,7 +706,7 @@ wrapper_external_exported_call_pointer_is_outside (
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 @@ _out:
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 @@ wrapper_external_exported_skeleton_finalize (GObject *object)
{
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);
=====================================
wrapper/wrapper-external-exported.h
=====================================
@@ -89,13 +89,13 @@ void wrapper_external_exported_call_pointer_is_outside (
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);
View it on GitLab: https://salsa.debian.org/xfce-team/desktop/xfce4-panel/-/commit/a2daf55d74a590227ab106cf2c0514fe900bb937
--
View it on GitLab: https://salsa.debian.org/xfce-team/desktop/xfce4-panel/-/commit/a2daf55d74a590227ab106cf2c0514fe900bb937
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-xfce-commits/attachments/20260307/d4beee15/attachment-0001.htm>
More information about the Pkg-xfce-commits
mailing list