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