136 lines
5.2 KiB
Python
136 lines
5.2 KiB
Python
#!/usr/bin/env python
|
|
# Safe Eyes is a utility to remind you to take break frequently
|
|
# to protect your eyes from eye strain.
|
|
|
|
# Copyright (C) 2017 Gobinath
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
"""
|
|
Screensaver plugin locks the desktop using native screensaver application, after long breaks.
|
|
"""
|
|
|
|
import gi
|
|
import logging
|
|
import os
|
|
|
|
from safeeyes import Utility
|
|
from safeeyes.model import TrayAction
|
|
gi.require_version('Gtk', '3.0')
|
|
from gi.repository import Gtk
|
|
|
|
context = None
|
|
lock_screen = False
|
|
user_locked_screen = False
|
|
lock_screen_command = None
|
|
min_seconds = 0
|
|
seconds_passed = 0
|
|
tray_icon_path = None
|
|
|
|
|
|
def __lock_screen_command():
|
|
"""
|
|
Function tries to detect the screensaver command based on the current envinroment
|
|
Possible results:
|
|
Gnome, Unity, Budgie: ['gnome-screensaver-command', '--lock']
|
|
Cinnamon: ['cinnamon-screensaver-command', '--lock']
|
|
Pantheon, LXDE: ['light-locker-command', '--lock']
|
|
Mate: ['mate-screensaver-command', '--lock']
|
|
KDE: ['qdbus', 'org.freedesktop.ScreenSaver', '/ScreenSaver', 'Lock']
|
|
XFCE: ['xflock4']
|
|
Otherwise: None
|
|
"""
|
|
desktop_session = os.environ.get('DESKTOP_SESSION')
|
|
current_desktop = os.environ.get('XDG_CURRENT_DESKTOP')
|
|
if desktop_session is not None:
|
|
desktop_session = desktop_session.lower()
|
|
if ('xfce' in desktop_session or desktop_session.startswith('xubuntu') or (current_desktop is not None and 'xfce' in current_desktop)) and Utility.command_exist('xflock4'):
|
|
return ['xflock4']
|
|
elif desktop_session == 'cinnamon' and Utility.command_exist('cinnamon-screensaver-command'):
|
|
return ['cinnamon-screensaver-command', '--lock']
|
|
elif (desktop_session == 'pantheon' or desktop_session.startswith('lubuntu')) and Utility.command_exist('light-locker-command'):
|
|
return ['light-locker-command', '--lock']
|
|
elif desktop_session == 'mate' and Utility.command_exist('mate-screensaver-command'):
|
|
return ['mate-screensaver-command', '--lock']
|
|
elif desktop_session == 'kde' or 'plasma' in desktop_session or desktop_session.startswith('kubuntu') or os.environ.get('KDE_FULL_SESSION') == 'true':
|
|
return ['qdbus', 'org.freedesktop.ScreenSaver', '/ScreenSaver', 'Lock']
|
|
elif desktop_session in ['gnome', 'unity', 'budgie-desktop'] or desktop_session.startswith('ubuntu'):
|
|
if Utility.command_exist('gnome-screensaver-command'):
|
|
return ['gnome-screensaver-command', '--lock']
|
|
# From Gnome 3.8 no gnome-screensaver-command
|
|
return ['dbus-send', '--type=method_call', '--dest=org.gnome.ScreenSaver', '/org/gnome/ScreenSaver', 'org.gnome.ScreenSaver.Lock']
|
|
elif os.environ.get('GNOME_DESKTOP_SESSION_ID'):
|
|
if 'deprecated' not in os.environ.get('GNOME_DESKTOP_SESSION_ID') and Utility.command_exist('gnome-screensaver-command'):
|
|
# Gnome 2
|
|
return ['gnome-screensaver-command', '--lock']
|
|
return None
|
|
|
|
|
|
def __lock_screen():
|
|
global user_locked_screen
|
|
user_locked_screen = True
|
|
|
|
|
|
def init(ctx, safeeyes_config, plugin_config):
|
|
"""
|
|
Initialize the screensaver plugin.
|
|
"""
|
|
global context
|
|
global lock_screen_command
|
|
global min_seconds
|
|
global tray_icon_path
|
|
logging.debug('Initialize Screensaver plugin')
|
|
context = ctx
|
|
min_seconds = plugin_config['min_seconds']
|
|
tray_icon_path = os.path.join(plugin_config['path'], "resource/lock.png")
|
|
if plugin_config['command']:
|
|
lock_screen_command = plugin_config['command'].split()
|
|
else:
|
|
lock_screen_command = __lock_screen_command()
|
|
|
|
|
|
def on_start_break(break_obj):
|
|
"""
|
|
Determine the break type and only if it is a long break, enable the lock_screen flag.
|
|
"""
|
|
global lock_screen
|
|
global seconds_passed
|
|
global user_locked_screen
|
|
user_locked_screen = False
|
|
seconds_passed = 0
|
|
if lock_screen_command:
|
|
lock_screen = break_obj.is_long_break()
|
|
|
|
|
|
def on_countdown(countdown, seconds):
|
|
"""
|
|
Keep track of seconds passed from the beginning of long break.
|
|
"""
|
|
global seconds_passed
|
|
seconds_passed = seconds
|
|
|
|
|
|
def on_stop_break():
|
|
"""
|
|
Lock the screen after a long break if the user has not skipped within min_seconds.
|
|
"""
|
|
if user_locked_screen or (lock_screen and seconds_passed >= min_seconds):
|
|
Utility.execute_command(lock_screen_command)
|
|
|
|
|
|
def get_tray_action(break_obj):
|
|
return TrayAction.build("Lock screen",
|
|
tray_icon_path,
|
|
Gtk.STOCK_DIALOG_AUTHENTICATION,
|
|
__lock_screen)
|