roundabout,
created on Friday, 29 August 2025, 20:25:28 (1756499128),
received on Friday, 29 August 2025, 20:25:32 (1756499132)
Author identity: Vlad <vlad.muntoiu@gmail.com>
5c9447bb95a2cda4503c59e01d8e989e1124aa1b
main.py
@@ -30,7 +30,7 @@ import locale
from itertools import accumulate, chain
from pathlib import Path
import ruamel.yaml as yaml
from pywayland.client import Display
from pywayland.client import Display, EventQueue
from pywayland.protocol.wayland import WlRegistry, WlSeat, WlSurface, WlCompositor
faulthandler.enable()
@@ -59,6 +59,15 @@ import panorama_panel
import asyncio
asyncio.set_event_loop_policy(GLibEventLoopPolicy())
import ctypes
from cffi import FFI
ffi = FFI()
ffi.cdef("""
void * gdk_display_get_default ();
void * gdk_wayland_display_get_wl_display (void * display);
""")
gtk = ffi.dlopen("libgtk-4.so.1")
custom_css = """
.panel-flash {
animation: flash 333ms ease-in-out 0s 2;
@@ -592,6 +601,9 @@ class PanoramaPanel(Gtk.Application):
self.applets_by_name: dict[str, panorama_panel.Applet] = {}
self.panels: list[Panel] = []
self.manager_window = None
self.wl_display = None
self.wl_event_queue = None
self.wl_fd_watch_handle = None
self.edit_mode = False
self.drags = {}
@@ -606,6 +618,8 @@ class PanoramaPanel(Gtk.Application):
def do_startup(self):
Gtk.Application.do_startup(self)
self.monitors = self.display.get_monitors()
for i, monitor in enumerate(self.monitors):
geometry = monitor.get_geometry()
print(f"Monitor {i}: {geometry.width}x{geometry.height} at {geometry.x},{geometry.y}")
@@ -618,6 +632,16 @@ class PanoramaPanel(Gtk.Application):
print(f"Name conflict for applet {subclass.__name__}. Only one will be loaded.", file=sys.stderr)
self.applets_by_name[subclass.__name__] = subclass
if not self.wl_display:
print("Acquiring Display()")
self.wl_display = Display()
wl_display = gtk.gdk_display_get_default()
wl_display_ptr = gtk.gdk_wayland_display_get_wl_display(
ffi.cast("void *", wl_display))
self.wl_display._ptr = wl_display_ptr
self.wl_event_queue = EventQueue(self.wl_display)
with open(get_config_file(), "r") as config_file:
yaml_loader = yaml.YAML(typ="rt")
yaml_file = yaml_loader.load(config_file)
@@ -657,6 +681,7 @@ class PanoramaPanel(Gtk.Application):
def do_activate(self):
Gio.Application.do_activate(self)
print("do_activate")
def save_config(self, *args):
print("Saving configuration file")