st: Only use clutter_actor_invalidate_paint_volume() if the API exists

With commits fab39bbea5 and
62e40a1350 we started depending on a new
ClutterActor API: clutter_actor_invalidate_paint_volume()

Given that this commit was applied to the 40 stable release, it broke
ABI compatibility with mutter, which is something we guarantee between
stable releases. So use GModule to dynamically find the symbol in our
loaded libraries. If it exists, use it and invalidate the paint volume.
If it doesn't exist, libmutter is still at version 40.0 and we don't
need to invalidate the paint volume.

This also adds a dependency on gmodule. We need to link against gmodule
to use g_module_open() and g_module_symbol() APIs.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1807>
This commit is contained in:
Jonas Dreßler 2021-04-12 20:49:10 +02:00 committed by Marge Bot
parent d7ad8da48d
commit 1cefd589da
4 changed files with 30 additions and 3 deletions

View File

@ -81,6 +81,7 @@ gi_dep = dependency('gobject-introspection-1.0', version: gi_req)
gio_dep = dependency('gio-2.0', version: gio_req) gio_dep = dependency('gio-2.0', version: gio_req)
gio_unix_dep = dependency('gio-unix-2.0', version: gio_req) gio_unix_dep = dependency('gio-unix-2.0', version: gio_req)
gjs_dep = dependency('gjs-1.0', version: gjs_req) gjs_dep = dependency('gjs-1.0', version: gjs_req)
gmodule_dep = dependency('gmodule-2.0')
gtk_dep = dependency('gtk+-3.0', version: gtk_req) gtk_dep = dependency('gtk+-3.0', version: gtk_req)
libxml_dep = dependency('libxml-2.0') libxml_dep = dependency('libxml-2.0')
clutter_dep = dependency(clutter_pc, version: mutter_req) clutter_dep = dependency(clutter_pc, version: mutter_req)

View File

@ -180,7 +180,7 @@ st_cflags = [
libst = shared_library('st-1.0', libst = shared_library('st-1.0',
sources: st_gir_sources + st_nogir_sources + croco_sources, sources: st_gir_sources + st_nogir_sources + croco_sources,
c_args: st_cflags, c_args: st_cflags,
dependencies: [clutter_dep, gtk_dep, mutter_dep, libxml_dep, m_dep], dependencies: [clutter_dep, gmodule_dep, gtk_dep, mutter_dep, libxml_dep, m_dep],
build_rpath: mutter_typelibdir, build_rpath: mutter_typelibdir,
install_rpath: mutter_typelibdir, install_rpath: mutter_typelibdir,
install_dir: pkglibdir, install_dir: pkglibdir,

View File

@ -80,8 +80,22 @@ adjustment_value_notify_cb (StAdjustment *adjustment,
GParamSpec *pspec, GParamSpec *pspec,
StViewport *viewport) StViewport *viewport)
{ {
static gboolean invalidate_paint_volume_valid = FALSE;
static void (* invalidate_paint_volume) (ClutterActor *) = NULL;
clutter_actor_invalidate_transform (CLUTTER_ACTOR (viewport)); clutter_actor_invalidate_transform (CLUTTER_ACTOR (viewport));
clutter_actor_invalidate_paint_volume (CLUTTER_ACTOR (viewport));
if (!invalidate_paint_volume_valid)
{
g_module_symbol (g_module_open (NULL, G_MODULE_BIND_LAZY),
"clutter_actor_invalidate_paint_volume",
(gpointer *)&invalidate_paint_volume);
invalidate_paint_volume_valid = TRUE;
}
if (invalidate_paint_volume)
invalidate_paint_volume (CLUTTER_ACTOR (viewport));
clutter_actor_queue_relayout (CLUTTER_ACTOR (viewport)); clutter_actor_queue_relayout (CLUTTER_ACTOR (viewport));
} }

View File

@ -1722,7 +1722,19 @@ st_widget_recompute_style (StWidget *widget,
if (!paint_equal) if (!paint_equal)
{ {
clutter_actor_invalidate_paint_volume (CLUTTER_ACTOR (widget)); static gboolean invalidate_paint_volume_valid = FALSE;
static void (* invalidate_paint_volume) (ClutterActor *) = NULL;
if (!invalidate_paint_volume_valid)
{
g_module_symbol (g_module_open (NULL, G_MODULE_BIND_LAZY),
"clutter_actor_invalidate_paint_volume",
(gpointer *)&invalidate_paint_volume);
invalidate_paint_volume_valid = TRUE;
}
if (invalidate_paint_volume)
invalidate_paint_volume (CLUTTER_ACTOR (widget));
next_paint_state (widget); next_paint_state (widget);