aboutsummaryrefslogtreecommitdiff
path: root/arctica-greeter-magnifier
diff options
context:
space:
mode:
authorRobert Tari <robert@tari.in>2024-03-04 10:45:24 +0100
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2024-04-08 12:17:16 +0200
commitf9a1300290a032e8f892774c2db3e4c79c758679 (patch)
tree6cf62d73752a155610f498043320f3b6e7445abf /arctica-greeter-magnifier
parente09ca756476c0aa594890bcb1cc52228073649e0 (diff)
downloadarctica-greeter-f9a1300290a032e8f892774c2db3e4c79c758679.tar.gz
arctica-greeter-f9a1300290a032e8f892774c2db3e4c79c758679.tar.bz2
arctica-greeter-f9a1300290a032e8f892774c2db3e4c79c758679.zip
Add a Magnus fork and wrap it in a new window
fixes https://github.com/ArcticaProject/arctica-greeter/issues/100
Diffstat (limited to 'arctica-greeter-magnifier')
-rwxr-xr-xarctica-greeter-magnifier107
1 files changed, 107 insertions, 0 deletions
diff --git a/arctica-greeter-magnifier b/arctica-greeter-magnifier
new file mode 100755
index 0000000..c4e5180
--- /dev/null
+++ b/arctica-greeter-magnifier
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+
+import setproctitle
+import sys
+from functools import lru_cache
+import gi
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk, Gdk, GLib, GdkPixbuf, Gio
+
+class Main(object):
+
+ def __init__(self):
+
+ self.window_x = 0
+ self.window_y = 0
+ self.w = Gtk.Window.new(Gtk.WindowType.TOPLEVEL)
+ self.w.set_size_request(300, 300)
+ self.w.set_title("Magnus")
+ self.w.connect("destroy", lambda a: Gtk.main_quit())
+ self.w.connect("configure-event", self.window_configure)
+ self.img = Gtk.Image()
+ scrolled_window = Gtk.ScrolledWindow()
+ scrolled_window.add(self.img)
+ self.w.add(scrolled_window)
+ self.w.show_all()
+ sys.stdout.write('%d\n' % self.w.get_window().get_xid())
+ sys.stdout.flush()
+ GLib.timeout_add(250, self.poll)
+ Gtk.main()
+
+ def poll(self, *args):
+
+ loc = self.w.get_size()
+ width = loc.width
+ height = loc.height
+ (screen, x, y) = Gdk.Display.get_default().get_default_seat().get_pointer().get_position()
+
+ if (x > self.window_x and x <= (self.window_x + width + 0) and y > self.window_y and y <= (self.window_y + height + 0)):
+
+ white = self.get_white_pixbuf(width, height)
+ self.img.set_from_pixbuf(white)
+
+ else:
+
+ root = Gdk.get_default_root_window()
+ scaled_width = width // 2
+ scaled_height = height // 2
+ scaled_xoff = scaled_width // 2
+ scaled_yoff = scaled_height // 2
+ screenshot = Gdk.pixbuf_get_from_window(root, x - scaled_xoff, y - scaled_yoff, scaled_width, scaled_height)
+ scaled_pb = screenshot.scale_simple(width, height, GdkPixbuf.InterpType.NEAREST)
+ self.img.set_from_pixbuf(scaled_pb)
+
+ return True
+
+ @lru_cache()
+ def makesquares(self, overall_width, overall_height, square_size, value_on, value_off):
+
+ on_sq = list(value_on) * square_size
+ off_sq = list(value_off) * square_size
+ on_row = []
+ off_row = []
+
+ while len(on_row) < overall_width * len(value_on):
+
+ on_row += on_sq
+ on_row += off_sq
+ off_row += off_sq
+ off_row += on_sq
+
+ on_row = on_row[:overall_width * len(value_on)]
+ off_row = off_row[:overall_width * len(value_on)]
+ on_sq_row = on_row * square_size
+ off_sq_row = off_row * square_size
+ overall = []
+ count = 0
+
+ while len(overall) < overall_width * overall_height * len(value_on):
+
+ overall += on_sq_row
+ overall += off_sq_row
+ count += 2
+
+ overall = overall[:overall_width * overall_height * len(value_on)]
+
+ return overall
+
+ @lru_cache()
+ def get_white_pixbuf(self, width, height):
+
+ square_size = 16
+ light = (153, 153, 153, 255)
+ dark = (102, 102, 102, 255)
+ whole = self.makesquares(width, height, square_size, light, dark)
+ arr = GLib.Bytes.new(whole)
+
+ return GdkPixbuf.Pixbuf.new_from_bytes(arr, GdkPixbuf.Colorspace.RGB, True, 8, width, height, width * len(light))
+
+ def window_configure(self, window, ev):
+
+ self.window_x = ev.x
+ self.window_y = ev.y
+
+if __name__ == "__main__":
+
+ setproctitle.setproctitle('magnus')
+ Main()