commit
ee1c2416f2
8 changed files with 350 additions and 0 deletions
@ -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…
Reference in new issue