Initial commit

master
Zhang Yueqian 2 years ago
commit ee1c2416f2
  1. 1
      .gitignore
  2. 12
      .vscode/settings.json
  3. 5
      backend/50-medr-dpms.conf
  4. 22
      backend/medr-lightdm-dpms-disable
  5. 51
      backend/medr-lightdm-dpms-enable
  6. 123
      backend/medr-screensaver-backend.py
  7. 23
      command/medr-screensaver-command.py
  8. 113
      dialog/medr-screensaver-dialog.py

1
.gitignore vendored

@ -0,0 +1 @@
/venv/

@ -0,0 +1,12 @@
{
"python.formatting.provider": "black",
"python.formatting.blackPath": "/home/zos/ohos_env/bin/black",
"syncmate.dest": "/home/antiy/",
"syncmate.enabled": true,
"syncmate.user": "antiy",
"syncmate.verbose": true,
"syncmate.host": "localhost:10022",
"sync-rsync.onSaveIndividual": true,
"sync-rsync.remote": "antiy@localhost:/home/antiy/",
"sync-rsync.shell": "ssh -p 10022"
}

@ -0,0 +1,5 @@
# 本文件需安装在 /etc/lightdm/lightdm.conf.d/ 目录下
[SeatDefaults]
display-setup-script=/usr/local/bin/medr-lightdm-dpms-enable
session-setup-script=/usr/local/bin/medr-lightdm-dpms-disable

@ -0,0 +1,22 @@
#!/bin/bash
###
# @Author: Zhang Yueqian zhangyueqian@antiy.cn
# @Date: 2022-11-01 10:24:40
# @LastEditors: Zhang Yueqian zhangyueqian@antiy.cn
# @LastEditTime: 2022-11-01 10:28:04
# @FilePath: /screensaver/backend/medr-lightdm-dpms-disable
# @Description: 在lightdm(greeter)登陆之后禁用屏幕休眠功能
#
# 本程序需安装在 /usr/local/bin/ 目录下, 配置到 /etc/lightdm/50-medr-dpms.conf 文件中
###
# 入口函数, 调用xset
function main() {
# 等待X启动(大概?)
sleep 10
# 将超时配置设为0(禁用)
xset dpms 0 0 0
}
main &

@ -0,0 +1,51 @@
#!/bin/bash
###
# @Author: Zhang Yueqian zhangyueqian@antiy.cn
# @Date: 2022-11-01 09:47:56
# @LastEditors: Zhang Yueqian zhangyueqian@antiy.cn
# @LastEditTime: 2022-11-01 13:45:07
# @FilePath: /screensaver/backend/medr-lightdm-dpms-enable
# @Description: 在lightdm(greeter)界面启用屏幕休眠功能
#
# 本程序需安装在 /usr/local/bin/ 目录下, 配置到 /etc/lightdm/50-medr-dpms.conf 文件中
###
# 休眠时间设置文件路径
TIMEOUT_FILE=/var/run/medr-lightdm
# 默认休眠时间(分钟)
DEFAULT_TIMEOUT=10
# 确认文件存在
if [ ! -f $TIMEOUT_FILE ]; then
touch $TIMEOUT_FILE
fi
# 获取休眠超时配置, 如果未设置或设置格式非数字, 则返回默认配置 $DEFAULT_TIMEOUT
function get_timeout() {
# 首先保证TIMEOUT文件可被修改
chmod 777 $TIMEOUT_FILE
# 读取TIMEOUT内容并确认为数字
TIMEOUT=$(cat $TIMEOUT_FILE)
case $TIMEOUT in
'' | *[!0-9]*) echo $DEFAULT_TIMEOUT ;;
*) echo $TIMEOUT ;;
esac
}
# 入口函数, 读取设置并调用xset
function main() {
# 读取超时配置并转换为秒
TIMEOUT=$(get_timeout)
TIMEOUT=$((TIMEOUT * 60))
# 必须的, 似乎是需要等待X启动
sleep 10
# 利用X的dpms功能触发屏幕休眠
xset dpms 0 0 $TIMEOUT
}
main &

@ -0,0 +1,123 @@
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
"""
Author: Zhang Yueqian zhangyueqian@antiy.cn
Date: 2022-10-31 11:20:48
LastEditors: Zhang Yueqian zhangyueqian@antiy.cn
LastEditTime: 2022-10-31 11:34:00
FilePath: /screensaver/backend/medr-screensaver-backend.py
Description: 屏保程序 for MEDR项目. 本文件为后台监控的部分.
原理: 主要负责实现两部分功能
1. 通过dbus方法提供开始菜单中的锁屏功能
2. 通过监听org.gnome.SessionManager.Presence的StatusChanged信号完成自动锁屏功能
以上两种锁屏通过调用 medr-screensaver-command 来实现, 提供不同的参数 `--session-idle` `--lock`
另外: 对于锁屏情况下的黑屏时长, 需要控制lightdm配置实现, 参考
https://askubuntu.com/questions/403859/how-to-control-lightdm-power-saving-preferences
利用额外的文件 /var/run/medr-lightdm 来设置
"""
from datetime import datetime
import threading
from time import sleep
import dbus
import dbus.service
import dbus.glib
import os
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GObject, Gio
BUS_NAME = "org.ukui.ScreenSaver"
TIMEOUT_FILE = "/var/run/medr-lightdm"
DEFAULT_TIMEOUT = 10
class Service(dbus.service.Object):
"""锁屏dbus服务"""
def __init__(self, bus_name, obj_path):
"""使用bus_name和obj_path初始化dbus服务
Args:
bus_name (dbus.service.BusName): 要注册的bus名
obj_path (str): 要注册的路径
"""
dbus.service.Object.__init__(self, bus_name, obj_path)
self._locked = False
@dbus.service.method(BUS_NAME, in_signature="", out_signature="b")
def GetLockState(self):
print(" sending out lockstate: ", self._state)
return self._state
@dbus.service.method(BUS_NAME, in_signature="b", out_signature="")
def SetLockState(self, state):
print(" got lock state:", state)
self._state = state
@dbus.service.method(BUS_NAME, in_signature="", out_signature="")
def Lock(self):
print(" lock command called!")
os.system("ukui-screensaver-dialog --lock")
@dbus.service.method(BUS_NAME, in_signature="", out_signature="")
def Quit(self):
print(" got quit request.")
self._loop.quit()
@dbus.service.signal(BUS_NAME)
def SessionIdle(self):
print(" signal triggered")
os.system("wall session idle triggerd!")
os.system("ukui-screensaver-dialog --session-idle")
loop = GObject.MainLoop()
bus = dbus.SessionBus()
bus_name = dbus.service.BusName(BUS_NAME, bus=bus)
service = Service(bus_name, "/")
def sessionStatusChanged(sessionStatus):
print("---- Caught signal ----")
if sessionStatus == 3:
service.SessionIdle()
print("\n")
def checkSessionIdle():
"""检查gsettings中配置的会话闲置时间并写入到配置文件 TIMEOUT_FILE 中"""
while True:
mate_session = Gio.Settings("org.mate.session")
sys_timeout = mate_session.get_value("idle-delay").get_int32()
with open(TIMEOUT_FILE, "r") as fp:
try:
medr_timeout = int(fp.read())
except ValueError:
medr_timeout = DEFAULT_TIMEOUT
if medr_timeout != sys_timeout:
with open(TIMEOUT_FILE, "w") as fp:
fp.write("%s" % sys_timeout)
sleep(5)
t = threading.Thread(target=checkSessionIdle)
if __name__ == "__main__":
bus.add_signal_receiver(
sessionStatusChanged, dbus_interface="org.gnome.SessionManager.Presence", signal_name="StatusChanged"
)
# org.gnome.SessionManager.Presence:StatusChanged
t.start()
loop.run()

@ -0,0 +1,23 @@
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
"""
Author: Zhang Yueqian zhangyueqian@antiy.cn
Date: 2022-10-31 11:32:15
LastEditors: Zhang Yueqian zhangyueqian@antiy.cn
LastEditTime: 2022-10-31 11:38:24
FilePath: /screensaver/command/medr-screensaver-command.py
Description: 屏保程序 for MEDR项目. 本文件为提供命令行交互功能的部分.
"""
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GObject, Gio
def monitorSessionIdle():
pass
if __name__ == "__main__":
pass

@ -0,0 +1,113 @@
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
"""
Author: Zhang Yueqian zhangyueqian@antiy.cn
Date: 2022-10-31 11:32:24
LastEditors: Zhang Yueqian zhangyueqian@antiy.cn
LastEditTime: 2022-10-31 11:34:16
FilePath: /screensaver/dialog/medr-screensaver-dialog.py
Description: 屏保程序 for MEDR项目. 本文件为负责锁屏的部分.
提供实际锁屏功能, 支持两个参数: --lock --session-idle
锁屏包括两个含义: 熄灭屏幕 & 触发lightdm锁定
--lock: 熄灭屏幕并直接锁定lightdm
--session-idle: 首先熄灭屏幕, 然后根据系统设置, 如果系统设置为idle后锁屏则锁屏
"""
from argparse import ArgumentParser
from multiprocessing.managers import BaseManager
import os, socket
MEDR_PIPE = "/tmp/medr-screensaver.sock"
_command = []
def parse_args():
argparser = ArgumentParser(add_help=False)
argparser.add_argument("-h", "--help", dest="help", action="store_true", help="Show this message and exit.")
argparser.add_argument("-l", "--lock", dest="lock", action="store_true", help="Locks the screen.")
argparser.add_argument(
"--session-idle", dest="session_idle", action="store_true", help="Activated by session idle signal."
)
argparser.add_argument(
"--screensaver",
dest="screensaver",
action="store_true",
help="Locks the screen and shows screensaver immediatelly.",
)
return argparser.parse_args(), argparser.format_help()
def action(args, help):
if args.help:
print(help)
return
if args.lock:
os.system("dm-tool lock")
return
if args.session_idle:
# if idle-lock checked, locks
return
if args.screensaver:
os.system("xset dpms force off")
return
print(help)
def get_command():
return _command
def singleton():
# 通过client连接已有的BaseManager, 如果失败则自己启动一个, 成功则退出
BaseManager.register("medr-screensaver")
m = BaseManager(address=("127.0.0.1", 5000), authkey=b"medr-screensaver")
try:
print("Trying connect to %s" % m)
m.connect()
except Exception as e:
print(e)
else:
print("Failed, trying start server")
BaseManager.register("medr-screensaver", callable=get_command)
m = BaseManager(address=("127.0.0.1", 5000), authkey=b"medr-screensaver")
m.start()
# 必须先删除
# try:
# os.unlink(MEDR_PIPE)
# except OSError:
# if os.path.exists(MEDR_PIPE):
# raise
# 指定协议
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
server.bind(MEDR_PIPE)
except socket.error as e:
# running
print("Error: ", e)
print("Running")
finally:
# 监听
server.listen(1)
clientsocket, address = server.accept()
# 接收消息
data = clientsocket.recv(1024)
print(data)
# 关闭socket
clientsocket.close()
server.close()
if __name__ == "__main__":
args, msg = parse_args()
# singleton()
action(args, msg)
Loading…
Cancel
Save