diff options
author | Michael Webster <miketwebster@gmail.com> | 2017-10-23 23:13:02 +0200 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2017-10-23 23:26:10 +0200 |
commit | 00030570c0bb5f960f0b8759d3dcd265f6f27376 (patch) | |
tree | 978f230afa88fdaf091120a5fb729298e86de665 /src | |
parent | 3bc7cc65e3c6ac9758e6c84447496d6d91377ac3 (diff) | |
download | arctica-greeter-00030570c0bb5f960f0b8759d3dcd265f6f27376.tar.gz arctica-greeter-00030570c0bb5f960f0b8759d3dcd265f6f27376.tar.bz2 arctica-greeter-00030570c0bb5f960f0b8759d3dcd265f6f27376.zip |
background: Don't realize() this immediately - only start the image gathering thread during initialization.
Wait for the main window
to be realized before passing its cairo surface to the background
object and drawing the background for the first time.
We also need to make sure in our background's size_allocate function
to abort if we're not really active yet (no GdkWindow realized, and
no AnimateTimer yet).
Moved some background init stuff from the main window to the background
class for clarity, and removed the default_background setting - it is
already grabbing the default color in Background's class init.
Obtained (and modified) from the following slick-greeter commits:
d2a7122d731c0f19f502a9efba1feee651bcfa7c
d4a2a94eb7120393bb225b680fdfecf5c1d3c4ea
941ecbc5dcb4e7a072c1ca8816d9678f59a96418
Adaptations by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/background.vala | 96 | ||||
-rw-r--r-- | src/main-window.vala | 21 |
2 files changed, 100 insertions, 17 deletions
diff --git a/src/background.vala b/src/background.vala index 0c722e8..5385805 100644 --- a/src/background.vala +++ b/src/background.vala @@ -394,8 +394,72 @@ public class Background : Gtk.Fixed GRID, } - public string default_background { get; set; default = AGSettings.get_string (AGSettings.KEY_BACKGROUND_COLOR); } - public string? current_background { get; set; default = null; } + /* Fallback bgcolor - shown upon first startup, until an async background loader finishes, + * or until a user background or default background is loaded. + */ + private string _fallback_bgcolor = null; + public string fallback_bgcolor { + get { + if (_fallback_bgcolor == null) + { + var settings_bgcolor = AGSettings.get_string (AGSettings.KEY_BACKGROUND_COLOR); + var color = Gdk.RGBA (); + + if (settings_bgcolor == "" || !color.parse (settings_bgcolor)) + { + settings_bgcolor = "#000000"; + } + + _fallback_bgcolor = settings_bgcolor; + } + + return _fallback_bgcolor; + } + } + + private string _system_background; + public string? system_background { + get { + if (_system_background == null) + { + var system_bg = AGSettings.get_string (AGSettings.KEY_BACKGROUND); + + if (system_bg == "") + { + system_bg = fallback_bgcolor; + } + + _system_background = system_bg; + } + + return _system_background; + } + } + + /* Current background - whatever the background object is or should be showing right now. + * This could be a simple color or a file name - the BackgroundLoader takes care of deciding + * how to deal with it, we just ensure whatever we're sending is valid. + */ + + private string _current_background; + public string? current_background { + get { return _current_background; } + + set { + if (value == null || value == "") + { + _current_background = system_background; + } else + { + _current_background = value; + } + + reload (); + } + + default = fallback_bgcolor; + } + public bool draw_grid { get; set; default = true; } public double alpha { get; private set; default = 1.0; } public Gdk.RGBA average_color { get { return current.average_color; } } @@ -416,17 +480,27 @@ public class Background : Gtk.Fixed private int version_logo_width; private int version_logo_height; - public Background (Cairo.Surface target_surface) + public Background () { - this.target_surface = target_surface; - timer = new AnimateTimer (AnimateTimer.ease_in_out, 700); - timer.animate.connect (animate_cb); + target_surface = null; + timer = null; resize_mode = Gtk.ResizeMode.QUEUE; + draw_grid = AGSettings.get_boolean (AGSettings.KEY_DRAW_GRID); loaders = new HashTable<string?, BackgroundLoader> (str_hash, str_equal); - notify["current-background"].connect (() => { reload (); }); + show (); + } + + public void set_surface (Cairo.Surface target_surface) + { + this.target_surface = target_surface; + + timer = new AnimateTimer (AnimateTimer.ease_in_out, 700); + + set_logo (AGSettings.get_string (AGSettings.KEY_LOGO)); + timer.animate.connect (animate_cb); } public void set_logo (string version_logo) @@ -473,6 +547,12 @@ public class Background : Gtk.Fixed public override void size_allocate (Gtk.Allocation allocation) { + + if(!get_realized()) + { + return; + } + var resized = allocation.height != get_allocated_height () || allocation.width != get_allocated_width (); base.size_allocate (allocation); @@ -594,7 +674,7 @@ public class Background : Gtk.Fixed private BackgroundLoader load_background (string? filename) { if (filename == null) - filename = default_background; + filename = fallback_bgcolor; var b = loaders.lookup (filename); if (b == null) diff --git a/src/main-window.vala b/src/main-window.vala index ac87200..4ffd51f 100644 --- a/src/main-window.vala +++ b/src/main-window.vala @@ -50,15 +50,7 @@ public class MainWindow : Gtk.Window has_resize_grip = false; ArcticaGreeter.add_style_class (this); - realize (); - Gdk.DrawingContext background_context; - background_context = get_window().begin_draw_frame(get_window().get_visible_region()); - background = new Background (background_context.get_cairo_context().get_target()); - background.draw_grid = AGSettings.get_boolean (AGSettings.KEY_DRAW_GRID); - background.default_background = AGSettings.get_string (AGSettings.KEY_BACKGROUND); - background.set_logo (AGSettings.get_string (AGSettings.KEY_LOGO)); - get_window().end_draw_frame(background_context); - background.show (); + background = new Background (); add (background); ArcticaGreeter.add_style_class (background); @@ -207,6 +199,17 @@ public class MainWindow : Gtk.Window menubar.cleanup(); } + public override void realize () + { + base.realize (); + Gdk.DrawingContext background_context; + background_context = get_window().begin_draw_frame(get_window().get_visible_region()); + + background.set_surface (background_context.get_cairo_context().get_target()); + + get_window().end_draw_frame(background_context); + } + private void monitors_changed_cb (Gdk.Screen screen) { Gdk.Display display; |