diff -Nru cinnamon-screensaver-3.4.1/configure.ac cinnamon-screensaver-3.4.2/configure.ac --- cinnamon-screensaver-3.4.1/configure.ac 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/configure.ac 2017-08-08 11:14:01.000000000 +0000 @@ -2,7 +2,7 @@ AC_PREREQ(2.60) AC_INIT([cinnamon-screensaver], - [3.4.1], + [3.4.2], [https://github.com/linuxmint/cinnamon-screensaver/issues]) PKG_PROG_PKG_CONFIG([0.26]) diff -Nru cinnamon-screensaver-3.4.1/debian/changelog cinnamon-screensaver-3.4.2/debian/changelog --- cinnamon-screensaver-3.4.1/debian/changelog 2017-06-26 14:24:12.000000000 +0000 +++ cinnamon-screensaver-3.4.2/debian/changelog 2017-08-22 11:56:18.000000000 +0000 @@ -1,8 +1,19 @@ -cinnamon-screensaver (3.4.1-1~zesty0) zesty; urgency=medium +cinnamon-screensaver (3.4.2-1~zesty0) zesty; urgency=medium * Package version bump to avoid release clash on Launchpad. - -- embrosyn Mon, 26 Jun 2017 16:24:12 +0200 + -- embrosyn Tue, 22 Aug 2017 13:56:18 +0200 + +cinnamon-screensaver (3.4.2) zesty; urgency=medium + + [ Michael Webster ] + * add an issue template + * CsScreen: Fix hotplug/screen change detection and response, other issues. + * logindClient.py: Produce a more helpful message when logind is running, but we're unable to figure out a valid session id. + * manager/stage: Allow a second activation trigger to override a previous. + * manager.py: Force secondary activations to be immediate. (prevents flash) + + -- Clement Lefebvre Tue, 08 Aug 2017 13:11:48 +0200 cinnamon-screensaver (3.4.1) zesty; urgency=medium diff -Nru cinnamon-screensaver-3.4.1/.github/ISSUE_TEMPLATE.md cinnamon-screensaver-3.4.2/.github/ISSUE_TEMPLATE.md --- cinnamon-screensaver-3.4.1/.github/ISSUE_TEMPLATE.md 1970-01-01 00:00:00.000000000 +0000 +++ cinnamon-screensaver-3.4.2/.github/ISSUE_TEMPLATE.md 2017-08-08 11:14:01.000000000 +0000 @@ -0,0 +1,21 @@ + +``` + * Cinnamon-Screensaver version (cinnamon-screensaver --version) + * Distribution - (Mint 17.2, Arch, Fedora 25, etc...) + * Graphics hardware *and* driver used + * 32 or 64 bit + ``` + +**Issue** + + + +**Steps to reproduce** + + + +**Expected behaviour** + + + +**Other information** diff -Nru cinnamon-screensaver-3.4.1/libcscreensaver/cs-screen.h cinnamon-screensaver-3.4.2/libcscreensaver/cs-screen.h --- cinnamon-screensaver-3.4.1/libcscreensaver/cs-screen.h 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/libcscreensaver/cs-screen.h 2017-08-08 11:14:01.000000000 +0000 @@ -40,8 +40,6 @@ gulong monitors_changed_id; gulong screen_size_changed_id; - - guint idle_changed_id; } CsScreen; typedef struct diff -Nru cinnamon-screensaver-3.4.1/libcscreensaver/cs-screen-x11.c cinnamon-screensaver-3.4.2/libcscreensaver/cs-screen-x11.c --- cinnamon-screensaver-3.4.1/libcscreensaver/cs-screen-x11.c 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/libcscreensaver/cs-screen-x11.c 2017-08-08 11:14:01.000000000 +0000 @@ -26,7 +26,8 @@ #endif enum { - CHANGED, + MONITORS_CHANGED, + SCREEN_CHANGED, LAST_SIGNAL }; @@ -39,6 +40,8 @@ #define cs_XFree(p) do { if ((p)) XFree ((p)); } while (0) +#define PRIMARY_MONITOR 0 + static gboolean cs_rectangle_equal (const GdkRectangle *src1, const GdkRectangle *src2) @@ -196,7 +199,7 @@ * primary. */ - screen->primary_monitor_index = 0; + screen->primary_monitor_index = PRIMARY_MONITOR; #ifdef HAVE_XFREE_XINERAMA @@ -353,7 +356,7 @@ apply_scale_factor (screen->monitor_infos, screen->n_monitor_infos, - gdk_screen_get_monitor_scale_factor (screen->gdk_screen, 0)); + gdk_screen_get_monitor_scale_factor (screen->gdk_screen, PRIMARY_MONITOR)); g_assert (screen->n_monitor_infos > 0); g_assert (screen->monitor_infos != NULL); @@ -363,45 +366,46 @@ reload_screen_info (CsScreen *screen) { Screen *xscreen; + gint scale_factor; xscreen = gdk_x11_screen_get_xscreen (screen->gdk_screen); screen->rect.x = screen->rect.y = 0; screen->rect.width = WidthOfScreen (xscreen); screen->rect.height = HeightOfScreen (xscreen); + + scale_factor = gdk_screen_get_monitor_scale_factor (screen->gdk_screen, PRIMARY_MONITOR); + screen->rect.width /= scale_factor; + screen->rect.height /= scale_factor; } -static gboolean -on_screen_changed_idle (gpointer user_data) +static void +on_monitors_changed (GdkScreen *gdk_screen, gpointer user_data) { CsMonitorInfo *old_monitor_infos; + CsScreen *screen; - CsScreen *screen = CS_SCREEN (user_data); - - reload_screen_info (screen); + screen = CS_SCREEN (user_data); old_monitor_infos = screen->monitor_infos; + reload_monitor_infos (screen); - g_free (old_monitor_infos); - g_signal_emit (screen, signals[CHANGED], 0); + g_free (old_monitor_infos); - screen->idle_changed_id = 0; - return FALSE; + g_signal_emit (screen, signals[MONITORS_CHANGED], 0); } static void on_screen_changed (GdkScreen *gdk_screen, gpointer user_data) { - CsScreen *screen = CS_SCREEN (user_data); + CsScreen *screen; - if (screen->idle_changed_id > 0) - { - g_source_remove (screen->idle_changed_id); - screen->idle_changed_id = 0; - } + screen = CS_SCREEN (user_data); + + reload_screen_info (screen); - g_idle_add ((GSourceFunc) on_screen_changed_idle, screen); + g_signal_emit (screen, signals[SCREEN_CHANGED], 0); } static void @@ -409,7 +413,7 @@ { screen->gdk_screen = gdk_screen_get_default (); - screen->monitors_changed_id = g_signal_connect (screen->gdk_screen, "monitors-changed", G_CALLBACK (on_screen_changed), screen); + screen->monitors_changed_id = g_signal_connect (screen->gdk_screen, "monitors-changed", G_CALLBACK (on_monitors_changed), screen); screen->screen_size_changed_id = g_signal_connect (screen->gdk_screen, "size-changed", G_CALLBACK (on_screen_changed), screen); reload_screen_info (screen); @@ -426,6 +430,26 @@ screen = CS_SCREEN (object); + if (screen->monitor_infos) + { + g_free (screen->monitor_infos); + } + + DEBUG ("CsScreen finalize\n"); + + G_OBJECT_CLASS (cs_screen_parent_class)->finalize (object); +} + +static void +cs_screen_dispose (GObject *object) +{ + CsScreen *screen; + + g_return_if_fail (object != NULL); + g_return_if_fail (CS_IS_SCREEN (object)); + + screen = CS_SCREEN (object); + if (screen->monitors_changed_id > 0) { g_signal_handler_disconnect (screen->gdk_screen, screen->monitors_changed_id); @@ -438,12 +462,9 @@ screen->screen_size_changed_id = 0; } - if (screen->monitor_infos) - { - g_free (screen->monitor_infos); - } + DEBUG ("CsScreen dispose\n"); - G_OBJECT_CLASS (cs_screen_parent_class)->finalize (object); + G_OBJECT_CLASS (cs_screen_parent_class)->dispose (object); } static void @@ -452,13 +473,21 @@ GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = cs_screen_finalize; + object_class->dispose = cs_screen_dispose; - signals[CHANGED] = g_signal_new ("changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, NULL, - G_TYPE_NONE, 0); + signals[MONITORS_CHANGED] = g_signal_new ("monitors-changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); + + signals[SCREEN_CHANGED] = g_signal_new ("size-changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); } CsScreen * @@ -468,8 +497,7 @@ debug_mode = debug; - result = g_object_new (CS_TYPE_SCREEN, - NULL); + result = g_object_new (CS_TYPE_SCREEN, NULL); return CS_SCREEN (result); } @@ -491,7 +519,10 @@ g_return_if_fail (monitor >= 0 && monitor < screen->n_monitor_infos); g_return_if_fail (geometry != NULL); - *geometry = screen->monitor_infos[monitor].rect; + geometry->x = screen->monitor_infos[monitor].rect.x; + geometry->y = screen->monitor_infos[monitor].rect.y; + geometry->width = screen->monitor_infos[monitor].rect.width; + geometry->height = screen->monitor_infos[monitor].rect.height; } /** @@ -508,7 +539,10 @@ g_return_if_fail (CS_IS_SCREEN (screen)); g_return_if_fail (geometry != NULL); - *geometry = screen->rect; + geometry->x = screen->rect.x; + geometry->y = screen->rect.y; + geometry->width = screen->rect.width; + geometry->height = screen->rect.height; } /** diff -Nru cinnamon-screensaver-3.4.1/src/albumArt.py cinnamon-screensaver-3.4.2/src/albumArt.py --- cinnamon-screensaver-3.4.1/src/albumArt.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/albumArt.py 2017-08-08 11:14:01.000000000 +0000 @@ -20,9 +20,8 @@ using a timer which randomizes its halign and valign properties as well as its current monitor. """ - def __init__(self, screen, away_message=None, initial_monitor=0): + def __init__(self, away_message=None, initial_monitor=0): super(AlbumArt, self).__init__(initial_monitor) - self.screen = screen self.get_style_context().add_class("albumart") self.set_halign(Gtk.Align.END) diff -Nru cinnamon-screensaver-3.4.1/src/audioPanel.py cinnamon-screensaver-3.4.2/src/audioPanel.py --- cinnamon-screensaver-3.4.1/src/audioPanel.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/audioPanel.py 2017-08-08 11:14:01.000000000 +0000 @@ -6,9 +6,10 @@ from volumeControl import VolumeControl from playerControl import PlayerControl from util import utils, settings +import status class AudioPanel(BaseWindow): - def __init__(self, screen): + def __init__(self): """ Upper left panel - only shows when Awake. Will always show the volume slider, and will only show the player controls if there is @@ -17,8 +18,7 @@ super(AudioPanel, self).__init__() self.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN) - self.screen = screen - self.monitor_index = self.screen.get_primary_monitor() + self.monitor_index = status.screen.get_primary_monitor() self.update_geometry() @@ -47,4 +47,4 @@ if should_show: self.show_all() else: - self.disabled = True \ No newline at end of file + self.disabled = True diff -Nru cinnamon-screensaver-3.4.1/src/baseWindow.py cinnamon-screensaver-3.4.2/src/baseWindow.py --- cinnamon-screensaver-3.4.1/src/baseWindow.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/baseWindow.py 2017-08-08 11:14:01.000000000 +0000 @@ -63,6 +63,6 @@ def update_geometry(self): if status.Spanned: - self.rect = self.screen.get_screen_geometry() + self.rect = status.screen.get_screen_geometry() else: - self.rect = self.screen.get_monitor_geometry(self.monitor_index) \ No newline at end of file + self.rect = status.screen.get_monitor_geometry(self.monitor_index) diff -Nru cinnamon-screensaver-3.4.1/src/clock.py cinnamon-screensaver-3.4.2/src/clock.py --- cinnamon-screensaver-3.4.1/src/clock.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/clock.py 2017-08-08 11:14:01.000000000 +0000 @@ -17,9 +17,8 @@ using a timer which randomizes its halign and valign properties as well as its current monitor. """ - def __init__(self, screen, away_message=None, initial_monitor=0): + def __init__(self, away_message=None, initial_monitor=0): super(ClockWidget, self).__init__(initial_monitor) - self.screen = screen self.get_style_context().add_class("clock") self.set_halign(Gtk.Align.START) diff -Nru cinnamon-screensaver-3.4.1/src/dbusdepot/logindClient.py cinnamon-screensaver-3.4.2/src/dbusdepot/logindClient.py --- cinnamon-screensaver-3.4.1/src/dbusdepot/logindClient.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/dbusdepot/logindClient.py 2017-08-08 11:14:01.000000000 +0000 @@ -50,6 +50,11 @@ if id_suffix != "": self.session_id = "/org/freedesktop/login1/session/%s" % (id_suffix,) print("found session: %s" % (id_suffix,)) + else: + print("Could not construct a valid ID for Logind session. Is XDG_SESSION_ID set?") + self.session_proxy = None + self.on_failure() + return try: self.session_proxy = CScreensaver.LogindSessionProxy.new_for_bus(Gio.BusType.SYSTEM, @@ -81,4 +86,4 @@ self.emit("active") def on_failure(self, *args): - self.emit("startup-status", False) \ No newline at end of file + self.emit("startup-status", False) diff -Nru cinnamon-screensaver-3.4.1/src/floating.py cinnamon-screensaver-3.4.2/src/floating.py --- cinnamon-screensaver-3.4.1/src/floating.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/floating.py 2017-08-08 11:14:01.000000000 +0000 @@ -2,6 +2,7 @@ from gi.repository import Gtk import random +import status from util import trackers from util import settings @@ -54,9 +55,9 @@ self.set_halign(Gtk.Align(horizontal)) self.set_valign(Gtk.Align(vertical)) - if self.screen.get_n_monitors() > 1: + if status.screen.get_n_monitors() > 1: new_monitor = self.current_monitor - n = self.screen.get_n_monitors() + n = status.screen.get_n_monitors() while new_monitor == self.current_monitor: new_monitor = random.randint(0, n - 1) diff -Nru cinnamon-screensaver-3.4.1/src/infoPanel.py cinnamon-screensaver-3.4.2/src/infoPanel.py --- cinnamon-screensaver-3.4.1/src/infoPanel.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/infoPanel.py 2017-08-08 11:14:01.000000000 +0000 @@ -15,12 +15,11 @@ relevant to say, regardless of our Awake state (*except* when a plugin is running, due to graphical issues.) """ - def __init__(self, screen): + def __init__(self): super(InfoPanel, self).__init__() self.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN) - self.screen = screen - self.monitor_index = self.screen.get_primary_monitor() + self.monitor_index = status.screen.get_primary_monitor() self.update_geometry() diff -Nru cinnamon-screensaver-3.4.1/src/manager.py cinnamon-screensaver-3.4.2/src/manager.py --- cinnamon-screensaver-3.4.1/src/manager.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/manager.py 2017-08-08 11:14:01.000000000 +0000 @@ -95,7 +95,13 @@ transition = 0 else: transition = c.STAGE_SPAWN_TRANSITION + self.spawn_stage(msg, transition, self.on_spawn_stage_complete) + else: + transition = 0 + + self.stage.transition_in(transition, self.on_spawn_stage_complete) + self.stage.set_message(msg) return True else: status.Active = False diff -Nru cinnamon-screensaver-3.4.1/src/monitorView.py cinnamon-screensaver-3.4.2/src/monitorView.py --- cinnamon-screensaver-3.4.1/src/monitorView.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/monitorView.py 2017-08-08 11:14:01.000000000 +0000 @@ -98,10 +98,9 @@ __gsignals__ = { 'current-view-change-complete': (GObject.SignalFlags.RUN_LAST, None, ()), } - def __init__(self, screen, index): + def __init__(self, index): super(MonitorView, self).__init__() - self.screen = screen self.monitor_index = index self.proc = None diff -Nru cinnamon-screensaver-3.4.1/src/passwordEntry.py cinnamon-screensaver-3.4.2/src/passwordEntry.py --- cinnamon-screensaver-3.4.1/src/passwordEntry.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/passwordEntry.py 2017-08-08 11:14:01.000000000 +0000 @@ -177,6 +177,8 @@ self.update_saved_group(self.keyboard_controller.get_current_group()) def on_destroy(self, widget, data=None): + self.stop_progress() + trackers.con_tracker_get().disconnect(self.keyboard_controller, "config-changed", self.on_config_changed) @@ -235,4 +237,4 @@ Gtk.Widget.grab_focus(self) length = self.get_buffer().get_length() - self.select_region(length, -1) \ No newline at end of file + self.select_region(length, -1) diff -Nru cinnamon-screensaver-3.4.1/src/stage.py cinnamon-screensaver-3.4.2/src/stage.py --- cinnamon-screensaver-3.4.1/src/stage.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/stage.py 2017-08-08 11:14:01.000000000 +0000 @@ -55,7 +55,7 @@ self.destroying = False self.manager = manager - self.screen = CScreensaver.Screen.new(status.Debug) + status.screen = CScreensaver.Screen.new(status.Debug) self.away_message = away_message self.monitors = [] @@ -118,9 +118,13 @@ # For instance: Chrome and Firefox native notifications. self.gdk_filter = CScreensaver.GdkEventFilter() - trackers.con_tracker_get().connect(self.screen, - "changed", - self.on_screen_changed) + trackers.con_tracker_get().connect(status.screen, + "size-changed", + self.on_screen_size_changed) + + trackers.con_tracker_get().connect(status.screen, + "monitors-changed", + self.on_monitors_changed) trackers.con_tracker_get().connect(self, "grab-broken-event", @@ -129,12 +133,21 @@ if status.InteractiveDebug: self.set_interactive_debugging(True) - def on_screen_changed(self, screen, data=None): + def on_screen_size_changed(self, screen, data=None): self.update_geometry() self.move_onscreen() - for monitor in self.monitors: - monitor.update_geometry() + self.overlay.queue_resize() + + def on_monitors_changed(self, screen, data=None): + self.destroy_monitor_views() + + try: + self.setup_monitors() + for monitor in self.monitors: + self.sink_child_widget(monitor) + except Exception as e: + print("Problem setting up monitor views during monitor change event: %s" % str(e)) self.overlay.queue_resize() @@ -147,6 +160,10 @@ """ This is the primary way of making the Stage visible. """ + + # Cancel any existing transition + self.fader.cancel() + if effect_time == 0: self.set_opacity(1.0) self.move_onscreen() @@ -264,12 +281,14 @@ try: if self.clock_widget != None: + self.clock_widget.stop_positioning() self.clock_widget.destroy() except Exception as e: print(e) try: if self.albumart_widget != None: + self.albumart_widget.stop_positioning() self.albumart_widget.destroy() except Exception as e: print(e) @@ -322,9 +341,15 @@ self.gdk_filter.stop() self.gdk_filter = None - trackers.con_tracker_get().disconnect(self.screen, - "changed", - self.on_screen_changed) + trackers.con_tracker_get().disconnect(status.screen, + "size-changed", + self.on_screen_size_changed) + + trackers.con_tracker_get().disconnect(status.screen, + "monitors-changed", + self.on_monitors_changed) + + status.screen = None self.destroy() @@ -337,15 +362,15 @@ status.Spanned = settings.bg_settings.get_enum("picture-options") == CDesktopEnums.BackgroundStyle.SPANNED if status.InteractiveDebug or status.Spanned: - monitors = (self.screen.get_primary_monitor(),) + monitors = (status.screen.get_primary_monitor(),) else: - n = self.screen.get_n_monitors() + n = status.screen.get_n_monitors() monitors = () for i in range(n): monitors += (i,) for index in monitors: - monitor = MonitorView(self.screen, index) + monitor = MonitorView(index) image = Gtk.Image() @@ -409,7 +434,7 @@ Initially invisible, regardless - its visibility is controlled via its own positioning timer. """ - self.clock_widget = ClockWidget(self.screen, self.away_message, self.screen.get_mouse_monitor()) + self.clock_widget = ClockWidget(self.away_message, status.screen.get_mouse_monitor()) self.add_child_widget(self.clock_widget) self.floaters.append(self.clock_widget) @@ -427,7 +452,7 @@ Initially invisible, regardless - its visibility is controlled via its own positioning timer. """ - self.albumart_widget = AlbumArt(self.screen, self.away_message, self.screen.get_mouse_monitor()) + self.albumart_widget = AlbumArt(None, status.screen.get_mouse_monitor()) self.add_child_widget(self.albumart_widget) self.floaters.append(self.clock_widget) @@ -478,10 +503,10 @@ """ Constructs the AudioPanel and InfoPanel and adds them to the overlay. """ - self.audio_panel = AudioPanel(self.screen) + self.audio_panel = AudioPanel() self.add_child_widget(self.audio_panel) - self.info_panel = InfoPanel(self.screen) + self.info_panel = InfoPanel() self.add_child_widget(self.info_panel) def queue_dialog_key_event(self, event): @@ -682,19 +707,19 @@ or Awake states. """ low_power = not self.power_client.plugged_in - - if (not settings.should_show_plugin()) or (settings.should_show_plugin() and low_power): - if self.clock_widget != None and settings.get_show_clock(): - self.clock_widget.start_positioning() - if self.albumart_widget != None and settings.get_show_albumart(): - self.albumart_widget.start_positioning() - else: - if self.clock_widget != None: - self.clock_widget.stop_positioning() - self.clock_widget.hide() - if self.albumart_widget != None: - self.albumart_widget.stop_positioning() - self.albumart_widget.hide() + if not status.Awake: + if (not settings.should_show_plugin()) or (settings.should_show_plugin() and low_power): + if self.clock_widget != None and settings.get_show_clock(): + self.clock_widget.start_positioning() + if self.albumart_widget != None and settings.get_show_albumart(): + self.albumart_widget.start_positioning() + else: + if self.clock_widget != None: + self.clock_widget.stop_positioning() + self.clock_widget.hide() + if self.albumart_widget != None: + self.albumart_widget.stop_positioning() + self.albumart_widget.hide() for monitor in self.monitors: monitor.update_view(status.Awake, low_power) @@ -736,10 +761,10 @@ """ if status.InteractiveDebug: - monitor_n = self.screen.get_primary_monitor() - self.rect = self.screen.get_monitor_geometry(monitor_n) + monitor_n = status.screen.get_primary_monitor() + self.rect = status.screen.get_monitor_geometry(monitor_n) else: - self.rect = self.screen.get_screen_geometry() + self.rect = status.screen.get_screen_geometry() hints = Gdk.Geometry() hints.min_width = self.rect.width @@ -755,16 +780,16 @@ def get_mouse_monitor(self): if status.InteractiveDebug: - return self.screen.get_primary_monitor() + return status.screen.get_primary_monitor() else: - return self.screen.get_mouse_monitor() + return status.screen.get_mouse_monitor() def maybe_update_layout(self): """ Called on all user events, moves widgets to the currently focused monitor if it changes (whichever monitor the mouse is in) """ - current_focus_monitor = self.screen.get_mouse_monitor() + current_focus_monitor = status.screen.get_mouse_monitor() if self.last_focus_monitor == -1: self.last_focus_monitor = current_focus_monitor @@ -780,6 +805,12 @@ """ self.overlay.add_overlay(widget) + def sink_child_widget(self, widget): + """ + Move a child to the bottom of the overlay + """ + self.overlay.reorder_overlay(widget, 0) + def position_overlay_child(self, overlay, child, allocation): """ Callback for our GtkOverlay, think of this as a mini- @@ -814,8 +845,8 @@ UnlockDialog always shows on the currently focused monitor (the one the mouse is currently in), and is kept centered. """ - monitor = self.screen.get_mouse_monitor() - monitor_rect = self.screen.get_monitor_geometry(monitor) + monitor = status.screen.get_mouse_monitor() + monitor_rect = status.screen.get_monitor_geometry(monitor) min_rect, nat_rect = child.get_preferred_size() @@ -840,11 +871,11 @@ min_rect, nat_rect = child.get_preferred_size() if status.Awake: - current_monitor = self.screen.get_mouse_monitor() + current_monitor = status.screen.get_mouse_monitor() else: current_monitor = child.current_monitor - monitor_rect = self.screen.get_monitor_geometry(current_monitor) + monitor_rect = status.screen.get_monitor_geometry(current_monitor) region_w = monitor_rect.width / 3 region_h = monitor_rect.height / 3 @@ -927,8 +958,8 @@ min_rect, nat_rect = child.get_preferred_size() if status.Awake: - current_monitor = self.screen.get_mouse_monitor() - monitor_rect = self.screen.get_monitor_geometry(current_monitor) + current_monitor = status.screen.get_mouse_monitor() + monitor_rect = status.screen.get_monitor_geometry(current_monitor) allocation.x = monitor_rect.x allocation.y = monitor_rect.y allocation.width = nat_rect.width @@ -952,8 +983,8 @@ min_rect, nat_rect = child.get_preferred_size() if status.Awake: - current_monitor = self.screen.get_mouse_monitor() - monitor_rect = self.screen.get_monitor_geometry(current_monitor) + current_monitor = status.screen.get_mouse_monitor() + monitor_rect = status.screen.get_monitor_geometry(current_monitor) allocation.x = monitor_rect.x + monitor_rect.width - nat_rect.width allocation.y = monitor_rect.y allocation.width = nat_rect.width diff -Nru cinnamon-screensaver-3.4.1/src/status.py cinnamon-screensaver-3.4.2/src/status.py --- cinnamon-screensaver-3.4.1/src/status.py 2017-06-20 13:40:52.000000000 +0000 +++ cinnamon-screensaver-3.4.2/src/status.py 2017-08-08 11:14:01.000000000 +0000 @@ -28,3 +28,5 @@ # If the wallpaper aspect is 'spanned' we will only create one MonitorView and manage it slightly # differently. This is an easy place to keep track of that. This is set in singletons.py. Spanned = False + +screen = None