Blob Blame History Raw
From 2b96fb31c8f1a00e2309fe6f7d6f31a2da5b0639 Mon Sep 17 00:00:00 2001
From: Michael Webster <miketwebster@gmail.com>
Date: Sun, 8 Jan 2017 23:33:03 -0500
Subject: [PATCH 1/4] Add --interactive-debug startup switch.  This turns on
 GtkInspector, restricts the screensaver stage to a single monitor, and some
 other things to allow interaction with ui elements using the inspector tools.

---
 src/cinnamon-screensaver-gtk3.20.css |  8 ++++--
 src/cinnamon-screensaver-main.py     |  3 ++
 src/stage.py                         | 54 +++++++++++++++++++++++++++---------
 src/status.py                        |  7 ++++-
 src/util/utils.py                    | 17 +++++++-----
 5 files changed, 65 insertions(+), 24 deletions(-)

diff --git a/src/cinnamon-screensaver-gtk3.20.css b/src/cinnamon-screensaver-gtk3.20.css
index cd56570..f3c22ae 100644
--- a/src/cinnamon-screensaver-gtk3.20.css
+++ b/src/cinnamon-screensaver-gtk3.20.css
@@ -64,7 +64,7 @@
 }
 
 .csstage .passwordentry {
-    font-size: 11px;
+    font-size: 15px;
     box-shadow: none;
     border-color: alpha(white, .2);
     border-style: solid;
@@ -72,6 +72,8 @@
     background-image: none;
     background-color: transparent;
     border-width: 1px;
+    padding: 0 0 0 5px;
+    box-shadow: none;
 }
 
 .csstage .passwordentry.progressbar {
@@ -86,8 +88,8 @@
     background-color: transparent;
 }
 
-.csstage .passwordentry.image.left {
-    padding: 0 10px 0 0;
+.csstage .passwordentry image.left {
+    padding-right: 10px;
 }
 
 .csstage .transparentbutton {
diff --git a/src/cinnamon-screensaver-main.py b/src/cinnamon-screensaver-main.py
index a6df413..e56a9c0 100755
--- a/src/cinnamon-screensaver-main.py
+++ b/src/cinnamon-screensaver-main.py
@@ -31,6 +31,8 @@ class Main:
         parser = argparse.ArgumentParser(description='Cinnamon Screensaver')
         parser.add_argument('--debug', dest='debug', action='store_true',
                             help='Print out some extra debugging info')
+        parser.add_argument('--interactive-debug', dest='interactive', action='store_true',
+                            help='If multiple monitors are in use, only cover one monitor, and launch GtkInspector')
         parser.add_argument('--disable-locking', dest='lock_disabled', action='store_true',
                             help='Disable the lock screen')
         parser.add_argument('--version', dest='version', action='store_true',
@@ -45,6 +47,7 @@ class Main:
 
         status.LockEnabled = not args.lock_disabled
         status.Debug = args.debug
+        status.InteractiveDebug = args.interactive
 
         if args.lock_disabled:
             print("Locking disabled")
diff --git a/src/stage.py b/src/stage.py
index 560b9b3..fba0aa1 100644
--- a/src/stage.py
+++ b/src/stage.py
@@ -32,10 +32,16 @@ class Stage(Gtk.Window):
     ScreensaverManager.
     """
     def __init__(self, screen, manager, away_message):
-        Gtk.Window.__init__(self,
-                            type=Gtk.WindowType.POPUP,
-                            decorated=False,
-                            skip_taskbar_hint=True)
+        if status.InteractiveDebug:
+            Gtk.Window.__init__(self,
+                                type=Gtk.WindowType.TOPLEVEL,
+                                decorated=True,
+                                skip_taskbar_hint=False)
+        else:
+            Gtk.Window.__init__(self,
+                                type=Gtk.WindowType.POPUP,
+                                decorated=False,
+                                skip_taskbar_hint=True)
 
         self.get_style_context().add_class("csstage")
 
@@ -116,6 +122,9 @@ class Stage(Gtk.Window):
                                            "grab-broken-event",
                                            self.on_grab_broken_event)
 
+        if status.InteractiveDebug:
+            self.set_interactive_debugging(True)
+
     def on_screen_changed(self, screen, data=None):
         self.update_geometry()
         self.size_to_screen()
@@ -245,9 +254,15 @@ class Stage(Gtk.Window):
         """
         self.monitors = []
 
-        n = self.screen.get_n_monitors()
+        if status.InteractiveDebug:
+            monitors = (self.screen.get_primary_monitor(),)
+        else:
+            n = self.screen.get_n_monitors()
+            monitors = ()
+            for i in range(n):
+                monitors += (i,)
 
-        for index in range(n):
+        for index in monitors:
             monitor = MonitorView(self.screen, index)
 
             image = Gtk.Image()
@@ -415,7 +430,7 @@ class Stage(Gtk.Window):
         """
         Start or stop the dialog timer
         """
-        if active:
+        if active and not status.InteractiveDebug:
             trackers.timer_tracker_get().start("wake-timeout",
                                                c.UNLOCK_TIMEOUT * 1000,
                                                self.on_wake_timeout)
@@ -620,13 +635,26 @@ class Stage(Gtk.Window):
     def update_geometry(self):
         """
         Override BaseWindow.update_geometry() - the Stage should always be the
-        GdkScreen size
+        GdkScreen size, unless status.InteractiveDebug is True
         """
-        self.rect = Gdk.Rectangle()
-        self.rect.x = 0
-        self.rect.y = 0
-        self.rect.width = self.screen.get_width()
-        self.rect.height = self.screen.get_height()
+
+        if status.InteractiveDebug:
+            # Gdk 3.22 introduces GdkMonitor objects, and GdkScreen-reported
+            # monitor info is no-longer reliable
+
+            if utils.have_gtk_version("3.22.0"):
+                monitor = Gdk.Display.get_default().get_primary_monitor()
+                self.rect = monitor.get_geometry()
+            else:
+                monitor_n = self.screen.get_primary_monitor()
+                self.rect = self.screen.get_monitor_geometry(monitor_n)
+        else:
+            self.rect = Gdk.Rectangle()
+
+            self.rect.x = 0
+            self.rect.y = 0
+            self.rect.width = self.screen.get_width()
+            self.rect.height = self.screen.get_height()
 
         hints = Gdk.Geometry()
         hints.min_width = self.rect.width
diff --git a/src/status.py b/src/status.py
index 015ee4f..cf54ab9 100644
--- a/src/status.py
+++ b/src/status.py
@@ -12,10 +12,15 @@ focusWidgets = []
 # You get all sorts of artifacts trying to draw widgets over the x plugins
 PluginRunning = False
 
-# Set at startup, assisted by cs_init_utils_initialize_locking()
+# Set by command line args
+
 # This is different than the preference that turns off locking - that only prevents idle locking.  The
 # user can still lock explicitly.  The function checks for the existence of correct PAM files,
 # as well as adjusting the UID if this process is started as root.
 LockEnabled = True
 
+# Enables extra PAM/authentication debugging
 Debug = False
+
+# Forces the Stage to only cover a single monitor and launch a GtkInspector window.
+InteractiveDebug = False
diff --git a/src/util/utils.py b/src/util/utils.py
index 3b574b1..e0a644e 100644
--- a/src/util/utils.py
+++ b/src/util/utils.py
@@ -126,16 +126,19 @@ def override_user_time(window):
 def debug_allocation(alloc):
     print("x:%d, y:%d, width:%d, height:%d" % (alloc.x, alloc.y, alloc.width, alloc.height))
 
-def get_mouse_monitor():
-    manager = Gdk.Display.get_default().get_device_manager()
-    pointer = manager.get_client_pointer()
+def get_primary_monitor():
+    return Gdk.Screen.get_default().get_primary_monitor()
 
-    screen, x, y = pointer.get_position()
+def get_mouse_monitor():
+    if status.InteractiveDebug:
+        return get_primary_monitor()
+    else:
+        manager = Gdk.Display.get_default().get_device_manager()
+        pointer = manager.get_client_pointer()
 
-    return Gdk.Screen.get_default().get_monitor_at_point(x, y)
+        screen, x, y = pointer.get_position()
 
-def get_primary_monitor():
-    return Gdk.Screen.get_default().get_primary_monitor()
+        return Gdk.Screen.get_default().get_monitor_at_point(x, y)
 
 def lookup_plugin_path(name):
     if name == "":
-- 
2.9.3