Compare commits

...

No commits in common. "c8" and "c10s" have entirely different histories.
c8 ... c10s

13 changed files with 2831 additions and 27 deletions

31
.gitignore vendored
View File

@ -1 +1,30 @@
SOURCES/libwnck-3.24.1.tar.xz libwnck-2.30.0.tar.bz2
libwnck-2.30.3.tar.bz2
/libwnck-2.30.4.tar.bz2
/libwnck-2.91.6.tar.bz2
/libwnck-3.0.2.tar.bz2
/libwnck-3.1.90.tar.xz
/libwnck-3.1.92.tar.xz
/libwnck-3.2.0.tar.xz
/libwnck-3.2.1.tar.xz
/libwnck-3.3.5.tar.xz
/libwnck-3.4.0.tar.xz
/libwnck-3.4.2.tar.xz
/libwnck-3.4.3.tar.xz
/libwnck-3.4.4.tar.xz
/libwnck-3.4.5.tar.xz
/libwnck-3.4.7.tar.xz
/libwnck-3.4.9.tar.xz
/libwnck-3.14.0.tar.xz
/libwnck-3.14.1.tar.xz
/libwnck-3.20.0.tar.xz
/libwnck-3.20.1.tar.xz
/libwnck-3.24.0.tar.xz
/libwnck-3.24.1.tar.xz
/libwnck-3.31.4.tar.xz
/libwnck-3.32.0.tar.xz
/sources
/libwnck-3.36.0.tar.xz
/libwnck-40.0.tar.xz
/libwnck-40.1.tar.xz
/libwnck-43.0.tar.xz

View File

@ -1 +0,0 @@
5c16cd0c63022cfa7cf2f824d037482cfbd9068b SOURCES/libwnck-3.24.1.tar.xz

6
gating.yaml Normal file
View File

@ -0,0 +1,6 @@
--- !Policy
product_versions:
- rhel-10
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: desktop-qe.desktop-ci.tier1-gating.functional}

View File

@ -2,23 +2,35 @@
Summary: Window Navigator Construction Kit Summary: Window Navigator Construction Kit
Name: libwnck3 Name: libwnck3
Version: 3.24.1 Version: 43.0
Release: 2%{?dist} Release: 10%{?dist}
URL: http://download.gnome.org/sources/%{source_name}/ URL: http://download.gnome.org/sources/%{source_name}/
Source0: http://download.gnome.org/sources/%{source_name}/3.24/%{source_name}-%{version}.tar.xz Source0: http://download.gnome.org/sources/%{source_name}/40/%{source_name}-%{version}.tar.xz
License: LGPLv2+ License: LGPL-2.0-or-later
Group: System Environment/Libraries
# https://gitlab.gnome.org/GNOME/libwnck/-/merge_requests/10
Patch2: libwnck_0001-Expose-window-scaling-factor_43.patch
Patch3: libwnck_0002-icons-Use-cairo-surfaces-to-render-icons_43.patch
Patch4: libwnck_0003-xutils-Change-icons-to-being-cairo-surfaces_43.patch
Patch5: libwnck_0004-icons-Mark-GdkPixbuf-icons-as-deprecated_43.patch
Patch6: libwnck_0005-tasklist-Add-surface-loader-function_43.patch
# fix https://gitlab.gnome.org/GNOME/libwnck/-/issues/154#note_1562760
# https://gitlab.gnome.org/GNOME/libwnck/-/commit/07694559cc0c65ce1cca9ac33b165cef84c34d5e
Patch7: libwnck_0001-Revert-xutils-Get-the-correct-PID-for-clients-inside.patch
# https://bugs.launchpad.net/ubuntu/+source/libwnck3/+bug/1990263
# https://gitlab.gnome.org/GNOME/libwnck/-/merge_requests/46
Patch8: libwnck3_handle_avoid_segfault_in_invalidate_icons.patch
BuildRequires: gcc
BuildRequires: meson
BuildRequires: gettext
BuildRequires: glib2-devel BuildRequires: glib2-devel
BuildRequires: gobject-introspection-devel
BuildRequires: gtk3-devel BuildRequires: gtk3-devel
BuildRequires: gtk-doc
BuildRequires: libXres-devel
BuildRequires: pango-devel BuildRequires: pango-devel
BuildRequires: startup-notification-devel BuildRequires: startup-notification-devel
BuildRequires: gobject-introspection-devel
BuildRequires: libXres-devel
BuildRequires: gettext
BuildRequires: intltool
BuildRequires: libtool, automake, autoconf
BuildRequires: gnome-common
Requires: startup-notification Requires: startup-notification
@ -29,7 +41,6 @@ about open windows, workspaces, their names/icons, and so forth.
%package devel %package devel
Summary: Libraries and headers for libwnck Summary: Libraries and headers for libwnck
Group: Development/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release} Requires: %{name}%{?_isa} = %{version}-%{release}
%description devel %description devel
@ -38,33 +49,27 @@ developing applications that use %{name}.
%prep %prep
%setup -q -n %{source_name}-%{version} %autosetup -n %{source_name}-%{version} -p1
%build %build
%configure \ %meson -Dgtk_doc=true
--disable-static \ %meson_build
--enable-introspection=yes \
--enable-startup-notification
%{make_build}
%install %install
%{make_install} %meson_install
find %{buildroot} -name '*.la' -exec rm -f {} ';'
%find_lang %{source_name}-3.0 --with-gnome --all-name %find_lang %{source_name}-3.0 --with-gnome --all-name
%post -p /sbin/ldconfig %ldconfig_scriptlets
%postun -p /sbin/ldconfig
%files -f %{source_name}-3.0.lang %files -f %{source_name}-3.0.lang
%license COPYING %license COPYING
%doc AUTHORS README NEWS %doc AUTHORS README NEWS
%{_libdir}/%{source_name}-3.so.* %{_libdir}/%{source_name}-3.so.0*
%{_bindir}/wnck-urgency-monitor %{_bindir}/wnck-urgency-monitor
%{_libdir}/girepository-1.0/Wnck-3.0.typelib %{_libdir}/girepository-1.0/Wnck-3.0.typelib
@ -78,6 +83,91 @@ find %{buildroot} -name '*.la' -exec rm -f {} ';'
%changelog %changelog
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 43.0-10
- Bump release for October 2024 mass rebuild:
Resolves: RHEL-64018
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 43.0-9
- Bump release for June 2024 mass rebuild
* Thu Jan 25 2024 Fedora Release Engineering <releng@fedoraproject.org> - 43.0-8
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 43.0-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Tue Nov 21 2023 Wolfgang Ulbrich <fedora@raveit.de> - 43.0-6
- fix rhbz (#2242944)
- disable Revert-pager-do-not-change-workspace-size-from-size patch
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 43.0-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 43.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Fri Oct 07 2022 Wolfgang Ulbrich <fedora@raveit.de> - 43.0-3
- fix https://bugs.launchpad.net/ubuntu/+source/libwnck3/+bug/1990263
* Thu Sep 29 2022 Wolfgang Ulbrich <fedora@raveit.de> - 43.0-2
- fix https://gitlab.gnome.org/GNOME/libwnck/-/issues/154
* Mon Sep 19 2022 Wolfgang Ulbrich <fedora@raveit.de> - 43.0-1
- update to 43.0
* Thu Jul 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 40.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Sat Feb 19 2022 Wolfgang Ulbrich <fedora@raveit.de> - 40.1-1
- update to 40.1
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 40.0-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Sun Dec 12 2021 Wolfgang Ulbrich <fedora@raveit.de> - 40.0-4
- use https://gitlab.gnome.org/GNOME/libwnck/-/commit/bd8ab37
- Scale tasklist icons
* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 40.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Fri Jun 11 2021 Wolfgang Ulbrich <fedora@raveit.de> - 40.0-2
- revert https://gitlab.gnome.org/GNOME/libwnck/-/commit/3456b74
- fixes rhbz #1971048
- and https://github.com/mate-desktop/mate-panel/issues/1230
* Wed May 26 2021 Kalev Lember <klember@redhat.com> - 40.0-1
- Update to 40.0
- Tighten soname globs
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.36.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.36.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Sat Mar 28 2020 Wolfgang Ulbrich <fedora@raveit.de> - 3.36.0-1
- update to 3.36.0
* Wed Jan 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.32.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.32.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Wed May 01 2019 Phil Wyett <philwyett@kathenas.org> - 3.32.0-1
- Update to 3.32.0
* Fri Feb 01 2019 Kalev Lember <klember@redhat.com> - 3.31.4-1
- Update to 3.31.4
- Switch to the meson build system
* Fri Feb 01 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.24.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.24.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.24.1-2 * Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.24.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild

View File

@ -0,0 +1,29 @@
From 6ceb684442eb26e3bdb8a38bf52264ad55f96a7b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= <alberts.muktupavels@gmail.com>
Date: Tue, 20 Sep 2022 15:40:22 +0300
Subject: [PATCH] handle: avoid segfault in invalidate_icons
Screens variable won't be initialized if default icon sizes are
set/changed before using wnck_screen_get_default.
https://bugs.launchpad.net/ubuntu/+source/libwnck3/+bug/1990263
---
libwnck/wnck-handle.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/libwnck/wnck-handle.c b/libwnck/wnck-handle.c
index e12ff882..8d5da45c 100644
--- a/libwnck/wnck-handle.c
+++ b/libwnck/wnck-handle.c
@@ -70,6 +70,9 @@ invalidate_icons (WnckHandle *self)
Display *xdisplay;
int i;
+ if (self->screens == NULL)
+ return;
+
xdisplay = _wnck_get_default_display ();
for (i = 0; i < ScreenCount (xdisplay); ++i)
--

View File

@ -0,0 +1,58 @@
From 27b7ebb8092a36f0fb32e3277577ff9f09d309e6 Mon Sep 17 00:00:00 2001
From: Victor Kareh <vkareh@redhat.com>
Date: Tue, 6 Aug 2019 09:59:59 -0400
Subject: [PATCH 1/5] Expose window scaling factor
---
libwnck/private.h | 2 ++
libwnck/util.c | 21 +++++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/libwnck/private.h b/libwnck/private.h
index d5e48d9..6741e1e 100644
--- a/libwnck/private.h
+++ b/libwnck/private.h
@@ -37,6 +37,8 @@ G_BEGIN_DECLS
WnckHandle *_wnck_get_handle (void);
+int _wnck_get_window_scaling_factor (void);
+
void _wnck_application_process_property_notify (WnckApplication *app,
XEvent *xevent);
void _wnck_window_process_property_notify (WnckWindow *window,
diff --git a/libwnck/util.c b/libwnck/util.c
index 83659dc..a58a99e 100644
--- a/libwnck/util.c
+++ b/libwnck/util.c
@@ -164,6 +164,27 @@ _wnck_get_handle (void)
return wnck_handle;
}
+/**
+ * _wnck_get_window_scaling_factor:
+ *
+ * Retrieves the internal scale factor that maps from window coordinates to the
+ * actual device pixels. On traditional systems this is 1, on high density
+ * outputs, it can be a higher value (typically 2).
+ */
+int
+_wnck_get_window_scaling_factor (void)
+{
+ GdkScreen *screen;
+ GValue value = G_VALUE_INIT;
+
+ g_value_init (&value, G_TYPE_INT);
+
+ screen = gdk_screen_get_default ();
+ if (gdk_screen_get_setting (screen, "gdk-window-scaling-factor", &value))
+ return g_value_get_int (&value);
+ return 1;
+}
+
/**
* wnck_set_default_icon_size:
* @size: the default size for windows and application standard icons.
--
2.37.2

View File

@ -0,0 +1,98 @@
From 89a5825eb20bfa91b91055e5a3dfe6445e6b9bd2 Mon Sep 17 00:00:00 2001
From: raveit65 <mate@raveit.de>
Date: Fri, 11 Jun 2021 21:26:40 +0200
Subject: [PATCH] Revert "pager: do not change workspace size from
size_allocate"
This reverts commit 3456b747b6381f17d48629dd8fdd4d511e739b10.
---
libwnck/pager.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/libwnck/pager.c b/libwnck/pager.c
index c769d62..a563a4d 100644
--- a/libwnck/pager.c
+++ b/libwnck/pager.c
@@ -122,6 +122,8 @@ static void wnck_pager_get_preferred_height_for_width (GtkWidget *widget,
int width,
int *minimum_height,
int *natural_height);
+static void wnck_pager_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
static gboolean wnck_pager_draw (GtkWidget *widget,
cairo_t *cr);
static gboolean wnck_pager_button_press (GtkWidget *widget,
@@ -247,6 +249,7 @@ wnck_pager_class_init (WnckPagerClass *klass)
widget_class->get_preferred_width_for_height = wnck_pager_get_preferred_width_for_height;
widget_class->get_preferred_height = wnck_pager_get_preferred_height;
widget_class->get_preferred_height_for_width = wnck_pager_get_preferred_height_for_width;
+ widget_class->size_allocate = wnck_pager_size_allocate;
widget_class->draw = wnck_pager_draw;
widget_class->button_press_event = wnck_pager_button_press;
widget_class->button_release_event = wnck_pager_button_release;
@@ -684,6 +687,62 @@ wnck_pager_get_preferred_height_for_width (GtkWidget *widget,
*natural_height = *minimum_height = MAX (height, 0);
}
+static gboolean
+_wnck_pager_queue_resize (gpointer data)
+{
+ gtk_widget_queue_resize (GTK_WIDGET (data));
+ return FALSE;
+}
+
+static void
+wnck_pager_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
+{
+ WnckPager *pager;
+ int workspace_size;
+ GtkBorder padding;
+ int width;
+ int height;
+
+ pager = WNCK_PAGER (widget);
+
+ width = allocation->width;
+ height = allocation->height;
+
+ _wnck_pager_get_padding (pager, &padding);
+ width -= padding.left + padding.right;
+ height -= padding.top + padding.bottom;
+
+ g_assert (pager->priv->n_rows > 0);
+
+ if (pager->priv->orientation == GTK_ORIENTATION_VERTICAL)
+ {
+ if (pager->priv->show_all_workspaces)
+ workspace_size = (width - (pager->priv->n_rows - 1)) / pager->priv->n_rows;
+ else
+ workspace_size = width;
+ }
+ else
+ {
+ if (pager->priv->show_all_workspaces)
+ workspace_size = (height - (pager->priv->n_rows - 1))/ pager->priv->n_rows;
+ else
+ workspace_size = height;
+ }
+
+ workspace_size = MAX (workspace_size, 1);
+
+ if (workspace_size != pager->priv->workspace_size)
+ {
+ pager->priv->workspace_size = workspace_size;
+ g_idle_add (_wnck_pager_queue_resize, pager);
+ return;
+ }
+
+ GTK_WIDGET_CLASS (wnck_pager_parent_class)->size_allocate (widget,
+ allocation);
+}
+
static void
get_workspace_rect (WnckPager *pager,
int space,
--
2.31.1

View File

@ -0,0 +1,75 @@
From 9c4551c67d6fe854f7d37970398f5d5c9d17c28e Mon Sep 17 00:00:00 2001
From: raveit65 <mate@raveit.de>
Date: Thu, 29 Sep 2022 10:31:16 +0200
Subject: [PATCH] Revert "xutils: Get the correct PID for clients inside PID
namespaces"
This reverts commit 07694559cc0c65ce1cca9ac33b165cef84c34d5e.
- fixing https://gitlab.gnome.org/GNOME/libwnck/-/issues/154#note_1562760
---
libwnck/xutils.c | 36 +++---------------------------------
1 file changed, 3 insertions(+), 33 deletions(-)
diff --git a/libwnck/xutils.c b/libwnck/xutils.c
index 60ae7b2..f2a2d3c 100644
--- a/libwnck/xutils.c
+++ b/libwnck/xutils.c
@@ -27,9 +27,6 @@
#if HAVE_CAIRO_XLIB_XRENDER
#include <cairo-xlib-xrender.h>
#endif
-#ifdef HAVE_XRES
-#include <X11/extensions/XRes.h>
-#endif
#include "screen.h"
#include "window.h"
#include "private.h"
@@ -1149,41 +1146,14 @@ int
_wnck_get_pid (Screen *screen,
Window xwindow)
{
- int pid = -1;
-
-#ifdef HAVE_XRES
- XResClientIdSpec client_spec;
- long client_id_count = 0;
- XResClientIdValue *client_ids = NULL;
-
- client_spec.client = xwindow;
- client_spec.mask = XRES_CLIENT_ID_PID_MASK;
-
- if (XResQueryClientIds (DisplayOfScreen (screen), 1, &client_spec,
- &client_id_count, &client_ids) == Success)
- {
- long i;
-
- for (i = 0; i < client_id_count; i++)
- {
- pid = XResGetClientPid (&client_ids[i]);
- if (pid != -1)
- break;
- }
-
- XResClientIdsDestroy (client_id_count, client_ids);
-
- if (pid != -1)
- return pid;
- }
-#endif
+ int val;
if (!_wnck_get_cardinal (screen, xwindow,
_wnck_atom_get ("_NET_WM_PID"),
- &pid))
+ &val))
return 0;
else
- return pid;
+ return val;
}
char*
--
2.37.3

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,772 @@
From 53d505622e90805684260873d0fbadaec9e2d3ed Mon Sep 17 00:00:00 2001
From: Victor Kareh <vkareh@redhat.com>
Date: Mon, 20 Jan 2020 13:38:59 -0500
Subject: [PATCH 3/5] xutils: Change icons to being cairo surfaces
Since all icons are stored internally as cairo surfaces, we should be
returning icons as cairo surfaces from the private functions in xutils.
This simplifies the drawing codepath and makes us able to delete a bunch
of GdkPixbuf manipulation.
adapted from https://gitlab.gnome.org/GNOME/mutter/commit/af7f51b9
---
libwnck/application.c | 22 +--
libwnck/class-group.c | 17 +-
libwnck/tasklist.c | 9 +-
libwnck/window.c | 22 +--
libwnck/wnck-icon-cache-private.h | 15 +-
libwnck/wnck-icon-cache.c | 299 +++++++++++++-----------------
libwnck/xutils.c | 42 ++---
libwnck/xutils.h | 11 +-
8 files changed, 179 insertions(+), 258 deletions(-)
diff --git a/libwnck/application.c b/libwnck/application.c
index d8283cc..b441eb6 100644
--- a/libwnck/application.c
+++ b/libwnck/application.c
@@ -309,10 +309,11 @@ static void
get_icons (WnckApplication *app)
{
WnckHandle *handle;
- GdkPixbuf *icon;
- GdkPixbuf *mini_icon;
+ cairo_surface_t *icon;
+ cairo_surface_t *mini_icon;
gsize normal_size;
gsize mini_size;
+ int scaling_factor;
handle = wnck_screen_get_handle (app->priv->screen);
@@ -320,6 +321,7 @@ get_icons (WnckApplication *app)
mini_icon = NULL;
normal_size = _wnck_handle_get_default_icon_size (handle);
mini_size = _wnck_handle_get_default_mini_icon_size (handle);
+ scaling_factor = _wnck_get_window_scaling_factor ();
if (_wnck_read_icons (app->priv->screen,
app->priv->xwindow,
@@ -327,24 +329,16 @@ get_icons (WnckApplication *app)
&icon,
normal_size,
&mini_icon,
- mini_size))
+ mini_size,
+ scaling_factor))
{
app->priv->need_emit_icon_changed = TRUE;
g_clear_pointer (&app->priv->icon, cairo_surface_destroy);
g_clear_pointer (&app->priv->mini_icon, cairo_surface_destroy);
- if (icon)
- {
- app->priv->icon = gdk_cairo_surface_create_from_pixbuf (icon, 0, NULL);
- g_clear_object (&icon);
- }
-
- if (mini_icon)
- {
- app->priv->mini_icon = gdk_cairo_surface_create_from_pixbuf (mini_icon, 0, NULL);
- g_clear_object (&mini_icon);
- }
+ app->priv->icon = icon;
+ app->priv->mini_icon = mini_icon;
}
/* FIXME we should really fall back to using the icon
diff --git a/libwnck/class-group.c b/libwnck/class-group.c
index e6c45d6..7899497 100644
--- a/libwnck/class-group.c
+++ b/libwnck/class-group.c
@@ -441,23 +441,10 @@ set_icon (WnckClassGroup *class_group)
handle = wnck_screen_get_handle (class_group->priv->screen);
- GdkPixbuf *icon_pixbuf, *mini_icon_pixbuf;
-
- _wnck_get_fallback_icons (&icon_pixbuf,
+ _wnck_get_fallback_icons (&icon,
_wnck_handle_get_default_icon_size (handle),
- &mini_icon_pixbuf,
+ &mini_icon,
_wnck_handle_get_default_mini_icon_size (handle));
- if (icon_pixbuf)
- {
- icon = gdk_cairo_surface_create_from_pixbuf (icon_pixbuf, 0, NULL);
- g_clear_object (&icon_pixbuf);
- }
-
- if (mini_icon_pixbuf)
- {
- mini_icon = gdk_cairo_surface_create_from_pixbuf (mini_icon_pixbuf, 0, NULL);
- g_clear_object (&mini_icon_pixbuf);
- }
icons_reffed = TRUE;
}
diff --git a/libwnck/tasklist.c b/libwnck/tasklist.c
index 10c6cc8..3e7b789 100644
--- a/libwnck/tasklist.c
+++ b/libwnck/tasklist.c
@@ -3898,15 +3898,8 @@ wnck_task_get_icon (WnckTask *task)
if (surface == NULL)
{
- GdkPixbuf *pixbuf;
_wnck_get_fallback_icons (NULL, 0,
- &pixbuf, mini_icon_size);
-
- if (pixbuf != NULL)
- {
- surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 0, NULL);
- g_object_unref (pixbuf);
- }
+ &surface, mini_icon_size);
}
#endif
break;
diff --git a/libwnck/window.c b/libwnck/window.c
index f01b4c2..5c97675 100644
--- a/libwnck/window.c
+++ b/libwnck/window.c
@@ -2105,10 +2105,11 @@ static void
get_icons (WnckWindow *window)
{
WnckHandle *handle;
- GdkPixbuf *icon;
- GdkPixbuf *mini_icon;
+ cairo_surface_t *icon;
+ cairo_surface_t *mini_icon;
gsize normal_size;
gsize mini_size;
+ int scaling_factor;
handle = wnck_screen_get_handle (window->priv->screen);
@@ -2116,6 +2117,7 @@ get_icons (WnckWindow *window)
mini_icon = NULL;
normal_size = _wnck_handle_get_default_icon_size (handle);
mini_size = _wnck_handle_get_default_mini_icon_size (handle);
+ scaling_factor = _wnck_get_window_scaling_factor ();
if (_wnck_read_icons (window->priv->screen,
window->priv->xwindow,
@@ -2123,24 +2125,16 @@ get_icons (WnckWindow *window)
&icon,
normal_size,
&mini_icon,
- mini_size))
+ mini_size,
+ scaling_factor))
{
window->priv->need_emit_icon_changed = TRUE;
g_clear_pointer (&window->priv->icon, cairo_surface_destroy);
g_clear_pointer (&window->priv->mini_icon, cairo_surface_destroy);
- if (icon)
- {
- window->priv->icon = gdk_cairo_surface_create_from_pixbuf (icon, 0, NULL);
- g_clear_object (&icon);
- }
-
- if (mini_icon)
- {
- window->priv->mini_icon = gdk_cairo_surface_create_from_pixbuf (mini_icon, 0, NULL);
- g_clear_object (&mini_icon);
- }
+ window->priv->icon = icon;
+ window->priv->mini_icon = mini_icon;
}
g_assert ((window->priv->icon && window->priv->mini_icon) ||
diff --git a/libwnck/wnck-icon-cache-private.h b/libwnck/wnck-icon-cache-private.h
index 6a3d5ec..d3c39e2 100644
--- a/libwnck/wnck-icon-cache-private.h
+++ b/libwnck/wnck-icon-cache-private.h
@@ -38,13 +38,14 @@ void _wnck_icon_cache_set_want_fallback (WnckIconCache *icon_cache
gboolean setting);
gboolean _wnck_icon_cache_get_is_fallback (WnckIconCache *icon_cache);
-gboolean _wnck_read_icons (WnckScreen *screen,
- Window xwindow,
- WnckIconCache *icon_cache,
- GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size);
+gboolean _wnck_read_icons (WnckScreen *screen,
+ Window xwindow,
+ WnckIconCache *icon_cache,
+ cairo_surface_t **iconp,
+ int ideal_size,
+ cairo_surface_t **mini_iconp,
+ int ideal_mini_size,
+ int scaling_factor);
G_END_DECLS
diff --git a/libwnck/wnck-icon-cache.c b/libwnck/wnck-icon-cache.c
index 9ff8d15..d9e67e8 100644
--- a/libwnck/wnck-icon-cache.c
+++ b/libwnck/wnck-icon-cache.c
@@ -44,8 +44,8 @@ struct _WnckIconCache
IconOrigin origin;
Pixmap prev_pixmap;
Pixmap prev_mask;
- GdkPixbuf *icon;
- GdkPixbuf *mini_icon;
+ cairo_surface_t *icon;
+ cairo_surface_t *mini_icon;
int ideal_size;
int ideal_mini_size;
guint want_fallback : 1;
@@ -139,49 +139,65 @@ find_best_size (gulong *data,
return FALSE;
}
-static void
-argbdata_to_pixdata (gulong *argb_data, int len, guchar **pixdata)
+static cairo_surface_t *
+argbdata_to_surface (gulong *argb_data,
+ int w,
+ int h,
+ int ideal_w,
+ int ideal_h,
+ int scaling_factor)
{
- guchar *p;
- int i;
+ cairo_surface_t *surface, *icon;
+ cairo_t *cr;
+ int y, x, stride;
+ uint32_t *data;
- *pixdata = g_new (guchar, len * 4);
- p = *pixdata;
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+ cairo_surface_set_device_scale (surface, (double)scaling_factor, (double)scaling_factor);
+ stride = cairo_image_surface_get_stride (surface) / sizeof (uint32_t);
+ data = (uint32_t *) cairo_image_surface_get_data (surface);
/* One could speed this up a lot. */
- i = 0;
- while (i < len)
+ for (y = 0; y < h; y++)
{
- guint argb;
- guint rgba;
-
- argb = argb_data[i];
- rgba = (argb << 8) | (argb >> 24);
-
- *p = rgba >> 24;
- ++p;
- *p = (rgba >> 16) & 0xff;
- ++p;
- *p = (rgba >> 8) & 0xff;
- ++p;
- *p = rgba & 0xff;
- ++p;
-
- ++i;
+ for (x = 0; x < w; x++)
+ {
+ uint32_t *p = &data[y * stride + x];
+ gulong *d = &argb_data[y * w + x];
+ *p = *d;
+ }
}
+
+ cairo_surface_mark_dirty (surface);
+
+ icon = cairo_surface_create_similar_image (surface,
+ cairo_image_surface_get_format (surface),
+ ideal_w, ideal_h);
+
+ cairo_surface_set_device_scale (icon, (double)scaling_factor, (double)scaling_factor);
+
+ cr = cairo_create (icon);
+ cairo_scale (cr, ideal_w / (double)w, ideal_h / (double)h);
+ cairo_set_source_surface (cr, surface, 0, 0);
+ cairo_paint (cr);
+
+ cairo_set_operator (cr, CAIRO_OPERATOR_IN);
+ cairo_paint (cr);
+
+ cairo_destroy (cr);
+ cairo_surface_destroy (surface);
+
+ return icon;
}
static gboolean
-read_rgb_icon (Screen *screen,
- Window xwindow,
- int ideal_size,
- int ideal_mini_size,
- int *width,
- int *height,
- guchar **pixdata,
- int *mini_width,
- int *mini_height,
- guchar **mini_pixdata)
+read_rgb_icon (Screen *screen,
+ Window xwindow,
+ int ideal_size,
+ int ideal_mini_size,
+ cairo_surface_t **iconp,
+ cairo_surface_t **mini_iconp,
+ int scaling_factor)
{
Display *display;
Atom type;
@@ -219,7 +235,9 @@ read_rgb_icon (Screen *screen,
return FALSE;
}
- if (!find_best_size (data, nitems, ideal_size, &w, &h, &best))
+ if (!find_best_size (data, nitems,
+ ideal_size,
+ &w, &h, &best))
{
XFree (data);
return FALSE;
@@ -233,14 +251,8 @@ read_rgb_icon (Screen *screen,
return FALSE;
}
- *width = w;
- *height = h;
-
- *mini_width = mini_w;
- *mini_height = mini_h;
-
- argbdata_to_pixdata (best, w * h, pixdata);
- argbdata_to_pixdata (best_mini, mini_w * mini_h, mini_pixdata);
+ *iconp = argbdata_to_surface (best, w, h, ideal_size, ideal_size, scaling_factor);
+ *mini_iconp = argbdata_to_surface (best_mini, mini_w, mini_h, ideal_mini_size, ideal_mini_size, scaling_factor);
XFree (data);
@@ -248,27 +260,27 @@ read_rgb_icon (Screen *screen,
}
static gboolean
-try_pixmap_and_mask (Screen *screen,
- Pixmap src_pixmap,
- Pixmap src_mask,
- GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size)
+try_pixmap_and_mask (Screen *screen,
+ Pixmap src_pixmap,
+ Pixmap src_mask,
+ cairo_surface_t **iconp,
+ int ideal_size,
+ cairo_surface_t **mini_iconp,
+ int ideal_mini_size,
+ int scaling_factor)
{
cairo_surface_t *surface, *mask_surface, *image;
GdkDisplay *gdk_display;
- GdkPixbuf *unscaled;
int width, height;
cairo_t *cr;
if (src_pixmap == None)
return FALSE;
- surface = _wnck_cairo_surface_get_from_pixmap (screen, src_pixmap);
+ surface = _wnck_cairo_surface_get_from_pixmap (screen, src_pixmap, scaling_factor);
if (surface && src_mask != None)
- mask_surface = _wnck_cairo_surface_get_from_pixmap (screen, src_mask);
+ mask_surface = _wnck_cairo_surface_get_from_pixmap (screen, src_mask, scaling_factor);
else
mask_surface = NULL;
@@ -324,26 +336,41 @@ try_pixmap_and_mask (Screen *screen,
return FALSE;
}
- unscaled = gdk_pixbuf_get_from_surface (image,
- 0, 0,
- width, height);
+ if (image)
+ {
+ int image_w, image_h;
- cairo_surface_destroy (image);
+ image_w = cairo_image_surface_get_width (image);
+ image_h = cairo_image_surface_get_height (image);
+
+ *iconp = cairo_surface_create_similar (image,
+ cairo_surface_get_content (image),
+ ideal_size,
+ ideal_size);
+
+ cairo_surface_set_device_scale (*iconp, (double)scaling_factor, (double)scaling_factor);
+
+ cr = cairo_create (*iconp);
+ cairo_scale (cr, ideal_size / (double)image_w, ideal_size / (double)image_h);
+ cairo_set_source_surface (cr, image, 0, 0);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ *mini_iconp = cairo_surface_create_similar (image,
+ cairo_surface_get_content (image),
+ ideal_mini_size,
+ ideal_mini_size);
+
+ cairo_surface_set_device_scale (*mini_iconp, (double)scaling_factor, (double)scaling_factor);
+
+ cr = cairo_create (*mini_iconp);
+ cairo_scale (cr, ideal_mini_size / (double)image_w, ideal_mini_size / (double)image_h);
+ cairo_set_source_surface (cr, image, 0, 0);
+ cairo_paint (cr);
+ cairo_destroy (cr);
+
+ cairo_surface_destroy (image);
- if (unscaled)
- {
- *iconp =
- gdk_pixbuf_scale_simple (unscaled,
- ideal_size,
- ideal_size,
- GDK_INTERP_BILINEAR);
- *mini_iconp =
- gdk_pixbuf_scale_simple (unscaled,
- ideal_mini_size,
- ideal_mini_size,
- GDK_INTERP_BILINEAR);
-
- g_object_unref (G_OBJECT (unscaled));
return TRUE;
}
else
@@ -354,13 +381,8 @@ static void
clear_icon_cache (WnckIconCache *icon_cache,
gboolean dirty_all)
{
- if (icon_cache->icon)
- g_object_unref (G_OBJECT (icon_cache->icon));
- icon_cache->icon = NULL;
-
- if (icon_cache->mini_icon)
- g_object_unref (G_OBJECT (icon_cache->mini_icon));
- icon_cache->mini_icon = NULL;
+ g_clear_pointer (&icon_cache->icon, cairo_surface_destroy);
+ g_clear_pointer (&icon_cache->mini_icon, cairo_surface_destroy);
icon_cache->origin = USING_NO_ICON;
@@ -372,89 +394,26 @@ clear_icon_cache (WnckIconCache *icon_cache,
}
static void
-replace_cache (WnckIconCache *icon_cache,
- IconOrigin origin,
- GdkPixbuf *new_icon,
- GdkPixbuf *new_mini_icon)
+replace_cache (WnckIconCache *icon_cache,
+ IconOrigin origin,
+ cairo_surface_t *new_icon,
+ cairo_surface_t *new_mini_icon)
{
clear_icon_cache (icon_cache, FALSE);
icon_cache->origin = origin;
if (new_icon)
- g_object_ref (G_OBJECT (new_icon));
+ cairo_surface_reference (new_icon);
icon_cache->icon = new_icon;
if (new_mini_icon)
- g_object_ref (G_OBJECT (new_mini_icon));
+ cairo_surface_reference (new_mini_icon);
icon_cache->mini_icon = new_mini_icon;
}
-static void
-free_pixels (guchar *pixels,
- gpointer data)
-{
- g_free (pixels);
-}
-
-static GdkPixbuf*
-scaled_from_pixdata (guchar *pixdata,
- int w,
- int h,
- int new_w,
- int new_h)
-{
- GdkPixbuf *src;
- GdkPixbuf *dest;
-
- src = gdk_pixbuf_new_from_data (pixdata,
- GDK_COLORSPACE_RGB,
- TRUE,
- 8,
- w, h, w * 4,
- free_pixels,
- NULL);
-
- if (src == NULL)
- return NULL;
-
- if (w != h)
- {
- GdkPixbuf *tmp;
- int size;
-
- size = MAX (w, h);
-
- tmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, size, size);
-
- if (tmp != NULL)
- {
- gdk_pixbuf_fill (tmp, 0);
- gdk_pixbuf_copy_area (src, 0, 0, w, h,
- tmp,
- (size - w) / 2, (size - h) / 2);
-
- g_object_unref (src);
- src = tmp;
- }
- }
-
- if (w != new_w || h != new_h)
- {
- dest = gdk_pixbuf_scale_simple (src, new_w, new_h, GDK_INTERP_BILINEAR);
-
- g_object_unref (G_OBJECT (src));
- }
- else
- {
- dest = src;
- }
-
- return dest;
-}
-
WnckIconCache*
_wnck_icon_cache_new (void)
{
@@ -528,22 +487,17 @@ _wnck_icon_cache_get_is_fallback (WnckIconCache *icon_cache)
}
gboolean
-_wnck_read_icons (WnckScreen *screen,
- Window xwindow,
- WnckIconCache *icon_cache,
- GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size)
+_wnck_read_icons (WnckScreen *screen,
+ Window xwindow,
+ WnckIconCache *icon_cache,
+ cairo_surface_t **iconp,
+ int ideal_size,
+ cairo_surface_t **mini_iconp,
+ int ideal_mini_size,
+ int scaling_factor)
{
Screen *xscreen;
Display *display;
- guchar *pixdata;
- int w, h;
- guchar *mini_pixdata;
- int mini_w, mini_h;
- Pixmap pixmap;
- Pixmap mask;
XWMHints *hints;
/* Return value is whether the icon changed */
@@ -556,6 +510,9 @@ _wnck_read_icons (WnckScreen *screen,
*iconp = NULL;
*mini_iconp = NULL;
+ ideal_size *= scaling_factor;
+ ideal_mini_size *= scaling_factor;
+
if (ideal_size != icon_cache->ideal_size ||
ideal_mini_size != icon_cache->ideal_mini_size)
clear_icon_cache (icon_cache, TRUE);
@@ -566,8 +523,6 @@ _wnck_read_icons (WnckScreen *screen,
if (!_wnck_icon_cache_get_icon_invalidated (icon_cache))
return FALSE; /* we have no new info to use */
- pixdata = NULL;
-
/* Our algorithm here assumes that we can't have for example origin
* < USING_NET_WM_ICON and icon_cache->net_wm_icon_dirty == FALSE
* unless we have tried to read NET_WM_ICON.
@@ -579,21 +534,15 @@ _wnck_read_icons (WnckScreen *screen,
if (icon_cache->origin <= USING_NET_WM_ICON &&
icon_cache->net_wm_icon_dirty)
-
{
icon_cache->net_wm_icon_dirty = FALSE;
if (read_rgb_icon (xscreen, xwindow,
ideal_size,
ideal_mini_size,
- &w, &h, &pixdata,
- &mini_w, &mini_h, &mini_pixdata))
+ iconp, mini_iconp,
+ scaling_factor))
{
- *iconp = scaled_from_pixdata (pixdata, w, h, ideal_size, ideal_size);
-
- *mini_iconp = scaled_from_pixdata (mini_pixdata, mini_w, mini_h,
- ideal_mini_size, ideal_mini_size);
-
replace_cache (icon_cache, USING_NET_WM_ICON,
*iconp, *mini_iconp);
@@ -604,6 +553,9 @@ _wnck_read_icons (WnckScreen *screen,
if (icon_cache->origin <= USING_WM_HINTS &&
icon_cache->wm_hints_dirty)
{
+ Pixmap pixmap;
+ Pixmap mask;
+
icon_cache->wm_hints_dirty = FALSE;
_wnck_error_trap_push (display);
@@ -632,7 +584,8 @@ _wnck_read_icons (WnckScreen *screen,
{
if (try_pixmap_and_mask (xscreen, pixmap, mask,
iconp, ideal_size,
- mini_iconp, ideal_mini_size))
+ mini_iconp, ideal_mini_size,
+ scaling_factor))
{
icon_cache->prev_pixmap = pixmap;
icon_cache->prev_mask = mask;
diff --git a/libwnck/xutils.c b/libwnck/xutils.c
index 60ae7b2..476f027 100644
--- a/libwnck/xutils.c
+++ b/libwnck/xutils.c
@@ -1389,7 +1389,8 @@ _wnck_select_input (Screen *screen,
cairo_surface_t *
_wnck_cairo_surface_get_from_pixmap (Screen *screen,
- Pixmap xpixmap)
+ Pixmap xpixmap,
+ int scaling_factor)
{
cairo_surface_t *surface;
Display *display;
@@ -1407,6 +1408,9 @@ _wnck_cairo_surface_get_from_pixmap (Screen *screen,
&x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
goto TRAP_POP;
+ w_ret *= scaling_factor;
+ h_ret *= scaling_factor;
+
if (depth_ret == 1)
{
surface = cairo_xlib_surface_create_for_bitmap (display,
@@ -1463,7 +1467,7 @@ _wnck_gdk_pixbuf_get_from_pixmap (Screen *screen,
cairo_surface_t *surface;
GdkPixbuf *retval;
- surface = _wnck_cairo_surface_get_from_pixmap (screen, xpixmap);
+ surface = _wnck_cairo_surface_get_from_pixmap (screen, xpixmap, 1);
if (surface == NULL)
return NULL;
@@ -1478,36 +1482,30 @@ _wnck_gdk_pixbuf_get_from_pixmap (Screen *screen,
return retval;
}
-static GdkPixbuf*
+static cairo_surface_t*
default_icon_at_size (int size)
{
- GdkPixbuf *base;
+ GdkPixbuf *pixbuf;
+ cairo_surface_t *surface;
- base = gdk_pixbuf_new_from_resource ("/org/gnome/libwnck/default_icon.png", NULL);
+ pixbuf = gdk_pixbuf_new_from_resource_at_scale ("/org/gnome/libwnck/default_icon.png",
+ size, size,
+ TRUE, NULL);
- g_assert (base);
+ g_assert (pixbuf);
- if (gdk_pixbuf_get_width (base) == size &&
- gdk_pixbuf_get_height (base) == size)
- {
- return base;
- }
- else
- {
- GdkPixbuf *scaled;
+ surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 0, NULL);
- scaled = gdk_pixbuf_scale_simple (base, size, size, GDK_INTERP_BILINEAR);
- g_object_unref (G_OBJECT (base));
+ g_clear_object (&pixbuf);
- return scaled;
- }
+ return surface;
}
void
-_wnck_get_fallback_icons (GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size)
+_wnck_get_fallback_icons (cairo_surface_t **iconp,
+ int ideal_size,
+ cairo_surface_t **mini_iconp,
+ int ideal_mini_size)
{
if (iconp)
*iconp = default_icon_at_size (ideal_size);
diff --git a/libwnck/xutils.h b/libwnck/xutils.h
index 4e5c620..51e8e55 100644
--- a/libwnck/xutils.h
+++ b/libwnck/xutils.h
@@ -156,10 +156,10 @@ void _wnck_keyboard_size (WnckScreen *screen,
void _wnck_toggle_showing_desktop (Screen *screen,
gboolean show);
-void _wnck_get_fallback_icons (GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size);
+void _wnck_get_fallback_icons (cairo_surface_t **iconp,
+ int ideal_size,
+ cairo_surface_t **mini_iconp,
+ int ideal_mini_size);
void _wnck_get_window_geometry (Screen *screen,
Window xwindow,
@@ -192,7 +192,8 @@ void _wnck_set_desktop_layout (Screen *xscreen,
int columns);
cairo_surface_t *_wnck_cairo_surface_get_from_pixmap (Screen *screen,
- Pixmap xpixmap);
+ Pixmap xpixmap,
+ int scaling_factor);
GdkPixbuf* _wnck_gdk_pixbuf_get_from_pixmap (Screen *screen,
Pixmap xpixmap);
--
2.37.2

View File

@ -0,0 +1,189 @@
From d8316f3e2745fde9039f03a1e619f13132f21bf4 Mon Sep 17 00:00:00 2001
From: Victor Kareh <vkareh@redhat.com>
Date: Tue, 11 Feb 2020 07:40:47 -0500
Subject: [PATCH 4/5] icons: Mark GdkPixbuf icons as deprecated
Since we have migrated icons to render as cairo surfaces we can now mark
GdkPixbuf icons as deprecated without having to break the API.
---
libwnck/application.c | 8 ++++++++
libwnck/application.h | 6 ++++++
libwnck/class-group.c | 4 ++++
libwnck/class-group.h | 4 ++++
libwnck/test-wnck.c | 2 +-
libwnck/window.c | 6 ++++++
libwnck/window.h | 4 ++++
7 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/libwnck/application.c b/libwnck/application.c
index b441eb6..9096ddb 100644
--- a/libwnck/application.c
+++ b/libwnck/application.c
@@ -395,6 +395,8 @@ find_icon_window (WnckApplication *app)
* Return value: (transfer none): the icon for @app. The caller should
* reference the returned <classname>GdkPixbuf</classname> if it needs to keep
* the icon around.
+ *
+ * Deprecated:41.0: Use wnck_application_get_icon_surface() instead.
**/
GdkPixbuf*
wnck_application_get_icon (WnckApplication *app)
@@ -434,10 +436,12 @@ wnck_application_get_icon (WnckApplication *app)
}
else
{
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
WnckWindow *w = find_icon_window (app);
if (w)
return wnck_window_get_icon (w);
else
+G_GNUC_END_IGNORE_DEPRECATIONS
return NULL;
}
}
@@ -453,6 +457,8 @@ wnck_application_get_icon (WnckApplication *app)
* Return value: (transfer none): the mini-icon for @app. The caller should
* reference the returned <classname>GdkPixbuf</classname> if it needs to keep
* the mini-icon around.
+ *
+ * Deprecated:41.0: Use wnck_application_get_mini_icon_surface() instead.
**/
GdkPixbuf*
wnck_application_get_mini_icon (WnckApplication *app)
@@ -492,10 +498,12 @@ wnck_application_get_mini_icon (WnckApplication *app)
}
else
{
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
WnckWindow *w = find_icon_window (app);
if (w)
return wnck_window_get_mini_icon (w);
else
+G_GNUC_END_IGNORE_DEPRECATIONS
return NULL;
}
}
diff --git a/libwnck/application.h b/libwnck/application.h
index f3ea970..4d9078e 100644
--- a/libwnck/application.h
+++ b/libwnck/application.h
@@ -91,10 +91,16 @@ int wnck_application_get_n_windows (WnckApplication *app);
const char* wnck_application_get_name (WnckApplication *app);
const char* wnck_application_get_icon_name (WnckApplication *app);
int wnck_application_get_pid (WnckApplication *app);
+
+G_DEPRECATED_FOR(wnck_application_get_icon_surface)
GdkPixbuf* wnck_application_get_icon (WnckApplication *app);
+
+G_DEPRECATED_FOR(wnck_application_get_mini_icon_surface)
GdkPixbuf* wnck_application_get_mini_icon (WnckApplication *app);
+
cairo_surface_t* wnck_application_get_icon_surface (WnckApplication *app);
cairo_surface_t* wnck_application_get_mini_icon_surface (WnckApplication *app);
+
gboolean wnck_application_get_icon_is_fallback (WnckApplication *app);
const char* wnck_application_get_startup_id (WnckApplication *app);
diff --git a/libwnck/class-group.c b/libwnck/class-group.c
index 7899497..026e995 100644
--- a/libwnck/class-group.c
+++ b/libwnck/class-group.c
@@ -689,6 +689,8 @@ wnck_class_group_get_name (WnckClassGroup *class_group)
* the icon around.
*
* Since: 2.2
+ *
+ * Deprecated:41.0: Use wnck_class_group_get_icon_surface() instead.
**/
GdkPixbuf *
wnck_class_group_get_icon (WnckClassGroup *class_group)
@@ -741,6 +743,8 @@ wnck_class_group_get_icon (WnckClassGroup *class_group)
* to keep the mini-icon around.
*
* Since: 2.2
+ *
+ * Deprecated:41.0: Use wnck_class_group_get_mini_icon_surface() instead.
**/
GdkPixbuf *
wnck_class_group_get_mini_icon (WnckClassGroup *class_group)
diff --git a/libwnck/class-group.h b/libwnck/class-group.h
index 122e0ed..dee0e7c 100644
--- a/libwnck/class-group.h
+++ b/libwnck/class-group.h
@@ -81,8 +81,12 @@ const char * wnck_class_group_get_id (WnckClassGroup *class_group);
const char * wnck_class_group_get_name (WnckClassGroup *class_group);
+G_DEPRECATED_FOR(wnck_class_group_get_icon_surface)
GdkPixbuf *wnck_class_group_get_icon (WnckClassGroup *class_group);
+
+G_DEPRECATED_FOR(wnck_class_group_get_mini_icon_surface)
GdkPixbuf *wnck_class_group_get_mini_icon (WnckClassGroup *class_group);
+
cairo_surface_t *wnck_class_group_get_icon_surface (WnckClassGroup *class_group);
cairo_surface_t *wnck_class_group_get_mini_icon_surface (WnckClassGroup *class_group);
diff --git a/libwnck/test-wnck.c b/libwnck/test-wnck.c
index 77085cd..649c2e6 100644
--- a/libwnck/test-wnck.c
+++ b/libwnck/test-wnck.c
@@ -523,7 +523,7 @@ icon_set_func (GtkTreeViewColumn *tree_column,
return;
g_object_set (GTK_CELL_RENDERER (cell),
- "pixbuf", wnck_window_get_mini_icon (window),
+ "surface", wnck_window_get_mini_icon_surface (window),
NULL);
}
diff --git a/libwnck/window.c b/libwnck/window.c
index 5c97675..3cd800d 100644
--- a/libwnck/window.c
+++ b/libwnck/window.c
@@ -21,6 +21,8 @@
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
+#undef WNCK_DISABLE_DEPRECATED
+
#include <config.h>
#include <glib/gi18n-lib.h>
@@ -2164,6 +2166,8 @@ _wnck_window_load_icons (WnckWindow *window)
* Return value: (transfer none): the icon for @window. The caller should
* reference the returned <classname>GdkPixbuf</classname> if it needs to keep
* the icon around.
+ *
+ * Deprecated:41.0: Use wnck_window_get_icon_surface() instead.
**/
GdkPixbuf*
wnck_window_get_icon (WnckWindow *window)
@@ -2216,6 +2220,8 @@ wnck_window_get_icon (WnckWindow *window)
* Return value: (transfer none): the mini-icon for @window. The caller should
* reference the returned <classname>GdkPixbuf</classname> if it needs to keep
* the icon around.
+ *
+ * Deprecated:41.0: Use wnck_window_get_mini_icon_surface() instead.
**/
GdkPixbuf*
wnck_window_get_mini_icon (WnckWindow *window)
diff --git a/libwnck/window.h b/libwnck/window.h
index 2bec086..d7e52f1 100644
--- a/libwnck/window.h
+++ b/libwnck/window.h
@@ -381,8 +381,12 @@ void wnck_window_activate_transient (WnckWindow *window,
guint32 timestamp);
gboolean wnck_window_transient_is_most_recently_activated (WnckWindow *window);
+G_DEPRECATED_FOR(wnck_window_get_icon_surface)
GdkPixbuf* wnck_window_get_icon (WnckWindow *window);
+
+G_DEPRECATED_FOR(wnck_window_get_mini_icon_surface)
GdkPixbuf* wnck_window_get_mini_icon (WnckWindow *window);
+
cairo_surface_t* wnck_window_get_icon_surface (WnckWindow *window);
cairo_surface_t* wnck_window_get_mini_icon_surface (WnckWindow *window);
--
2.37.2

View File

@ -0,0 +1,134 @@
From 6cdfd1fe219c207bcc3355fde21b58979cdbf633 Mon Sep 17 00:00:00 2001
From: Victor Kareh <vkareh@redhat.com>
Date: Thu, 3 Jun 2021 14:04:06 -0400
Subject: [PATCH 5/5] tasklist: Add surface loader function
Since the tasklist now supports cairo_surface_t icons, we provide
a similar icon loader function that takes surface icons.
---
libwnck/tasklist.c | 50 +++++++++++++++++++++++++++++++++++++++++++++-
libwnck/tasklist.h | 26 ++++++++++++++++++++++++
2 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/libwnck/tasklist.c b/libwnck/tasklist.c
index 3e7b789..225f62e 100644
--- a/libwnck/tasklist.c
+++ b/libwnck/tasklist.c
@@ -235,6 +235,10 @@ struct _WnckTasklistPrivate
void *icon_loader_data;
GDestroyNotify free_icon_loader_data;
+ WnckLoadSurfaceFunction surface_loader;
+ void *surface_loader_data;
+ GDestroyNotify free_surface_loader_data;
+
#ifdef HAVE_STARTUP_NOTIFICATION
SnDisplay *sn_display;
SnMonitorContext *sn_context;
@@ -1215,6 +1219,11 @@ wnck_tasklist_finalize (GObject *object)
tasklist->priv->free_icon_loader_data = NULL;
tasklist->priv->icon_loader_data = NULL;
+ if (tasklist->priv->free_surface_loader_data != NULL)
+ (* tasklist->priv->free_surface_loader_data) (tasklist->priv->surface_loader_data);
+ tasklist->priv->free_surface_loader_data = NULL;
+ tasklist->priv->surface_loader_data = NULL;
+
g_clear_object (&tasklist->priv->handle);
G_OBJECT_CLASS (wnck_tasklist_parent_class)->finalize (object);
@@ -1455,6 +1464,31 @@ wnck_tasklist_set_icon_loader (WnckTasklist *tasklist,
tasklist->priv->free_icon_loader_data = free_data_func;
}
+/**
+ * wnck_tasklist_set_surface_loader:
+ * @tasklist: a #WnckTasklist
+ * @load_surface_func: icon loader function
+ * @data: data for icon loader function
+ * @free_data_func: function to free the data
+ *
+ * Sets a function to be used for loading cairo surface icons.
+ **/
+void
+wnck_tasklist_set_surface_loader (WnckTasklist *tasklist,
+ WnckLoadSurfaceFunction load_surface_func,
+ void *data,
+ GDestroyNotify free_data_func)
+{
+ g_return_if_fail (WNCK_IS_TASKLIST (tasklist));
+
+ if (tasklist->priv->free_surface_loader_data != NULL)
+ (* tasklist->priv->free_surface_loader_data) (tasklist->priv->surface_loader_data);
+
+ tasklist->priv->surface_loader = load_surface_func;
+ tasklist->priv->surface_loader_data = data;
+ tasklist->priv->free_surface_loader_data = free_data_func;
+}
+
static void
get_layout (GtkOrientation orientation,
int for_size,
@@ -3869,7 +3903,21 @@ wnck_task_get_icon (WnckTask *task)
case WNCK_TASK_STARTUP_SEQUENCE:
#ifdef HAVE_STARTUP_NOTIFICATION
- if (task->tasklist->priv->icon_loader != NULL)
+ if (task->tasklist->priv->surface_loader != NULL)
+ {
+ const char *icon;
+
+ icon = sn_startup_sequence_get_icon_name (task->startup_sequence);
+ if (icon != NULL)
+ {
+ surface = (* task->tasklist->priv->surface_loader) (icon,
+ mini_icon_size,
+ 0,
+ task->tasklist->priv->surface_loader_data);
+
+ }
+ }
+ else if (task->tasklist->priv->icon_loader != NULL)
{
const char *icon;
diff --git a/libwnck/tasklist.h b/libwnck/tasklist.h
index 5407d34..373eaaa 100644
--- a/libwnck/tasklist.h
+++ b/libwnck/tasklist.h
@@ -141,6 +141,32 @@ void wnck_tasklist_set_icon_loader (WnckTasklist *tasklist,
void *data,
GDestroyNotify free_data_func);
+/**
+ * WnckLoadSurfaceFunction:
+ * @icon_name: an icon name as in the Icon field in a .desktop file for the
+ * icon to load.
+ * @size: the desired icon size.
+ * @flags: not defined to do anything yet.
+ * @data: data passed to the function, set when the #WnckLoadSurfaceFunction has
+ * been set for the #WnckTasklist.
+ *
+ * Specifies the type of function passed to wnck_tasklist_set_icon_loader().
+ *
+ * Returns: it should return a <classname>cairo_surface_t</classname> of @icon_name
+ * at size @size, or %NULL if no icon for @icon_name at size @size could be
+ * loaded.
+ *
+ */
+typedef cairo_surface_t* (*WnckLoadSurfaceFunction) (const char *icon_name,
+ int size,
+ unsigned int flags,
+ void *data);
+
+void wnck_tasklist_set_surface_loader (WnckTasklist *tasklist,
+ WnckLoadSurfaceFunction load_surface_func,
+ void *data,
+ GDestroyNotify free_data_func);
+
G_END_DECLS
#endif /* WNCK_TASKLIST_H */
--
2.37.2

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (libwnck-43.0.tar.xz) = f6c14b0a650c6d5ab4d4013e6add3972a0f0bcdedfb9785f64199c9a65713d11c9d936e8b04d0f04707c3d165dd345bfa806f654bf82eabb765546b8914d68d2