i3 window manager
我在 Ubuntu 上使用withi3blocks
来显示i3bar
.当有事情需要我注意时(例如电池电量),我也需要桌面通知。为了达到此目的,我在“配置”中相应块的属性notify-send --urgency=critical
中使用命令:command
i3blocks
[test]
full_text=Test
command=notify-send --urgency=critical "Test" "Test"
interval=2
它按预期工作除非某些窗口处于全屏模式。如果是这样,通知将停止显示,直到退出全屏。
我不能 100% 确定它大约是i3blocks
--- 只有 99%。为什么?因为如果从终端执行,一切都会按预期运行。例如,尝试这个 shell 脚本:
sleep 5;
notify-send --urgency=critical "Test" "Test";
sleep 2;
notify-send --urgency=critical "Test" "Test";
执行后,只需更改焦点窗口并将其转为全屏 - 您将看到两个通知。
这是一些附加信息:
Linux:Ubuntu 16.04
窗口管理器: i3
通知守护进程:邓斯特
我可以提供我的点文件(dunst、i3blocks、i3 等),但正如我所说,如果我从 shell 脚本抛出通知,一切都很好。
更新
看来完全i3blocks
停止更新全屏块了!我已经通过以下 blocklet 对其进行了测试:
[test]
full_text=Test
command=echo "Test" >> ~/Temp/test
interval=2
并且在全屏显示终端后,该文件停止更新。
请帮忙。
答案1
我找到了一个依赖于的解决方案i3
工控协议。它允许用户i3
与外部世界进行交互。例如,用户可以订阅一个i3
事件(在我们的例子中是“窗口更改了全屏模式”)并将回调连接到该事件(发送SIGCONT
to i3blocks
)。
有几个为不同 PL 编写的库(请参阅 i3 IPC 文档中的第 5 部分),它们提供了该协议的用户界面。我选择了Python
一。这是代码:
#!/usr/bin/env python3
import subprocess, os, signal
from i3ipc import Event, Connection
def on_fullscreen( i3, e ) :
"""
A callback which is called every time a window
changes its fullscreen mode
"""
try :
process = subprocess.Popen( ['pgrep', 'i3blocks'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True )
pid = int( process.stdout.readline().split()[0] )
os.kill( pid, signal.SIGCONT )
except :
i3.main_quit()
i3 = Connection()
i3.on( Event.WINDOW_FULLSCREEN_MODE, on_fullscreen )
i3.main()
我将此代码放入名为 的 python 脚本中i3blocks_awake.py
。现在我们需要做的就是每次i3
启动时执行这个脚本。所以从i3
文档我们知道这exec_always
就是我们所需要的。所以我将以下行放入我的i3
配置文件中(在最后):
exec_always --no-startup-id '/home/lrdprdx/.config/i3/i3block_awake.py'
重新启动i3
,瞧,我的所有通知都按预期工作。
我认为这不是 100% 安全和聪明的解决方案,但它确实有效。例如,每次i3
重新启动时,与套接字的连接都会丢失,因此脚本也会重新启动。如果您发现这里有任何缺陷,请指出。