metacity: fix compilation on 32-bit systems

On 32-bit targets the compilation fails with the following error:

| ../../metacity-3.52.0/src/core/screen.c:2431:55: error: passing argument 2 of 'sn_startup_sequence_get_last_active_time' from incompatible pointer type [-Wincompatible-pointer-types]
|  2431 |   sn_startup_sequence_get_last_active_time (sequence, &tv_sec, &tv_usec);
|       |                                                       ^~~~~~~
|       |                                                       |
|       |                                                       long int *

Backport patch from upstream to address this problem.

Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
This commit is contained in:
Gyorgy Sarvari
2025-09-11 09:37:15 +02:00
parent 5e42bce992
commit d198635326
2 changed files with 190 additions and 1 deletions
@@ -0,0 +1,188 @@
From 89eecad37d4c5faa7a7cc5c6e23cd11e76157a92 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= <alberts.muktupavels@gmail.com>
Date: Sun, 27 Oct 2024 18:20:32 +0200
Subject: [PATCH] screen: avoid sn_startup_sequence_get_last_active_time
startup-notification has change that changes `tv_sec` parameter
type from `long` to `time_t` for over 10 years but there has not
been new release.
`get_last_active_time` returns same time as `get_initiated_time`
which is simply time when startup was initiated. To avoid potential
problems using wrong type we can just stop using related function
and record initiation time ourselves.
Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/metacity/-/commit/89eecad37d4c5faa7a7cc5c6e23cd11e76157a92]
Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
---
src/core/screen.c | 84 ++++++++++++++++++++++++++++++++++++++---------
1 file changed, 69 insertions(+), 15 deletions(-)
diff --git a/src/core/screen.c b/src/core/screen.c
index 495222f5..e79b54fb 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -143,6 +143,34 @@ set_wm_icon_size_hint (MetaScreen *screen)
#undef N_VALS
}
+typedef struct
+{
+ SnStartupSequence *sequence;
+ int64_t time;
+} MetaStartupSequence;
+
+static MetaStartupSequence *
+meta_startup_sequence_new (SnStartupSequence *sequence)
+{
+ MetaStartupSequence *self;
+
+ self = g_new0 (MetaStartupSequence, 1);
+
+ self->sequence = sequence;
+ self->time = g_get_real_time ();
+
+ sn_startup_sequence_ref (sequence);
+
+ return self;
+}
+
+static void
+meta_startup_sequence_free (MetaStartupSequence *self)
+{
+ g_clear_pointer (&self->sequence, sn_startup_sequence_unref);
+ g_free (self);
+}
+
static void
reload_monitor_infos (MetaScreen *screen)
{
@@ -543,7 +543,7 @@
meta_screen_ungrab_keys (screen);
#ifdef HAVE_STARTUP_NOTIFICATION
- g_slist_free_full (screen->startup_sequences, (GDestroyNotify) sn_startup_sequence_unref);
+ g_slist_free_full (screen->startup_sequences, (GDestroyNotify) meta_startup_sequence_free);
screen->startup_sequences = NULL;
if (screen->startup_sequence_timeout != 0)
@@ -2366,12 +2394,15 @@ static void
add_sequence (MetaScreen *screen,
SnStartupSequence *sequence)
{
+ MetaStartupSequence *meta_sequence;
+
meta_topic (META_DEBUG_STARTUP,
"Adding sequence %s\n",
sn_startup_sequence_get_id (sequence));
- sn_startup_sequence_ref (sequence);
+
+ meta_sequence = meta_startup_sequence_new (sequence);
screen->startup_sequences = g_slist_prepend (screen->startup_sequences,
- sequence);
+ meta_sequence);
/* our timeout just polls every second, instead of bothering
* to compute exactly when we may next time out
@@ -2384,17 +2415,38 @@ add_sequence (MetaScreen *screen,
update_startup_feedback (screen);
}
+static int
+find_sequence_func (gconstpointer a,
+ gconstpointer b)
+{
+ MetaStartupSequence *meta_sequence;
+ SnStartupSequence *sequence;
+
+ meta_sequence = (MetaStartupSequence *) a;
+ sequence = (SnStartupSequence *) b;
+
+ if (meta_sequence->sequence == sequence)
+ return 0;
+
+ return -1;
+}
+
static void
remove_sequence (MetaScreen *screen,
SnStartupSequence *sequence)
{
+ GSList *l;
+
meta_topic (META_DEBUG_STARTUP,
"Removing sequence %s\n",
sn_startup_sequence_get_id (sequence));
- screen->startup_sequences = g_slist_remove (screen->startup_sequences,
- sequence);
- sn_startup_sequence_unref (sequence);
+ l = g_slist_find_custom (screen->startup_sequences,
+ sequence,
+ find_sequence_func);
+
+ screen->startup_sequences = g_slist_remove_link (screen->startup_sequences, l);
+ g_slist_free_full (l, (GDestroyNotify) meta_startup_sequence_free);
if (screen->startup_sequences == NULL &&
screen->startup_sequence_timeout != 0)
@@ -2424,13 +2476,11 @@ collect_timed_out_foreach (void *element,
void *data)
{
CollectTimedOutData *ctod = data;
- SnStartupSequence *sequence = element;
- long tv_sec, tv_usec;
+ MetaStartupSequence *meta_sequence = element;
+ SnStartupSequence *sequence = meta_sequence->sequence;
double elapsed;
- sn_startup_sequence_get_last_active_time (sequence, &tv_sec, &tv_usec);
-
- elapsed = (ctod->now - (tv_sec * G_USEC_PER_SEC + tv_usec)) / 1000.0;
+ elapsed = (ctod->now - meta_sequence->time) / 1000.0;
meta_topic (META_DEBUG_STARTUP,
"Sequence used %g seconds vs. %g max: %s\n",
@@ -2572,9 +2622,11 @@ meta_screen_apply_startup_properties (MetaScreen *screen,
tmp = screen->startup_sequences;
while (tmp != NULL)
{
+ MetaStartupSequence *meta_sequence;
const char *wmclass;
- wmclass = sn_startup_sequence_get_wmclass (tmp->data);
+ meta_sequence = tmp->data;
+ wmclass = sn_startup_sequence_get_wmclass (meta_sequence->sequence);
if (wmclass != NULL &&
((window->res_class &&
@@ -2582,7 +2634,7 @@ meta_screen_apply_startup_properties (MetaScreen *screen,
(window->res_name &&
strcmp (wmclass, window->res_name) == 0)))
{
- sequence = tmp->data;
+ sequence = meta_sequence->sequence;
g_assert (window->startup_id == NULL);
window->startup_id = g_strdup (sn_startup_sequence_get_id (sequence));
@@ -2614,13 +2666,15 @@ meta_screen_apply_startup_properties (MetaScreen *screen,
tmp = screen->startup_sequences;
while (tmp != NULL)
{
+ MetaStartupSequence *meta_sequence;
const char *id;
- id = sn_startup_sequence_get_id (tmp->data);
+ meta_sequence = tmp->data;
+ id = sn_startup_sequence_get_id (meta_sequence->sequence);
if (strcmp (id, startup_id) == 0)
{
- sequence = tmp->data;
+ sequence = meta_sequence->sequence;
break;
}
--
GitLab
@@ -25,7 +25,8 @@ GNOMEBASEBUILDCLASS = "autotools"
inherit gnomebase gsettings gettext upstream-version-is-even features_check
SRC_URI[archive.sha256sum] = "a72438ace6d5903ae79338c6098b1b35ab91c8a97c4323701d3bef1f3eeb191c"
SRC_URI += "file://0001-drop-zenity-detection.patch"
SRC_URI += "file://0001-drop-zenity-detection.patch \
file://screen_avoid_sn_startup_sequence_get_last_active_time.patch"
PACKAGECONFIG[xinerama] = "--enable-xinerama,--disable-xinerama,libxinerama"
# enable as neccessary until new warnings are dealt with