更新

更新

i3 window manager我在 Ubuntu 上使用withi3blocks来显示i3bar.当有事情需要我注意时(例如电池电量),我也需要桌面通知。为了达到此目的,我在“配置”中相应块的属性notify-send --urgency=critical中使用命令:commandi3blocks

[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事件(在我们的例子中是“窗口更改了全屏模式”)并将回调连接到该事件(发送SIGCONTto 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重新启动时,与套接字的连接都会丢失,因此脚本也会重新启动。如果您发现这里有任何缺陷,请指出。

相关内容