Enhance lock screen after long breaks
This commit is contained in:
parent
8c81ca5742
commit
7015c97c47
|
@ -74,6 +74,7 @@ class BreakScreen:
|
|||
"""
|
||||
def on_skip_clicked(self, button):
|
||||
logging.info("User skipped the break")
|
||||
# Must call on_skip before close to lock screen before closing the break screen
|
||||
self.on_skip()
|
||||
self.close()
|
||||
|
||||
|
@ -194,7 +195,7 @@ class BreakScreen:
|
|||
while self.lock_keyboard:
|
||||
self.key_lock_condition.wait()
|
||||
self.key_lock_condition.release()
|
||||
|
||||
|
||||
# Ungrap the keyboard
|
||||
logging.info("Unlock the keyboard")
|
||||
display.ungrab_keyboard(X.CurrentTime)
|
||||
|
|
|
@ -28,7 +28,7 @@ class SafeEyesCore:
|
|||
"""
|
||||
Initialize the internal variables of the core.
|
||||
"""
|
||||
def __init__(self, show_notification, start_break, end_break, on_countdown, update_next_break_info):
|
||||
def __init__(self, context, show_notification, start_break, end_break, on_countdown, update_next_break_info):
|
||||
# Initialize the variables
|
||||
self.break_count = -1
|
||||
self.long_break_message_index = -1
|
||||
|
@ -45,6 +45,7 @@ class SafeEyesCore:
|
|||
self.notification_condition = threading.Condition()
|
||||
self.idle_condition = threading.Condition()
|
||||
self.lock = threading.Lock()
|
||||
self.context = context
|
||||
|
||||
|
||||
"""
|
||||
|
@ -65,8 +66,6 @@ class SafeEyesCore:
|
|||
self.skip_break_window_classes = [x.lower() for x in config['active_window_class']['skip_break']]
|
||||
self.take_break_window_classes = [x.lower() for x in config['active_window_class']['take_break']]
|
||||
self.custom_exercises = config['custom_exercises']
|
||||
self.time_to_screen_lock = config.get('time_to_screen_lock', -1)
|
||||
self.enable_screen_lock = config.get('enable_screen_lock', False)
|
||||
|
||||
exercises = language['exercises']
|
||||
for short_break_config in config['short_breaks']:
|
||||
|
@ -86,7 +85,7 @@ class SafeEyesCore:
|
|||
if not isinstance(break_time, int) or break_time <= 0:
|
||||
logging.error('Invalid time in short break: ' + str(short_break_config))
|
||||
continue
|
||||
|
||||
|
||||
self.short_break_exercises.append([name, break_time, audible_alert, image])
|
||||
|
||||
for long_break_config in config['long_breaks']:
|
||||
|
@ -106,7 +105,7 @@ class SafeEyesCore:
|
|||
if not isinstance(break_time, int) or break_time <= 0:
|
||||
logging.error('Invalid time in long break: ' + str(long_break_config))
|
||||
continue
|
||||
|
||||
|
||||
self.long_break_exercises.append([name, break_time, audible_alert, image])
|
||||
|
||||
|
||||
|
@ -206,7 +205,7 @@ class SafeEyesCore:
|
|||
# Wait until the postpone time
|
||||
time_to_wait = self.postpone_duration
|
||||
self.postponed = False
|
||||
|
||||
|
||||
next_break_time = datetime.datetime.now() + datetime.timedelta(minutes=time_to_wait)
|
||||
self.update_next_break_info(next_break_time)
|
||||
|
||||
|
@ -285,6 +284,7 @@ class SafeEyesCore:
|
|||
seconds = self.long_break_exercises[self.long_break_message_index][1]
|
||||
audible_alert = self.long_break_exercises[self.long_break_message_index][2]
|
||||
image = self.long_break_exercises[self.long_break_message_index][3]
|
||||
self.context['break_type'] = 'long'
|
||||
else:
|
||||
logging.info("Count is {}; get a short beak message".format(self.break_count))
|
||||
self.short_break_message_index = (self.short_break_message_index + 1) % len(self.short_break_exercises)
|
||||
|
@ -292,24 +292,23 @@ class SafeEyesCore:
|
|||
seconds = self.short_break_exercises[self.short_break_message_index][1]
|
||||
audible_alert = self.short_break_exercises[self.short_break_message_index][2]
|
||||
image = self.short_break_exercises[self.short_break_message_index][3]
|
||||
|
||||
self.context['break_type'] = 'short'
|
||||
|
||||
self.context['break_length'] = seconds
|
||||
self.context['audible_alert'] = audible_alert
|
||||
total_break_time = seconds
|
||||
# Should we lock screen potentially?
|
||||
consider_screen_lock = Utility.is_desktop_lock_supported() and self.enable_screen_lock
|
||||
|
||||
# Show the break screen
|
||||
self.start_break(message, image)
|
||||
self.start_break(message, image)
|
||||
|
||||
# Use self.active instead of self.__is_running to avoid idle pause interrupting the break
|
||||
while seconds and self.active and not self.skipped and not self.postponed:
|
||||
self.context['count_down'] = total_break_time - seconds
|
||||
mins, secs = divmod(seconds, 60)
|
||||
timeformat = '{:02d}:{:02d}'.format(mins, secs)
|
||||
self.on_countdown(timeformat)
|
||||
time.sleep(1) # Sleep for 1 second
|
||||
seconds -= 1
|
||||
if consider_screen_lock and self.time_to_screen_lock == total_break_time - seconds:
|
||||
Utility.lock_desktop()
|
||||
|
||||
# Loop terminated because of timeout (not skipped) -> Close the break alert
|
||||
if not self.skipped and not self.postponed:
|
||||
|
|
|
@ -34,6 +34,7 @@ class SettingsDialog:
|
|||
builder.add_from_file(glade_file)
|
||||
builder.connect_signals(self)
|
||||
|
||||
# Get the UI components
|
||||
self.window = builder.get_object('window_settings')
|
||||
self.spin_short_break_duration = builder.get_object('spin_short_break_duration')
|
||||
self.spin_long_break_duration = builder.get_object('spin_long_break_duration')
|
||||
|
@ -48,6 +49,7 @@ class SettingsDialog:
|
|||
self.switch_screen_lock = builder.get_object('switch_screen_lock')
|
||||
self.spin_time_to_screen_lock = builder.get_object('spin_time_to_screen_lock')
|
||||
|
||||
# Translate the UI labels
|
||||
builder.get_object('lbl_short_break').set_label(language['ui_controls']['short_break_duration'])
|
||||
builder.get_object('lbl_long_break').set_label(language['ui_controls']['long_break_duration'])
|
||||
builder.get_object('lbl_interval_bettween_breaks').set_label(language['ui_controls']['interval_between_two_breaks'])
|
||||
|
@ -63,6 +65,7 @@ class SettingsDialog:
|
|||
builder.get_object('btn_cancel').set_label(language['ui_controls']['cancel'])
|
||||
builder.get_object('btn_save').set_label(language['ui_controls']['save'])
|
||||
|
||||
# Set the current values of input fields
|
||||
self.spin_short_break_duration.set_value(config['short_break_duration'])
|
||||
self.spin_long_break_duration.set_value(config['long_break_duration'])
|
||||
self.spin_interval_between_two_breaks.set_value(config['break_interval'])
|
||||
|
@ -73,8 +76,8 @@ class SettingsDialog:
|
|||
self.switch_strict_break.set_active(config['strict_break'])
|
||||
self.switch_audible_alert.set_active(config['audible_alert'])
|
||||
self.switch_screen_lock.set_sensitive(Utility.is_desktop_lock_supported())
|
||||
self.switch_screen_lock.set_active(Utility.is_desktop_lock_supported() and self.config.get('enable_screen_lock', False))
|
||||
self.spin_time_to_screen_lock.set_value(self.config.get('time_to_screen_lock', 20))
|
||||
self.switch_screen_lock.set_active(Utility.is_desktop_lock_supported() and config['enable_screen_lock'])
|
||||
self.spin_time_to_screen_lock.set_value(config['time_to_screen_lock'])
|
||||
self.on_switch_screen_lock_activate(self.switch_screen_lock, self.switch_screen_lock.get_active())
|
||||
|
||||
# Initialize the language combobox
|
||||
|
@ -82,7 +85,7 @@ class SettingsDialog:
|
|||
language_index = 2
|
||||
lang_code = config['language']
|
||||
|
||||
# Add System Language as the first option
|
||||
# Add 'System Language' as the first option
|
||||
language_list_store.append([language['ui_controls']['system_language']])
|
||||
language_list_store.append(['-'])
|
||||
self.languages.append('system')
|
||||
|
@ -103,19 +106,33 @@ class SettingsDialog:
|
|||
self.cmb_language.pack_start(cell, True)
|
||||
self.cmb_language.add_attribute(cell, 'text', 0)
|
||||
|
||||
"""
|
||||
Show the SettingsDialog.
|
||||
"""
|
||||
|
||||
def show(self):
|
||||
"""
|
||||
Show the SettingsDialog.
|
||||
"""
|
||||
self.window.show_all()
|
||||
|
||||
|
||||
def on_switch_screen_lock_activate(self, switch, state):
|
||||
"""
|
||||
Event handler to the state change of the screen_lock switch.
|
||||
Enable or disable the self.spin_time_to_screen_lock based on the state of the screen_lock switch.
|
||||
"""
|
||||
self.spin_time_to_screen_lock.set_sensitive(self.switch_screen_lock.get_active())
|
||||
|
||||
|
||||
def on_window_delete(self, *args):
|
||||
"""
|
||||
Event handler for Settings dialog close action.
|
||||
"""
|
||||
self.window.destroy()
|
||||
|
||||
|
||||
def on_save_clicked(self, button):
|
||||
"""
|
||||
Event handler for Save button click.
|
||||
"""
|
||||
self.config['short_break_duration'] = self.spin_short_break_duration.get_value_as_int()
|
||||
self.config['long_break_duration'] = self.spin_long_break_duration.get_value_as_int()
|
||||
self.config['break_interval'] = self.spin_interval_between_two_breaks.get_value_as_int()
|
||||
|
@ -132,5 +149,9 @@ class SettingsDialog:
|
|||
self.on_save_settings(self.config) # Call the provided save method
|
||||
self.window.destroy() # Close the settings window
|
||||
|
||||
|
||||
def on_cancel_clicked(self, button):
|
||||
"""
|
||||
Event handler for Cancel button click.
|
||||
"""
|
||||
self.window.destroy()
|
||||
|
|
|
@ -27,10 +27,11 @@ home_directory = os.path.expanduser('~')
|
|||
system_language_directory = os.path.join(bin_directory, "config/lang")
|
||||
config_directory = os.path.join(home_directory, '.config/safeeyes')
|
||||
|
||||
"""
|
||||
Play the alert.wav
|
||||
"""
|
||||
|
||||
def play_notification():
|
||||
"""
|
||||
Play the alert.wav
|
||||
"""
|
||||
logging.info("Playing audible alert")
|
||||
CHUNK = 1024
|
||||
|
||||
|
@ -64,11 +65,12 @@ def play_notification():
|
|||
logging.warning('Unable to play audible alert')
|
||||
logging.exception(e)
|
||||
|
||||
"""
|
||||
|
||||
def get_resource_path(resource_name):
|
||||
"""
|
||||
Return the user-defined resource if a system resource is overridden by the user.
|
||||
Otherwise, return the system resource. Return None if the specified resource does not exist.
|
||||
"""
|
||||
def get_resource_path(resource_name):
|
||||
"""
|
||||
if resource_name is None:
|
||||
return None
|
||||
resource_location = os.path.join(config_directory, 'resource', resource_name)
|
||||
|
@ -81,40 +83,40 @@ def get_resource_path(resource_name):
|
|||
return resource_location
|
||||
|
||||
|
||||
"""
|
||||
def system_idle_time():
|
||||
"""
|
||||
Get system idle time in minutes.
|
||||
Return the idle time if xprintidle is available, otherwise return 0.
|
||||
"""
|
||||
def system_idle_time():
|
||||
"""
|
||||
try:
|
||||
return int(subprocess.check_output(['xprintidle']).decode('utf-8')) / 60000 # Convert to minutes
|
||||
except:
|
||||
return 0
|
||||
|
||||
|
||||
"""
|
||||
Execute the function in a separate thread.
|
||||
"""
|
||||
def start_thread(target_function, **args):
|
||||
"""
|
||||
Execute the function in a separate thread.
|
||||
"""
|
||||
thread = threading.Thread(target=target_function, kwargs=args)
|
||||
thread.start()
|
||||
|
||||
|
||||
"""
|
||||
Execute the given function in main thread.
|
||||
"""
|
||||
def execute_main_thread(target_function, args=None):
|
||||
"""
|
||||
Execute the given function in main thread.
|
||||
"""
|
||||
if args:
|
||||
GLib.idle_add(lambda: target_function(args))
|
||||
else:
|
||||
GLib.idle_add(lambda: target_function())
|
||||
|
||||
|
||||
"""
|
||||
def is_active_window_skipped(skip_break_window_classes, take_break_window_classes, unfullscreen_allowed=False):
|
||||
"""
|
||||
Check for full-screen applications.
|
||||
This method must be executed by the main thread. If not, it will cause to random failure.
|
||||
"""
|
||||
def is_active_window_skipped(skip_break_window_classes, take_break_window_classes, unfullscreen_allowed=False):
|
||||
"""
|
||||
logging.info("Searching for full-screen application")
|
||||
screen = Gdk.Screen.get_default()
|
||||
|
||||
|
@ -151,10 +153,10 @@ def is_active_window_skipped(skip_break_window_classes, take_break_window_classe
|
|||
return False
|
||||
|
||||
|
||||
"""
|
||||
Return the system locale. If not available, return en_US.UTF-8.
|
||||
"""
|
||||
def __system_locale():
|
||||
"""
|
||||
Return the system locale. If not available, return en_US.UTF-8.
|
||||
"""
|
||||
locale.setlocale(locale.LC_ALL, '')
|
||||
system_locale = locale.getlocale(locale.LC_TIME)[0]
|
||||
if not system_locale:
|
||||
|
@ -162,18 +164,18 @@ def __system_locale():
|
|||
return system_locale
|
||||
|
||||
|
||||
"""
|
||||
Format time based on the system time.
|
||||
"""
|
||||
def format_time(time):
|
||||
"""
|
||||
Format time based on the system time.
|
||||
"""
|
||||
system_locale = __system_locale()
|
||||
return babel.dates.format_time(time, format='short', locale=system_locale)
|
||||
|
||||
|
||||
"""
|
||||
Create directory if not exists.
|
||||
"""
|
||||
def mkdir(path):
|
||||
"""
|
||||
Create directory if not exists.
|
||||
"""
|
||||
try:
|
||||
os.makedirs(path)
|
||||
except OSError as exc:
|
||||
|
@ -183,12 +185,12 @@ def mkdir(path):
|
|||
logging.error('Error while creating ' + str(path))
|
||||
raise
|
||||
|
||||
"""
|
||||
def parse_language_code(lang_code):
|
||||
"""
|
||||
Convert the user defined language code to a valid one.
|
||||
This includes converting to lower case and finding system locale language,
|
||||
if the given lang_code code is 'system'.
|
||||
"""
|
||||
def parse_language_code(lang_code):
|
||||
"""
|
||||
# Convert to lower case
|
||||
lang_code = str(lang_code).lower()
|
||||
|
||||
|
@ -208,10 +210,10 @@ def parse_language_code(lang_code):
|
|||
return lang_code
|
||||
|
||||
|
||||
"""
|
||||
Load the desired language from the available list based on the preference.
|
||||
"""
|
||||
def load_language(lang_code):
|
||||
"""
|
||||
Load the desired language from the available list based on the preference.
|
||||
"""
|
||||
# Convert the user defined language code to a valid one
|
||||
lang_code = parse_language_code(lang_code)
|
||||
|
||||
|
@ -226,11 +228,11 @@ def load_language(lang_code):
|
|||
return language
|
||||
|
||||
|
||||
"""
|
||||
def read_lang_files():
|
||||
"""
|
||||
Read all the language translations and build a key-value mapping of language names
|
||||
in English and ISO 639-1 (Filename without extension).
|
||||
"""
|
||||
def read_lang_files():
|
||||
"""
|
||||
languages = {}
|
||||
for lang_file_name in os.listdir(system_language_directory):
|
||||
lang_file_path = os.path.join(system_language_directory, lang_file_name)
|
||||
|
@ -241,20 +243,54 @@ def read_lang_files():
|
|||
|
||||
return languages
|
||||
|
||||
def desktop_envinroment():
|
||||
def lock_screen_command():
|
||||
"""
|
||||
Function tries to detect current envinroment
|
||||
Possible results: unity, gnome or None if nothing detected
|
||||
Function tries to detect the screensaver command based on the current envinroment
|
||||
Possible results:
|
||||
Gnome, Unity: ["gnome-screensaver-command", "--lock"]
|
||||
Cinnamon: ["cinnamon-screensaver-command", "--lock"]
|
||||
None if nothing detected
|
||||
"""
|
||||
if 'unity' == os.environ.get('XDG_CURRENT_DESKTOP', '').lower():
|
||||
return 'unity'
|
||||
elif 'gnome' == os.environ.get('DESKTOP_SESSION', '').lower():
|
||||
return 'gnome'
|
||||
|
||||
# TODO: Add the command-line tools for other desktop environments (Atleast for KDE, XFCE, LXDE and MATE)
|
||||
desktop_session = os.environ.get("DESKTOP_SESSION")
|
||||
if desktop_session is not None:
|
||||
desktop_session = desktop_session.lower()
|
||||
# if desktop_session in ["gnome","unity", "cinnamon", "mate", "xfce4", "lxde", "fluxbox", "blackbox", "openbox", "icewm", "jwm", "afterstep", "trinity", "kde"]:
|
||||
if desktop_session in ["gnome","unity"] or desktop_session.startswith("ubuntu"):
|
||||
return ["gnome-screensaver-command", "--lock"]
|
||||
elif desktop_session == "cinnamon":
|
||||
return ["cinnamon-screensaver-command", "--lock"]
|
||||
# elif desktop_session.startswith("lubuntu"):
|
||||
# return "lxde"
|
||||
# elif desktop_session.startswith("kubuntu"):
|
||||
# return "kde"
|
||||
# elif "xfce" in desktop_session or desktop_session.startswith("xubuntu"):
|
||||
# return "xfce4"
|
||||
# elif desktop_session.startswith("razor"):
|
||||
# return "razor-qt"
|
||||
# elif desktop_session.startswith("wmaker"):
|
||||
# return "windowmaker"
|
||||
# if os.environ.get('KDE_FULL_SESSION') == 'true':
|
||||
# return "kde"
|
||||
elif os.environ.get('GNOME_DESKTOP_SESSION_ID'):
|
||||
if not "deprecated" in os.environ.get('GNOME_DESKTOP_SESSION_ID'):
|
||||
return ["gnome-screensaver-command", "--lock"]
|
||||
# elif self.is_running("xfce-mcs-manage"):
|
||||
# return "xfce4"
|
||||
# elif self.is_running("ksmserver"):
|
||||
# return "kde"
|
||||
return None
|
||||
|
||||
def is_desktop_lock_supported():
|
||||
return desktop_envinroment() in ['unity', 'gnome']
|
||||
return lock_screen_command() is not None
|
||||
|
||||
def lock_desktop():
|
||||
subprocess.call(["gnome-screensaver-command","--lock",])
|
||||
def lock_desktop():
|
||||
"""
|
||||
Lock the screen using the predefined commands
|
||||
"""
|
||||
command = lock_screen_command()
|
||||
if command is not None:
|
||||
try:
|
||||
subprocess.Popen(command)
|
||||
except Exception as e:
|
||||
logging.error("Error in executing the commad" + str(command) + " to lock screen", e)
|
||||
|
|
|
@ -84,6 +84,9 @@ def show_alert(message, image_name):
|
|||
"""
|
||||
def close_alert(audible_alert_on):
|
||||
logging.info("Close the break screen")
|
||||
if config['enable_screen_lock'] and context['break_type'] == 'long':
|
||||
# Lock the screen before closing the break screen
|
||||
Utility.lock_desktop()
|
||||
break_screen.close()
|
||||
if audible_alert_on:
|
||||
Utility.play_notification()
|
||||
|
@ -132,6 +135,9 @@ def handle_system_suspend():
|
|||
"""
|
||||
def on_skipped():
|
||||
logging.info("User skipped the break")
|
||||
if config['enable_screen_lock'] and context['break_type'] == 'long' and context.get('count_down', 0) >= config['time_to_screen_lock']:
|
||||
# Lock the screen before closing the break screen
|
||||
Utility.lock_desktop()
|
||||
core.skip_break()
|
||||
|
||||
"""
|
||||
|
@ -139,6 +145,9 @@ def on_skipped():
|
|||
"""
|
||||
def on_postponed():
|
||||
logging.info("User postponed the break")
|
||||
if config['enable_screen_lock'] and context['break_type'] == 'long' and context.get('count_down', 0) >= config['time_to_screen_lock']:
|
||||
# Lock the screen before closing the break screen
|
||||
Utility.lock_desktop()
|
||||
core.postpone_break()
|
||||
|
||||
"""
|
||||
|
@ -285,13 +294,18 @@ def main():
|
|||
global notification
|
||||
global tray_icon
|
||||
global language
|
||||
global context
|
||||
|
||||
context = {}
|
||||
language = Utility.load_language(config['language'])
|
||||
|
||||
# Initialize the Safe Eyes Context
|
||||
context['version'] = SAFE_EYES_VERSION
|
||||
|
||||
tray_icon = TrayIcon(config, language, show_settings, show_about, enable_safeeyes, disable_safeeyes, on_quit)
|
||||
break_screen = BreakScreen(on_skipped, on_postponed, break_screen_glade, style_sheet_path)
|
||||
break_screen.initialize(config, language)
|
||||
core = SafeEyesCore(show_notification, show_alert, close_alert, on_countdown, tray_icon.next_break_time)
|
||||
core = SafeEyesCore(context, show_notification, show_alert, close_alert, on_countdown, tray_icon.next_break_time)
|
||||
core.initialize(config, language)
|
||||
core.start()
|
||||
notification = Notification(language)
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Zrušit",
|
||||
"disable": "Pozastavit Safe Eyes",
|
||||
"enable": "Povolit Safe Eyes",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "Na {} hodinu",
|
||||
"for_x_hours": "Na {} hodiny",
|
||||
"for_x_minutes": "Na {} minut",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Povinná přestávka (Skrýt tlačítko pro přeskočení)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Čas k přípravě na přestávku (v sekundách)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Do restartu"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Abbrechen",
|
||||
"disable": "Safe Eyes deaktivieren",
|
||||
"enable": "Safe Eyes aktivieren",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "Für {} Stunde",
|
||||
"for_x_hours": "Für {} Stunden",
|
||||
"for_x_minutes": "Für {} Minuten",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Strikte Pause (Überspringen nicht möglich)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Zeit zur Vorbereitung für die Pause (in Sekunden)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Bis zum Neustart"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Cancel",
|
||||
"disable": "Disable Safe Eyes",
|
||||
"enable": "Enable Safe Eyes",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "For {} Hour",
|
||||
"for_x_hours": "For {} Hours",
|
||||
"for_x_minutes": "For {} Minutes",
|
||||
|
@ -44,8 +45,7 @@
|
|||
"strict_break": "Strict break (Hide skip button)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Time to prepare for break (in seconds)",
|
||||
"until_restart": "Until restart",
|
||||
"time_to_screen_lock": "Lock screen if break is longer than (in seconds)",
|
||||
"enable_screen_lock": "Enable screen lock for long breaks"
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Until restart"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Cancelar",
|
||||
"disable": "Desactivar Safe Eyes",
|
||||
"enable": "Activar Safe Eyes",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "Durante {} hora",
|
||||
"for_x_hours": "Durante {} horas",
|
||||
"for_x_minutes": "Durante {} minutos",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Pausa estricta (No hay botón Cancelar)",
|
||||
"system_language": "Idioma del sistema",
|
||||
"time_to_prepare_for_break": "Tiempo para prepararse para una pausa (en segundos)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Hasta reinicio"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Annuler",
|
||||
"disable": "Désactiver Safe Eyes",
|
||||
"enable": "Activer Safe Eyes",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "Pendant {} heure",
|
||||
"for_x_hours": "Pendant {} heures",
|
||||
"for_x_minutes": "Pendant {} minutes",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Pause stricte (cacher le bouton Ignorer)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Temps de préparation à une pause (en secondes)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Jusqu'au redémarrage"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "უარყოფა",
|
||||
"disable": "Safe Eyes გამორთვა",
|
||||
"enable": "Safe Eyes ჩართვა",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "{} საათით",
|
||||
"for_x_hours": "{} საათით",
|
||||
"for_x_minutes": "{} საათით",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "აუცილებელი შესვენება (დავმალოთ ღილაკი 'გამოტოვება')",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "შესვენებისთვის მოსამზადებელი დრო (წამებში)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "შემდეგ რესტარტამდე"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "रखना नहीं",
|
||||
"disable": "सेफ आईज बंद",
|
||||
"enable": "सेफ आईज शुरू",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "{} घंटे के लिए",
|
||||
"for_x_hours": "{} घंटों के लिए",
|
||||
"for_x_minutes": "{} मिन्टों के लिए",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "जरूरी आराम (रोक नहीं सकते)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "कितने पलों पहले बताएं",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "अगले आरम्भ तक"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Mégse",
|
||||
"disable": "Disable Safe Eyes",
|
||||
"enable": "Safe Eyes Bekapcsolása",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "For {} Hour",
|
||||
"for_x_hours": "For {} Hours",
|
||||
"for_x_minutes": "For {} Minutes",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Kötelezők a szünetek? (nincs átugrás gomb)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Szünet előtti figyelmeztetés (másodperc)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Until restart"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Batal",
|
||||
"disable": "Matikan Safe Eyes",
|
||||
"enable": "Hidupkan Safe Eyes",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "Selama {} Jam",
|
||||
"for_x_hours": "Selama {} Jam",
|
||||
"for_x_minutes": "Selama {} Menit",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Paksa istirahat (sembunyikan tombol Lewati)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Waktu persiapan istirahat (dalam detik)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Hingga dijalankan ulang"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Cancelar",
|
||||
"disable": "Desativar Safe Eyes",
|
||||
"enable": "Habilitar Safe Eyes",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "Por {} Hora",
|
||||
"for_x_hours": "Por {} Horas",
|
||||
"for_x_minutes": "Por {} Minutos",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Pausa rigorosa (Esconder botão pular)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Tempo para se preparar para a pausa (em segundos)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Até reiniciar"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Отменить",
|
||||
"disable": "Отключить Safe Eyes",
|
||||
"enable": "Активировать Safe Eyes",
|
||||
"enable_screen_lock": "Включить блокировку экрана",
|
||||
"for_x_hour": "На {} час",
|
||||
"for_x_hours": "На {} часов",
|
||||
"for_x_minutes": "На {} минут",
|
||||
|
@ -44,8 +45,7 @@
|
|||
"strict_break": "Обязательный перерыв (Скрыть кнопку 'Пропустить')",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Время подготовки в перерыву (в секундах)",
|
||||
"until_restart": "До перезагрузки",
|
||||
"time_to_screen_lock": "Заблокировать экран если перерыв дольше(в секундах)",
|
||||
"enable_screen_lock": "Включить блокировку экрана"
|
||||
"until_restart": "До перезагрузки"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "Zrušiť",
|
||||
"disable": "Zakázať Safe Eyes",
|
||||
"enable": "Povoliť Safe Eyes",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "Počas {} hodiny",
|
||||
"for_x_hours": "Počas {} hodín",
|
||||
"for_x_minutes": "Počas {} minút",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Povinná prestávka (Skryje tlačitko Preskočiť)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Čas na prípravu na prestávku (v sekundách)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Do reštartu"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "ரத்து",
|
||||
"disable": "Safe Eyes ஐ நிறுத்துக",
|
||||
"enable": "Safe Eyes ஐ செயல்படுத்துக",
|
||||
"enable_screen_lock": "நீண்ட கால இடைவேளைகளின் பின்னர் திரையை பூட்டுக",
|
||||
"for_x_hour": "{} மணித்தியாலத்திற்கு",
|
||||
"for_x_hours": "{} மணித்தியாலங்களுக்கு",
|
||||
"for_x_minutes": "{} நிமிடங்களுக்கு",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "கட்டாய இடைவேளை (தவிர்க்கும் பொத்தான் காண்பிக்கப்பட மாட்டாது)",
|
||||
"system_language": "இயங்குதள மொழி",
|
||||
"time_to_prepare_for_break": "இடைவேளைக்கு தயாராக தேவைப்படும் நேரம் (விநாடிகளில்)",
|
||||
"time_to_screen_lock": "திரையினை பூட்டாமல் இடைவேளையை தவிர்ப்பதற்கான அதிகபட்ச நேரம் (விநாடிகளில்)",
|
||||
"until_restart": "மீள ஆரம்பிக்கும் வரைை"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"cancel": "İptal",
|
||||
"disable": "Safe Eyes'ı devre dışı bırak",
|
||||
"enable": "Safe Eyes'ı etkinleştir",
|
||||
"enable_screen_lock": "Lock the screen after every long break",
|
||||
"for_x_hour": "{} Saat",
|
||||
"for_x_hours": "{} Saat",
|
||||
"for_x_minutes": "{} Dakika",
|
||||
|
@ -44,6 +45,7 @@
|
|||
"strict_break": "Kesin mola (Geç düğmesini gizler)",
|
||||
"system_language": "System Language",
|
||||
"time_to_prepare_for_break": "Mola için hazırlanma zamanı (saniye)",
|
||||
"time_to_screen_lock": "Maximum time to skip, bypassing the lock screen (in seconds)",
|
||||
"until_restart": "Tekrar başlatılana kadar"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
"config_version": 4
|
||||
},
|
||||
"break_interval": 15,
|
||||
"enable_screen_lock": true,
|
||||
"long_break_duration": 60,
|
||||
"no_of_short_breaks_per_long_break": 5,
|
||||
"pre_break_warning_time": 10,
|
||||
|
@ -12,6 +13,7 @@
|
|||
"strict_break": false,
|
||||
"audible_alert": false,
|
||||
"language": "system",
|
||||
"time_to_screen_lock": 5,
|
||||
"active_window_class": {
|
||||
"skip_break": [],
|
||||
"take_break": []
|
||||
|
|
|
@ -376,7 +376,7 @@
|
|||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="top_attach">9</property>
|
||||
<property name="top_attach">11</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -389,6 +389,32 @@
|
|||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">11</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkLabel" id="lbl_enable_screen_lock">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Lock the screen after every long break</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">9</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="switch_screen_lock">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<signal name="activate" handler="on_switch_screen_lock_activate" swapped="no"/>
|
||||
<signal name="state-set" handler="on_switch_screen_lock_activate" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="top_attach">9</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
@ -398,11 +424,11 @@
|
|||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Lock screen if break is longer than (in seconds)</property>
|
||||
<property name="label" translatable="yes">Maximum time to skip, bypassing the lock screen (in seconds)</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">11</property>
|
||||
<property name="top_attach">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -419,31 +445,6 @@
|
|||
<property name="update_policy">if-valid</property>
|
||||
<property name="value">1</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="top_attach">11</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="lbl_enable_screen_lock">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Enable screen lock for long breaks</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="switch_screen_lock">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<signal name="activate" handler="on_switch_screen_lock_activate" swapped="no"/>
|
||||
<signal name="state-set" handler="on_switch_screen_lock_activate" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="top_attach">10</property>
|
||||
|
|
Loading…
Reference in New Issue