1
0
forked from rpms/plymouth
plymouth/0003-ply-throbber-Do-not-redraw-when-we-need-to-stop-thro.patch
Hans de Goede f97cb31771 Add patches fixing crash on monitor hot(un)plug (rhbz#1809681)
Add patches fixing delay between gdm telling us to deactivate and
  us telling gdm it is ok to continue
Drop plymouth-plugin-throbgress sub-package, the spinfinity theme now
  uses the two-step plugin
2020-03-09 10:58:24 +01:00

89 lines
3.5 KiB
Diff

From 82a1aaaaddeb4dc65728c28d6ccc776f38cd6f5d Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Feb 2020 11:51:03 +0100
Subject: [PATCH 3/7] ply-throbber: Do not redraw when we need to stop
throbbing on free
One case where the various widgets are being freed is the pixel-display-s
being removed because of a monitor being hot(un)plugged. When the monitor
configuration changes ply-device-manager removes all old pixel-displays
and then adds the pixel-displays from the new config.
Calling ply_pixel_display_draw_area on a pixel-display which is about to be
freed is a bad idea, if the monitor was actually unplugged this leads to
various sort of errors, including crashes in some cases.
ply-throbber is the only (older) widget which does a redraw on free,
this likely was not noticed until now because typically the throbber
will already have been stopped on free.
This commit adds a redraw parameter to ply_throbber_stop_now and sets
this to false when calling ply_throbber_stop_now from ply_throbber_free.
This fixes plymouth sometimes crashing when monitors are hot(un)plugged
while plymouth is running.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/libply-splash-graphics/ply-throbber.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/src/libply-splash-graphics/ply-throbber.c b/src/libply-splash-graphics/ply-throbber.c
index a4311fd..bf0855e 100644
--- a/src/libply-splash-graphics/ply-throbber.c
+++ b/src/libply-splash-graphics/ply-throbber.c
@@ -78,7 +78,7 @@ struct _ply_throbber
uint32_t is_stopped : 1;
};
-static void ply_throbber_stop_now (ply_throbber_t *throbber);
+static void ply_throbber_stop_now (ply_throbber_t *throbber, bool redraw);
ply_throbber_t *
ply_throbber_new (const char *image_dir,
@@ -126,7 +126,7 @@ ply_throbber_free (ply_throbber_t *throbber)
return;
if (!throbber->is_stopped)
- ply_throbber_stop_now (throbber);
+ ply_throbber_stop_now (throbber, false);
ply_throbber_remove_frames (throbber);
ply_array_free (throbber->frames);
@@ -324,15 +324,18 @@ ply_throbber_start (ply_throbber_t *throbber,
}
static void
-ply_throbber_stop_now (ply_throbber_t *throbber)
+ply_throbber_stop_now (ply_throbber_t *throbber, bool redraw)
{
throbber->is_stopped = true;
- ply_pixel_display_draw_area (throbber->display,
- throbber->x,
- throbber->y,
- throbber->frame_area.width,
- throbber->frame_area.height);
+ if (redraw) {
+ ply_pixel_display_draw_area (throbber->display,
+ throbber->x,
+ throbber->y,
+ throbber->frame_area.width,
+ throbber->frame_area.height);
+ }
+
if (throbber->loop != NULL) {
ply_event_loop_stop_watching_for_timeout (throbber->loop,
(ply_event_loop_timeout_handler_t)
@@ -356,7 +359,7 @@ ply_throbber_stop (ply_throbber_t *throbber,
}
if (stop_trigger == NULL) {
- ply_throbber_stop_now (throbber);
+ ply_throbber_stop_now (throbber, true);
return;
}
--
2.25.1