Skip to content

Commit

Permalink
Remove uses of deprecated gtk3 apis (slgobinath#560)
Browse files Browse the repository at this point in the history
* fix deprecations

* port to Gtk.Application

Gtk.main() and Gtk.main_quit() are dropped in gtk4 in favor of
subclassing Gtk.Application.

This commit also moves argument handling from a separate thread to
GtkApplication.do_startup().

* fix deprecations in settings dialog
  • Loading branch information
deltragon authored Jul 3, 2024
1 parent 05d95ad commit d834af9
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 52 deletions.
25 changes: 1 addition & 24 deletions safeeyes/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,14 @@
import logging
import signal
import sys
from threading import Timer

import gi
import psutil
from safeeyes import utility
from safeeyes.model import Config
from safeeyes.safeeyes import SafeEyes
from safeeyes.safeeyes import SAFE_EYES_VERSION
from safeeyes.rpc import RPCClient

gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

gettext.install('safeeyes', utility.LOCALE_PATH)


Expand Down Expand Up @@ -68,22 +63,6 @@ def __running():
return False


def __evaluate_arguments(args, safe_eyes):
"""
Evaluate the arguments and execute the operations.
"""
if args.about:
utility.execute_main_thread(safe_eyes.show_about)
elif args.disable:
utility.execute_main_thread(safe_eyes.disable_safeeyes)
elif args.enable:
utility.execute_main_thread(safe_eyes.enable_safeeyes)
elif args.settings:
utility.execute_main_thread(safe_eyes.show_settings)
elif args.take_break:
utility.execute_main_thread(safe_eyes.take_break)


def main():
"""
Start the Safe Eyes.
Expand Down Expand Up @@ -147,10 +126,8 @@ def main():
sys.exit(0)
elif not args.quit:
logging.info("Starting Safe Eyes")
safe_eyes = SafeEyes(system_locale, config)
safe_eyes = SafeEyes(system_locale, config, args)
safe_eyes.start()
Timer(1.0, lambda: __evaluate_arguments(args, safe_eyes)).start()
Gtk.main()


if __name__ == '__main__':
Expand Down
35 changes: 29 additions & 6 deletions safeeyes/safeeyes.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,21 @@
from safeeyes.ui.settings_dialog import SettingsDialog

gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gtk, Gio

SAFE_EYES_VERSION = "2.1.9"


class SafeEyes:
class SafeEyes(Gtk.Application):
"""
This class represents a runnable Safe Eyes instance.
"""

def __init__(self, system_locale, config):
def __init__(self, system_locale, config, cli_args):
super().__init__(
application_id="io.github.slgobinath.SafeEyes",
flags=Gio.ApplicationFlags.IS_SERVICE
)
self.active = False
self.break_screen = None
self.safe_eyes_core = None
Expand All @@ -58,6 +62,7 @@ def __init__(self, system_locale, config):
self.settings_dialog_active = False
self.rpc_server = None
self._status = ''
self.cli_args = cli_args

# Initialize the Safe Eyes Context
self.context['version'] = SAFE_EYES_VERSION
Expand Down Expand Up @@ -98,6 +103,9 @@ def __init__(self, system_locale, config):
self.context['api']['postpone'] = self.safe_eyes_core.postpone
self.context['api']['get_break_time'] = self.safe_eyes_core.get_break_time
self.plugins_manager.init(self.context, self.config)

self.hold()

atexit.register(self.persist_session)

def start(self):
Expand All @@ -114,6 +122,22 @@ def start(self):
self.safe_eyes_core.start()
self.handle_system_suspend()

self.run()

def do_startup(self):
Gtk.Application.do_startup(self)

if self.cli_args.about:
self.show_about()
elif self.cli_args.disable:
self.disable_safeeyes()
elif self.cli_args.enable:
self.enable_safeeyes()
elif self.cli_args.settings:
self.show_settings()
elif self.cli_args.take_break:
self.take_break()

def show_settings(self):
"""
Listen to tray icon Settings action and send the signal to Settings dialog.
Expand Down Expand Up @@ -144,9 +168,8 @@ def quit(self):
self.plugins_manager.exit()
self.__stop_rpc_server()
self.persist_session()
Gtk.main_quit()
# Exit all threads
os._exit(0)

super().quit()

def handle_suspend_callback(self, sleeping):
"""
Expand Down
18 changes: 10 additions & 8 deletions safeeyes/ui/break_screen.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,12 +151,14 @@ def __show_break_screen(self, message, image_path, widget, tray_actions):
# Lock the keyboard
utility.start_thread(self.__lock_keyboard)

screen = Gtk.Window().get_screen()
no_of_monitors = screen.get_n_monitors()
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)

for monitor in range(no_of_monitors):
monitor_gemoetry = screen.get_monitor_geometry(monitor)
for monitor_num in range(no_of_monitors):
monitor = display.get_monitor(monitor_num)
monitor_gemoetry = monitor.get_geometry()
x = monitor_gemoetry.x
y = monitor_gemoetry.y

Expand All @@ -165,7 +167,7 @@ def __show_break_screen(self, message, image_path, widget, tray_actions):
builder.connect_signals(self)

window = builder.get_object("window_main")
window.set_title("SafeEyes-" + str(monitor))
window.set_title("SafeEyes-" + str(monitor_num))
lbl_message = builder.get_object("lbl_message")
lbl_count = builder.get_object("lbl_count")
lbl_widget = builder.get_object("lbl_widget")
Expand All @@ -188,15 +190,15 @@ def __show_break_screen(self, message, image_path, widget, tray_actions):
# Add the buttons
if self.enable_postpone:
# Add postpone button
btn_postpone = Gtk.Button(_('Postpone'))
btn_postpone = Gtk.Button.new_with_label(_('Postpone'))
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)

if not self.strict_break:
# Add the skip button
btn_skip = Gtk.Button(_('Skip'))
btn_skip = Gtk.Button.new_with_label(_('Skip'))
btn_skip.get_style_context().add_class('btn_skip')
btn_skip.connect('clicked', self.on_skip_clicked)
btn_skip.set_visible(True)
Expand All @@ -222,7 +224,7 @@ def __show_break_screen(self, message, image_path, widget, tray_actions):
window.resize(monitor_gemoetry.width, monitor_gemoetry.height)
window.stick()
window.set_keep_above(True)
window.fullscreen()
window.fullscreen_on_monitor(screen, monitor_num)
window.present()
# In other desktop environments, move the window after present
window.move(x, y)
Expand Down
32 changes: 18 additions & 14 deletions safeeyes/ui/settings_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,14 +170,16 @@ def __confirmation_dialog_response(widget, response_id):
self.__initialize(self.config)
widget.destroy()

messagedialog = Gtk.MessageDialog(parent=self.window,
flags=Gtk.DialogFlags.MODAL,
type=Gtk.MessageType.WARNING,
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
_("Reset"), Gtk.ResponseType.OK),
message_format=_("Are you sure you want to reset all settings to default?"))
messagedialog = Gtk.MessageDialog()
messagedialog.set_modal(True)
messagedialog.set_transient_for(self.window)
messagedialog.set_property('message_type', Gtk.MessageType.WARNING)
messagedialog.set_property('text', _("Are you sure you want to reset all settings to default?"))
messagedialog.set_property('secondary-text', _("You can't undo this action."))
messagedialog.add_button('_Cancel', Gtk.ResponseType.CANCEL)
messagedialog.add_button(_("Reset"), Gtk.ResponseType.OK)

messagedialog.connect("response", __confirmation_dialog_response)
messagedialog.format_secondary_text(_("You can't undo this action."))
messagedialog.show()

def __delete_break(self, break_config, is_short, on_remove):
Expand All @@ -194,14 +196,16 @@ def __confirmation_dialog_response(widget, response_id):
on_remove()
widget.destroy()

messagedialog = Gtk.MessageDialog(parent=self.window,
flags=Gtk.DialogFlags.MODAL,
type=Gtk.MessageType.WARNING,
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
_("Delete"), Gtk.ResponseType.OK),
message_format=_("Are you sure you want to delete this break?"))
messagedialog = Gtk.MessageDialog()
messagedialog.set_modal(True)
messagedialog.set_transient_for(self.window)
messagedialog.set_property('message_type', Gtk.MessageType.WARNING)
messagedialog.set_property('text', _("Are you sure you want to delete this break?"))
messagedialog.set_property('secondary-text', _("You can't undo this action."))
messagedialog.add_button('_Cancel', Gtk.ResponseType.CANCEL)
messagedialog.add_button(_("Delete"), Gtk.ResponseType.OK)

messagedialog.connect("response", __confirmation_dialog_response)
messagedialog.format_secondary_text(_("You can't undo this action."))
messagedialog.show()

def __create_plugin_item(self, plugin_config):
Expand Down

0 comments on commit d834af9

Please sign in to comment.