summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSean Davis <smd.seandavis@gmail.com>2018-02-18 09:37:14 -0500
committerSean Davis <smd.seandavis@gmail.com>2018-02-18 09:37:14 -0500
commitf676de1d1a820b4438faaaddf8413ee557dcd51c (patch)
tree8a45c59205181e2a1e96be51d5c330c095f34eef /src
parent08e355ae283b23aed519b98ab8ce6af6e3903500 (diff)
downloadlightdm-gtk-greeter-git-f676de1d1a820b4438faaaddf8413ee557dcd51c.tar.gz
Fix the infinite loop indefinitely.
Diffstat (limited to 'src')
-rw-r--r--src/greeterbackground.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/src/greeterbackground.c b/src/greeterbackground.c
index 942def6..b76786f 100644
--- a/src/greeterbackground.c
+++ b/src/greeterbackground.c
@@ -164,6 +164,7 @@ struct _GreeterBackgroundPrivate
GList* active_monitors_config;
const Monitor* active_monitor;
gboolean active_monitor_change_in_progress;
+ gint64 active_monitor_change_last_timestamp;
/* List of monitors <Monitor*> with user-background=true*/
GSList* customized_monitors;
@@ -378,21 +379,16 @@ greeter_background_set_active_monitor_config(GreeterBackground* background,
priv = background->priv;
- if (priv->active_monitor_change_in_progress)
- return;
- priv->active_monitor_change_in_progress = TRUE;
-
g_list_free_full(priv->active_monitors_config, g_free);
priv->active_monitors_config = NULL;
priv->active_monitor_change_in_progress = FALSE;
+ priv->active_monitor_change_last_timestamp = 0;
priv->follow_cursor = FALSE;
priv->follow_cursor_to_init = FALSE;
- if (!value || !*value) {
- priv->active_monitor_change_in_progress = FALSE;
+ if (!value || !*value)
return;
- }
values = g_strsplit(value, ";", -1);
@@ -410,8 +406,6 @@ greeter_background_set_active_monitor_config(GreeterBackground* background,
g_strfreev(values);
priv->active_monitors_config = g_list_reverse(priv->active_monitors_config);
-
- priv->active_monitor_change_in_progress = FALSE;
}
void
@@ -736,11 +730,22 @@ greeter_background_set_active_monitor(GreeterBackground* background,
{
GreeterBackgroundPrivate* priv = background->priv;
gint x, y;
+ gint64 timestamp;
+
+ if (priv->active_monitor_change_in_progress)
+ return;
+
+ timestamp = floor(g_get_monotonic_time () * 0.00001);
+ if (timestamp == priv->active_monitor_change_last_timestamp)
+ return;
+
+ priv->active_monitor_change_in_progress = TRUE;
+ priv->active_monitor_change_last_timestamp = floor(g_get_monotonic_time () * 0.00001);
if(active && !active->background)
{
if(priv->active_monitor)
- return;
+ goto active_monitor_change_complete;
active = NULL;
}
@@ -764,7 +769,9 @@ greeter_background_set_active_monitor(GreeterBackground* background,
if(!active)
{
gint num = greeter_screen_get_primary_monitor(priv->screen);
- g_return_if_fail((guint)num < priv->monitors_size);
+ if ((guint)num >= priv->monitors_size)
+ goto active_monitor_change_complete;
+
active = &priv->monitors[num];
if(!active->background || !greeter_background_monitor_enabled(background, active))
active = NULL;
@@ -807,15 +814,16 @@ greeter_background_set_active_monitor(GreeterBackground* background,
priv->active_monitor->name, priv->active_monitor->number);
else
g_warning("[Background] Active monitor is not specified, failed to identify. Active monitor stays the same: <not defined>");
- return;
+ goto active_monitor_change_complete;
}
if(active == priv->active_monitor)
- return;
+ goto active_monitor_change_complete;
priv->active_monitor = active;
- g_return_if_fail(priv->active_monitor != NULL);
+ if (priv->active_monitor == NULL)
+ goto active_monitor_change_complete;
if(priv->child)
{
@@ -844,6 +852,10 @@ greeter_background_set_active_monitor(GreeterBackground* background,
greeter_background_set_cursor_position(background,
active->geometry.x + active->geometry.width/2,
active->geometry.y + active->geometry.height/2);
+
+active_monitor_change_complete:
+ priv->active_monitor_change_in_progress = FALSE;
+ return;
}
static void