Hello community, here is the log from the commit of package cinnamon-screensaver for openSUSE:Factory checked in at 2018-10-18 15:35:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cinnamon-screensaver (Old) and /work/SRC/openSUSE:Factory/.cinnamon-screensaver.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cinnamon-screensaver" Thu Oct 18 15:35:56 2018 rev:16 rq:642666 version:3.8.3 Changes: -------- --- /work/SRC/openSUSE:Factory/cinnamon-screensaver/cinnamon-screensaver.changes 2018-07-06 10:43:43.243131553 +0200 +++ /work/SRC/openSUSE:Factory/.cinnamon-screensaver.new/cinnamon-screensaver.changes 2018-10-18 15:36:50.886262910 +0200 @@ -1,0 +2,15 @@ +Wed Oct 17 14:17:51 UTC 2018 - sor.ale...@meowr.ru + +- Update to version 3.8.3: + * CsScreen/stage: Fix coverage changes when plugging in monitors + that may affect scale factor. + * power widget: Ensure widget state is correct when becoming + Active, instead of only updating at the next power state change. + * monitorView: Do not use a transition for the view stack. + * fader: Always run the callback, even if the fade is halted due + to the widget not being mapped. + * stage/screen: During any screen change, resize the stage + backdrop immediately, to try to prevent incomplete coverage. + * Fall back to os.path.expanduser to find the Home directory. + +------------------------------------------------------------------- Old: ---- cinnamon-screensaver-3.8.2.tar.gz New: ---- cinnamon-screensaver-3.8.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cinnamon-screensaver.spec ++++++ --- /var/tmp/diff_new_pack.npbYMA/_old 2018-10-18 15:37:00.994251330 +0200 +++ /var/tmp/diff_new_pack.npbYMA/_new 2018-10-18 15:37:00.998251324 +0200 @@ -12,12 +12,12 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # Name: cinnamon-screensaver -Version: 3.8.2 +Version: 3.8.3 Release: 0 Summary: Cinnamon screensaver and locker License: GPL-2.0-or-later ++++++ cinnamon-screensaver-3.8.2.tar.gz -> cinnamon-screensaver-3.8.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/configure.ac new/cinnamon-screensaver-3.8.3/configure.ac --- old/cinnamon-screensaver-3.8.2/configure.ac 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/configure.ac 2018-10-16 17:35:37.000000000 +0200 @@ -2,7 +2,7 @@ AC_PREREQ(2.60) AC_INIT([cinnamon-screensaver], - [3.8.2], + [3.8.3], [https://github.com/linuxmint/cinnamon-screensaver/issues]) PKG_PROG_PKG_CONFIG([0.26]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/debian/changelog new/cinnamon-screensaver-3.8.3/debian/changelog --- old/cinnamon-screensaver-3.8.2/debian/changelog 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/debian/changelog 2018-10-16 17:35:37.000000000 +0200 @@ -1,3 +1,17 @@ +cinnamon-screensaver (3.8.3) tara; urgency=medium + + [ Michael Webster ] + * CsScreen/stage: Fix coverage changes when plugging in monitors that may affect scale factor. + * power widget: Ensure widget state is correct when becoming Active, instead of only updating at the next power state change. + * monitorView: don't use a transition for the view stack. + * fader: Always run the callback, even if the fade is halted due to the widget not being mapped. + * stage/screen: During any screen change, resize the stage backdrop immediately, to try to prevent incomplete coverage. + + [ Andrew Geng ] + * Fall back to os.path.expanduser to find home dir. (#284) + + -- Clement Lefebvre <r...@linuxmint.com> Tue, 16 Oct 2018 16:35:16 +0100 + cinnamon-screensaver (3.8.2) tara; urgency=medium [ Michael Webster ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/libcscreensaver/cs-screen-x11.c new/cinnamon-screensaver-3.8.3/libcscreensaver/cs-screen-x11.c --- old/cinnamon-screensaver-3.8.2/libcscreensaver/cs-screen-x11.c 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/libcscreensaver/cs-screen-x11.c 2018-10-16 17:35:37.000000000 +0200 @@ -26,8 +26,8 @@ #endif enum { - MONITORS_CHANGED, - SCREEN_CHANGED, + SCREEN_MONITORS_CHANGED, + SCREEN_SIZE_CHANGED, LAST_SIGNAL }; @@ -378,15 +378,19 @@ screen = CS_SCREEN (user_data); + reload_screen_info (screen); + g_signal_emit (screen, signals[SCREEN_SIZE_CHANGED], 0); + gdk_flush (); - old_monitor_infos = screen->monitor_infos; + DEBUG ("CsScreen received 'monitors-changed' signal from GdkScreen\n"); + old_monitor_infos = screen->monitor_infos; reload_monitor_infos (screen); g_free (old_monitor_infos); - g_signal_emit (screen, signals[MONITORS_CHANGED], 0); + g_signal_emit (screen, signals[SCREEN_MONITORS_CHANGED], 0); } static void @@ -396,11 +400,10 @@ screen = CS_SCREEN (user_data); - gdk_flush (); + DEBUG ("CsScreen received 'size-changed' signal from GdkScreen\n"); reload_screen_info (screen); - - g_signal_emit (screen, signals[SCREEN_CHANGED], 0); + g_signal_emit (screen, signals[SCREEN_SIZE_CHANGED], 0); } static void @@ -470,14 +473,14 @@ object_class->finalize = cs_screen_finalize; object_class->dispose = cs_screen_dispose; - signals[MONITORS_CHANGED] = g_signal_new ("monitors-changed", + signals[SCREEN_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", + signals[SCREEN_SIZE_CHANGED] = g_signal_new ("size-changed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, 0, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/src/constants.py new/cinnamon-screensaver-3.8.3/src/constants.py --- old/cinnamon-screensaver-3.8.2/src/constants.py 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/src/constants.py 2018-10-16 17:35:37.000000000 +0200 @@ -18,6 +18,10 @@ # after an idle-activation is canceled. GRAB_RELEASE_TIMEOUT = 1 * 1000 +# Used by powerWidget - the level a battery must be below before the battery icon widget in the infopanel +# will show even when asleep (active but not awake.) +BATTERY_CRITICAL_PERCENT = 20 + # Cinnamon Screensaver SS_SERVICE = "org.cinnamon.ScreenSaver" SS_PATH = "/org/cinnamon/ScreenSaver" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/src/dbusdepot/accountsServiceClient.py new/cinnamon-screensaver-3.8.3/src/dbusdepot/accountsServiceClient.py --- old/cinnamon-screensaver-3.8.2/src/dbusdepot/accountsServiceClient.py 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/src/dbusdepot/accountsServiceClient.py 2018-10-16 17:35:37.000000000 +0200 @@ -35,8 +35,11 @@ def get_face_path(self): face_path = None + home_path = self.service.get_home_dir() + if home_path is None: + home_path = os.path.expanduser('~') - for path in [os.path.join(self.service.get_home_dir(), ".face"), + for path in [os.path.join(home_path, ".face"), self.service.get_icon_file()]: if os.path.exists(path): face_path = path diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/src/infoPanel.py new/cinnamon-screensaver-3.8.3/src/infoPanel.py --- old/cinnamon-screensaver-3.8.2/src/infoPanel.py 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/src/infoPanel.py 2018-10-16 17:35:37.000000000 +0200 @@ -46,6 +46,7 @@ self.power_widget = PowerWidget() self.power_widget.set_no_show_all(True) + self.power_widget.connect("power-state-changed",self.on_power_state_changed) hbox.pack_start(self.power_widget, True, True, 2) self.show_all() @@ -53,6 +54,9 @@ def on_notification_received(self, obj): self.update_revealed() + def on_power_state_changed(self, obj): + self.update_revealed() + def update_revealed(self): """ Determines whether or not to show the panel, depending on: @@ -66,20 +70,22 @@ return do_reveal = False + battery_critical = False self.show_power = self.power_widget.should_show() + if self.show_power: + battery_critical = self.power_widget.battery_critical + self.show_notifications = self.notification_widget.should_show() # Determine if we want to show all the time or only when status.Awake - if status.Awake: if self.show_power or self.show_notifications: do_reveal = True - elif status.Active and not status.PluginRunning: - if self.show_notifications: + elif not status.PluginRunning: + if self.show_notifications or battery_critical: do_reveal = True - if do_reveal: self.power_widget.set_visible(self.show_power) self.notification_widget.set_visible(self.show_notifications) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/src/manager.py new/cinnamon-screensaver-3.8.3/src/manager.py --- old/cinnamon-screensaver-3.8.2/src/manager.py 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/src/manager.py 2018-10-16 17:35:37.000000000 +0200 @@ -262,7 +262,10 @@ if self.stage == None: return - self.stage.refresh() + if status.Debug: + print("manager: queuing stage refresh (login manager reported active?") + + self.stage.queue_refresh_stage() def start_timers(self): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/src/monitorView.py new/cinnamon-screensaver-3.8.3/src/monitorView.py --- old/cinnamon-screensaver-3.8.2/src/monitorView.py 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/src/monitorView.py 2018-10-16 17:35:37.000000000 +0200 @@ -108,8 +108,8 @@ self.update_geometry() self.stack = Gtk.Stack() - self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) - self.stack.set_transition_duration(250) + self.stack.set_transition_type(Gtk.StackTransitionType.NONE) + self.stack.set_transition_duration(0) self.add(self.stack) self.wallpaper_stack = WallpaperStack() @@ -183,9 +183,7 @@ return self.stack.set_visible_child_name("plugin") - trackers.con_tracker_get().connect(self.stack, - "notify::transition-running", - self.notify_transition_callback) + self.emit("current-view-change-complete") def show_wallpaper(self): """ @@ -201,25 +199,7 @@ return self.stack.set_visible_child_name("wallpaper") - trackers.con_tracker_get().connect(self.stack, - "notify::transition-running", - self.notify_transition_callback) - - def notify_transition_callback(self, stack, pspec, data=None): - """ - GtkStacks don't have any signal for telling you 'we're done transitioning' - the closest we can come to it is for every animation tick they call a notify - on the 'transition-running' property. We wait until it returns False - to emit our own transition completed signal. This only works because our - stack here *does* use a duration and transition type that isn't "None". - """ - if stack.get_transition_running(): - return - else: - trackers.con_tracker_get().disconnect(self.stack, - "notify::transition-running", - self.notify_transition_callback) - self.emit("current-view-change-complete") + self.emit("current-view-change-complete") def update_view(self, widget=None, data=None): """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/src/stage.py new/cinnamon-screensaver-3.8.3/src/stage.py --- old/cinnamon-screensaver-3.8.2/src/stage.py 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/src/stage.py 2018-10-16 17:35:37.000000000 +0200 @@ -67,6 +67,8 @@ self.audio_panel = None self.info_panel = None + self.stage_refresh_id = 0 + self.floaters = [] self.event_handler = EventHandler(manager) @@ -144,32 +146,63 @@ print("Problem updating monitor views views: %s" % str(e)) def on_screen_size_changed(self, screen, data=None): - if status.Debug: - print("Stage: Received screen changed signal, updating backdrop") + """ + The screen changing size should be acted upon immediately, to ensure coverage. + Wallpapers and plugins are secondary. + """ - Gdk.flush() + if status.Debug: + print("Stage: Received screen size-changed signal, refreshing stage") self.update_geometry() self.move_onscreen() - self.overlay.queue_resize() + def on_monitors_changed(self, screen, data=None): + """ + Updating monitors also will trigger an immediate stage coverage update (same + as on_screen_size_changed), and follow up at idle with actual monitor view + refreshes (wallpapers/plugins.) + """ if status.Debug: - print("Stage: Received screen monitors-changed signal, updating monitor views") + print("Stage: Received screen monitors-changed signal, refreshing stage") + + self.update_geometry() + self.move_onscreen() + self.overlay.queue_resize() Gdk.flush() - self.update_monitors() - self.overlay.queue_resize() + self.queue_refresh_stage() def on_grab_broken_event(self, widget, event, data=None): GObject.idle_add(self.manager.grab_stage) return False - def refresh(self): + def queue_refresh_stage(self): + """ + Queues a complete refresh of the stage, resizing the screen if necessary, + reconstructing the individual monitor objects, etc... + """ + if self.stage_refresh_id > 0: + GObject.source_remove(self.stage_refresh_id) + self.stage_refresh_id = 0 + + self.stage_refresh_id = GObject.idle_add(self._update_full_stage_on_idle) + + def _update_full_stage_on_idle(self, data=None): + self.stage_refresh_id = 0 + + self._refresh() + + return False + + def _refresh(self): Gdk.flush() + if status.Debug: + print("Stage: refresh callback") self.update_geometry() self.move_onscreen() @@ -231,6 +264,14 @@ self.gdk_filter.start(self) def move_onscreen(self): + w = self.get_window() + + if w: + w.move_resize(self.rect.x, + self.rect.y, + self.rect.width, + self.rect.height) + self.move(self.rect.x, self.rect.y) self.resize(self.rect.width, self.rect.height) @@ -535,6 +576,8 @@ self.info_panel = InfoPanel() self.add_child_widget(self.info_panel) + self.info_panel.update_revealed() + def queue_dialog_key_event(self, event): """ Sent from our EventHandler via the ScreensaverManager, this catches @@ -732,8 +775,12 @@ Updates all of our MonitorViews based on the power or Awake states. """ + if not status.Awake: if (not status.shouldShowPlugin()): + if status.Debug: + if settings.should_show_plugin(): + print("Stage: plugin configured but disabling because we're on battery") 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(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/src/util/fader.py new/cinnamon-screensaver-3.8.3/src/util/fader.py --- old/cinnamon-screensaver-3.8.2/src/util/fader.py 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/src/util/fader.py 2018-10-16 17:35:37.000000000 +0200 @@ -48,6 +48,8 @@ self.tick_id = self.widget.add_tick_callback(self._on_frame_tick_fade_in) self._fade_in_step(self.start_time) + else: + self.finished_cb() return GLib.SOURCE_REMOVE @@ -64,6 +66,8 @@ self.tick_id = self.widget.add_tick_callback(self._on_frame_tick_fade_out) self._fade_out_step(self.start_time) + else: + self.finished_cb() return GLib.SOURCE_REMOVE diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cinnamon-screensaver-3.8.2/src/widgets/powerWidget.py new/cinnamon-screensaver-3.8.3/src/widgets/powerWidget.py --- old/cinnamon-screensaver-3.8.2/src/widgets/powerWidget.py 2018-06-08 12:38:11.000000000 +0200 +++ new/cinnamon-screensaver-3.8.3/src/widgets/powerWidget.py 2018-10-16 17:35:37.000000000 +0200 @@ -4,6 +4,7 @@ from util import trackers import singletons +import constants as c class PowerWidget(Gtk.Frame): """ @@ -29,6 +30,8 @@ self.power_client = singletons.UPowerClient + self.battery_critical = False + trackers.con_tracker_get().connect(self.power_client, "power-state-changed", self.on_power_state_changed) @@ -39,11 +42,14 @@ self.power_client.rescan_devices() + self.on_power_state_changed(self.power_client) + def on_power_state_changed(self, client): for widget in self.box.get_children(): widget.destroy() self.path_widget_pairs = [] + self.battery_critical = False self.construct_icons() @@ -81,6 +87,8 @@ if pct > 0: text = _("%d%%" % pct) + if pct < c.BATTERY_CRITICAL_PERCENT: + self.battery_critical = True except Exception as e: pass