From 3d287754799f0a6ca7adba594ceb5201318de004 Mon Sep 17 00:00:00 2001 From: deltragon Date: Tue, 2 Jan 2024 13:36:43 +0100 Subject: [PATCH] gtk4: get break screen ui running --- safeeyes/glade/break_screen.glade | 159 ++++++++---------------- safeeyes/model.py | 7 +- safeeyes/plugins/mediacontrol/plugin.py | 2 +- safeeyes/plugins/screensaver/plugin.py | 2 +- safeeyes/ui/break_screen.py | 48 +++---- 5 files changed, 78 insertions(+), 140 deletions(-) diff --git a/safeeyes/glade/break_screen.glade b/safeeyes/glade/break_screen.glade index 277ef4a..23b1e45 100644 --- a/safeeyes/glade/break_screen.glade +++ b/safeeyes/glade/break_screen.glade @@ -1,5 +1,4 @@ - - + - False - center - True safeeyes - True - True - False - False - False - center - + 0 + 0 - + - True - False - True - True + 1 + 1 - True - False vertical 10 - True - False center center 10 - True - False + + 0 + 0 + - - 0 - 0 - - True - False center center - True + 1 15 - True - False Hello World center + + 0 + 0 + 3 + - - 0 - 0 - 3 - - - True - False + center - 0.20000000298023224 - - - True - False - 00 - - - + 00 + + + 1 + 2 + - - 1 - 1 - - True - False center 50 - True + 1 + + 1 + 3 + - - 1 - 3 - @@ -151,89 +119,62 @@ + + 0 + 1 + 3 + - - 0 - 1 - 3 - - - False - True - 0 - - True - False + 1 Widget 0.25 - - True - True - end - 1 - + + 0 + 1 + 2 + - - 0 - 1 - 2 - - True - False vertical - - True - False + + toolbar + 0 end start - icons - 2 - - False - True - 0 - - True - False + 1 - - True - True - 1 - + + 0 + 0 + - - 0 - 0 - - + diff --git a/safeeyes/model.py b/safeeyes/model.py index 2f8f9b8..6d9dd4c 100644 --- a/safeeyes/model.py +++ b/safeeyes/model.py @@ -27,6 +27,10 @@ from dataclasses import dataclass from packaging.version import parse +import gi +gi.require_version('Gtk', '4.0') +from gi.repository import Gtk + from safeeyes import utility @@ -399,7 +403,8 @@ class TrayAction: def get_icon(self): if self.system_icon: - return self.__icon + image = Gtk.Image.new_from_icon_name(self.__icon) + return image else: image = utility.load_and_scale_image(self.__icon, 16, 16) image.show() diff --git a/safeeyes/plugins/mediacontrol/plugin.py b/safeeyes/plugins/mediacontrol/plugin.py index b9161ec..deacfb9 100644 --- a/safeeyes/plugins/mediacontrol/plugin.py +++ b/safeeyes/plugins/mediacontrol/plugin.py @@ -90,5 +90,5 @@ def get_tray_action(break_obj): if players: return TrayAction.build("Pause media", tray_icon_path, - Gtk.STOCK_MEDIA_PAUSE, + "media-playback-pause", lambda: __pause_players(players)) diff --git a/safeeyes/plugins/screensaver/plugin.py b/safeeyes/plugins/screensaver/plugin.py index cc49c04..2351f8e 100644 --- a/safeeyes/plugins/screensaver/plugin.py +++ b/safeeyes/plugins/screensaver/plugin.py @@ -131,5 +131,5 @@ def on_stop_break(): def get_tray_action(break_obj): return TrayAction.build("Lock screen", tray_icon_path, - Gtk.STOCK_DIALOG_AUTHENTICATION, + "dialog-password", __lock_screen) diff --git a/safeeyes/ui/break_screen.py b/safeeyes/ui/break_screen.py index 69959b0..1db98d5 100644 --- a/safeeyes/ui/break_screen.py +++ b/safeeyes/ui/break_screen.py @@ -59,7 +59,9 @@ class BreakScreen: # Initialize the theme css_provider = Gtk.CssProvider() css_provider.load_from_path(style_sheet_path) - Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) + + display = Gdk.Display.get_default() + Gtk.StyleContext.add_provider_for_display(display, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) def initialize(self, config): """ @@ -152,25 +154,25 @@ class BreakScreen: utility.start_thread(self.__lock_keyboard) display = Gdk.Display.get_default() - screen = display.get_default_screen() - no_of_monitors = display.get_n_monitors() - logging.info("Show break screens in %d display(s)", no_of_monitors) + monitors = display.get_monitors() + logging.info("Show break screens in %d display(s)", len(monitors)) skip_button_disabled = self.context.get('skip_button_disabled', False) postpone_button_disabled = self.context.get('postpone_button_disabled', False) - for monitor_num in range(no_of_monitors): - monitor = display.get_monitor(monitor_num) + i = 0 + + for monitor in monitors: monitor_gemoetry = monitor.get_geometry() x = monitor_gemoetry.x y = monitor_gemoetry.y builder = Gtk.Builder() builder.add_from_file(BREAK_SCREEN_GLADE) - builder.connect_signals(self) window = builder.get_object("window_main") - window.set_title("SafeEyes-" + str(monitor_num)) + window.connect("close-request", self.on_window_delete) + window.set_title("SafeEyes-" + str(i)) lbl_message = builder.get_object("lbl_message") lbl_count = builder.get_object("lbl_count") lbl_widget = builder.get_object("lbl_widget") @@ -179,15 +181,14 @@ class BreakScreen: toolbar = builder.get_object("toolbar") for tray_action in tray_actions: - toolbar_button = None - if tray_action.system_icon: - toolbar_button = Gtk.ToolButton.new_from_stock(tray_action.get_icon()) - else: - toolbar_button = Gtk.ToolButton.new(tray_action.get_icon(), tray_action.name) + # TODO: apparently, this would be better served with an icon theme + Gtk.button.new_from_icon_name + icon = tray_action.get_icon() + toolbar_button = Gtk.Button() + toolbar_button.set_child(icon) tray_action.add_toolbar_button(toolbar_button) toolbar_button.connect("clicked", lambda button, action: self.__tray_action(button, action), tray_action) toolbar_button.set_tooltip_text(_(tray_action.name)) - toolbar.add(toolbar_button) + toolbar.append(toolbar_button) toolbar_button.show() # Add the buttons @@ -197,7 +198,7 @@ class BreakScreen: btn_postpone.get_style_context().add_class('btn_postpone') btn_postpone.connect('clicked', self.on_postpone_clicked) btn_postpone.set_visible(True) - box_buttons.pack_start(btn_postpone, True, True, 0) + box_buttons.append(btn_postpone) if not self.strict_break and not skip_button_disabled: # Add the skip button @@ -205,7 +206,7 @@ class BreakScreen: btn_skip.get_style_context().add_class('btn_skip') btn_skip.connect('clicked', self.on_skip_clicked) btn_skip.set_visible(True) - box_buttons.pack_start(btn_skip, True, True, 0) + box_buttons.append(btn_skip) # Set values if image_path: @@ -216,23 +217,14 @@ class BreakScreen: self.windows.append(window) self.count_labels.append(lbl_count) - # Set visual to apply css theme. It should be called before show method. - window.set_visual(window.get_screen().get_rgba_visual()) if self.context['desktop'] == 'kde': # Fix flickering screen in KDE by setting opacity to 1 window.set_opacity(0.9) - # In Unity, move the window before present - window.move(x, y) - window.resize(monitor_gemoetry.width, monitor_gemoetry.height) - window.stick() - window.set_keep_above(True) - window.fullscreen_on_monitor(screen, monitor_num) + window.fullscreen_on_monitor(monitor) window.present() - # In other desktop environments, move the window after present - window.move(x, y) - window.resize(monitor_gemoetry.width, monitor_gemoetry.height) - logging.info("Moved break screen to Display[%d, %d]", x, y) + + i = i + 1 def __update_count_down(self, count): """