From 0f902fe0529487524ff1c36895b7eb1c3b378b63 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 | 163 ++++++++---------------- 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, 80 insertions(+), 142 deletions(-) diff --git a/safeeyes/glade/break_screen.glade b/safeeyes/glade/break_screen.glade index 873a26b..87b43e6 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 + 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 - Widget + 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 453761d..c2be9b9 100644 --- a/safeeyes/model.py +++ b/safeeyes/model.py @@ -25,6 +25,10 @@ import random from distutils.version import LooseVersion from enum import Enum +import gi +gi.require_version('Gtk', '4.0') +from gi.repository import Gtk + from safeeyes import utility @@ -397,7 +401,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 f09847b..f783b7f 100644 --- a/safeeyes/plugins/mediacontrol/plugin.py +++ b/safeeyes/plugins/mediacontrol/plugin.py @@ -74,5 +74,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 22b7828..43ea66f 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 1c4b237..f30d9c5 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,22 +154,22 @@ 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)) - 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") @@ -176,15 +178,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 @@ -194,7 +195,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: # Add the skip button @@ -202,7 +203,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: @@ -213,23 +214,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): """