Enhance lock screen after long breaks

This commit is contained in:
Gobinath 2017-04-08 20:29:51 -04:00
parent 8c81ca5742
commit 7015c97c47
21 changed files with 198 additions and 100 deletions

View File

@ -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)

View File

@ -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:

View File

@ -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()

View File

@ -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)

View File

@ -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)

View File

@ -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"
}
}

View File

@ -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"
}
}

View File

@ -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"
}
}

View File

@ -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"
}
}

View File

@ -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"
}
}

View File

@ -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": "შემდეგ რესტარტამდე"
}
}

View File

@ -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": "अगले आरम्भ तक"
}
}

View File

@ -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"
}
}

View File

@ -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"
}
}

View File

@ -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"
}
}

View File

@ -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": "До перезагрузки"
}
}

View File

@ -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"
}
}

View File

@ -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": "மீள ஆரம்பிக்கும் வரைை"
}
}

View File

@ -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"
}
}

View File

@ -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": []

View File

@ -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>