← Back to team overview

lightdm-gtk-greeter-team team mailing list archive

[Merge] lp:~kalgasnik/lightdm-gtk-greeter/background-fixes-r333 into lp:lightdm-gtk-greeter

 

Andrew P. has proposed merging lp:~kalgasnik/lightdm-gtk-greeter/background-fixes-r333 into lp:lightdm-gtk-greeter.

Requested reviews:
  LightDM Gtk+ Greeter Development Team (lightdm-gtk-greeter-team)

For more details, see:
https://code.launchpad.net/~kalgasnik/lightdm-gtk-greeter/background-fixes-r333/+merge/263066

1. Restoring user background after changing display setup.
2. Patch removes login box blinking on login.
-- 
Your team LightDM Gtk+ Greeter Development Team is requested to review the proposed merge of lp:~kalgasnik/lightdm-gtk-greeter/background-fixes-r333 into lp:lightdm-gtk-greeter.
=== modified file 'src/greeterbackground.c'
--- src/greeterbackground.c	2015-03-27 05:29:45 +0000
+++ src/greeterbackground.c	2015-06-26 07:36:09 +0000
@@ -165,6 +165,8 @@
 
     /* List of monitors <Monitor*> with user-background=true*/
     GSList* customized_monitors;
+    /* Initialized by set_custom_background() */
+    BackgroundConfig customized_background;
 
     /* List of monitors <Monitor*> with laptop=true */
     GSList* laptop_monitors;
@@ -339,25 +341,28 @@
 static void
 greeter_background_init(GreeterBackground* self)
 {
-    self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, GREETER_BACKGROUND_TYPE, GreeterBackgroundPrivate);
-    self->priv->screen = NULL;
-    self->priv->screen_monitors_changed_handler_id = 0;
-    self->priv->accel_groups = NULL;
-
-    self->priv->configs = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)monitor_config_free);
-    self->priv->default_config = monitor_config_copy(&DEFAULT_MONITOR_CONFIG, NULL);
-
-    self->priv->monitors = NULL;
-    self->priv->monitors_size = 0;
-    self->priv->monitors_map = NULL;
-
-    self->priv->customized_monitors = NULL;
-    self->priv->active_monitors_config = NULL;
-    self->priv->active_monitor = NULL;
-
-    self->priv->laptop_monitors = NULL;
-    self->priv->laptop_upower_proxy = NULL;
-    self->priv->laptop_lid_closed = FALSE;
+    GreeterBackgroundPrivate* priv = G_TYPE_INSTANCE_GET_PRIVATE(self, GREETER_BACKGROUND_TYPE, GreeterBackgroundPrivate);
+    self->priv = priv;
+
+    priv->screen = NULL;
+    priv->screen_monitors_changed_handler_id = 0;
+    priv->accel_groups = NULL;
+
+    priv->configs = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)monitor_config_free);
+    priv->default_config = monitor_config_copy(&DEFAULT_MONITOR_CONFIG, NULL);
+
+    priv->monitors = NULL;
+    priv->monitors_size = 0;
+    priv->monitors_map = NULL;
+
+    priv->customized_monitors = NULL;
+    priv->customized_background.type = BACKGROUND_TYPE_INVALID;
+    priv->active_monitors_config = NULL;
+    priv->active_monitor = NULL;
+
+    priv->laptop_monitors = NULL;
+    priv->laptop_upower_proxy = NULL;
+    priv->laptop_lid_closed = FALSE;
 }
 
 GreeterBackground*
@@ -594,13 +599,24 @@
         if(config->laptop)
             priv->laptop_monitors = g_slist_prepend(priv->laptop_monitors, monitor);
 
+        if(config->transition.duration && config->transition.func)
+            monitor->transition.config = config->transition;
+
         monitor->background_configured = background_new(&config->bg, monitor, images_cache);
         if(!monitor->background_configured)
             monitor->background_configured = background_new(&DEFAULT_MONITOR_CONFIG.bg, monitor, images_cache);
-        monitor_set_background(monitor, monitor->background_configured);
-
-        if(config->transition.duration && config->transition.func)
-            monitor->transition.config = config->transition;
+
+        Background* background = NULL;
+        if(config->user_bg && priv->customized_background.type != BACKGROUND_TYPE_INVALID)
+            background = background_new(&priv->customized_background, monitor, images_cache);
+
+        if(background)
+        {
+            monitor_set_background(monitor, background);
+            background_unref(&background);
+        }
+		else
+            monitor_set_background(monitor, monitor->background_configured);
 
         if(monitor->name)
             g_hash_table_insert(priv->monitors_map, g_strdup(monitor->name), monitor);
@@ -949,14 +965,16 @@
     g_return_if_fail(GREETER_IS_BACKGROUND(background));
 
     GreeterBackgroundPrivate* priv = background->priv;
+
+    if(priv->customized_background.type != BACKGROUND_TYPE_INVALID)
+        background_config_finalize(&priv->customized_background);
+    background_config_initialize(&priv->customized_background, value);
+
     if(!priv->customized_monitors)
         return;
 
-    BackgroundConfig config;
-    background_config_initialize(&config, value);
-
     GHashTable *images_cache = NULL;
-    if(config.type == BACKGROUND_TYPE_IMAGE)
+    if(priv->customized_background.type == BACKGROUND_TYPE_IMAGE)
         images_cache = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
 
     GSList* iter;
@@ -966,8 +984,8 @@
 
         /* Old background_custom (if used) will be unrefed in monitor_set_background() */
         Background* bg = NULL;
-        if(config.type != BACKGROUND_TYPE_INVALID)
-            bg = background_new(&config, monitor, images_cache);
+        if(priv->customized_background.type != BACKGROUND_TYPE_INVALID)
+            bg = background_new(&priv->customized_background, monitor, images_cache);
         if(bg)
         {
             monitor_set_background(monitor, bg);
@@ -979,8 +997,6 @@
 
     if(images_cache)
         g_hash_table_unref(images_cache);
-    if(config.type != BACKGROUND_TYPE_INVALID)
-        background_config_finalize(&config);
 }
 
 void
@@ -992,7 +1008,6 @@
     cairo_surface_t* surface = create_root_surface(priv->screen);
     cairo_t* cr = cairo_create(surface);
     gsize i;
-    gdouble child_opacity;
 
     const GdkRGBA ROOT_COLOR = {1.0, 1.0, 1.0, 1.0};
     gdk_cairo_set_source_rgba(cr, &ROOT_COLOR);
@@ -1003,32 +1018,10 @@
         const Monitor* monitor = &priv->monitors[i];
         if(!monitor->background)
             continue;
-
-        #ifdef XROOT_DRAW_BACKGROUND_DIRECTLY
-        /* Old method: can't draw default GtkWindow background */
         cairo_save(cr);
         cairo_translate(cr, monitor->geometry.x, monitor->geometry.y);
         monitor_draw_background(monitor, monitor->background, cr);
         cairo_restore(cr);
-        #else
-        /* New - can draw anything, but looks tricky a bit */
-        child_opacity = gtk_widget_get_opacity(priv->child);
-        if(monitor == priv->active_monitor)
-        {
-            gtk_widget_set_opacity(priv->child, 0.0);
-            gdk_window_process_updates(gtk_widget_get_window(GTK_WIDGET(priv->child)), FALSE);
-        }
-
-        gdk_cairo_set_source_window(cr, gtk_widget_get_window(GTK_WIDGET(monitor->window)),
-                                    monitor->geometry.x, monitor->geometry.y);
-        cairo_paint(cr);
-
-        if(monitor == priv->active_monitor)
-        {
-            gtk_widget_set_opacity(priv->child, child_opacity);
-            gdk_window_process_updates(gtk_widget_get_window(GTK_WIDGET(priv->child)), FALSE);
-        }
-        #endif
     }
     set_surface_as_root(priv->screen, surface);
 


Follow ups