i3 window manager
私はUbuntuでi3blocks
ディスプレイにwithを使用していますi3bar
。注意が必要な場合(バッテリー残量など)にもデスクトップ通知が必要です。これを達成するために、「構成」でそのブロックの属性にあるコマンドを使用しますnotify-send --urgency=critical
。command
i3blocks
[test]
full_text=Test
command=notify-send --urgency=critical "Test" "Test"
interval=2
期待どおりに動作します一部のウィンドウがフルスクリーンモードでない場合。その場合、全画面が終了するまで通知の表示は停止します。
100%確信することはできませんがi3blocks
--- 99%程度です。なぜ?端末で実行すると、すべてが期待どおりに実行されるためです。たとえば、次のシェルスクリプトを試してみてください。
sleep 5;
notify-send --urgency=critical "Test" "Test";
sleep 2;
notify-send --urgency=critical "Test" "Test";
実行後にフォーカスウィンドウを変更してフルスクリーンに切り替えると、2つの通知が表示されます。
以下は、いくつかの追加情報です。
Linux:Ubuntu 16.04
ウィンドウマネージャ: i3
デーモンに通知: ダンスト
私のドットファイル(dunst、i3blocks、i3など)を提供できますが、前述のようにシェルスクリプトから通知を送信すると、すべてが正常です。
修正する
i3blocks
フルスクリーンブロックの更新が完全に中断されたようです!次のブロックレットを使用してテストしました。
[test]
full_text=Test
command=echo "Test" >> ~/Temp/test
interval=2
端末を全画面表示した後、ファイルの更新が停止します。
助けてください。
答え1
私は依存する解決策を見つけました。i3
産業制御契約。これにより、ユーザーはi3
外部世界と対話することができます。たとえば、ユーザーはi3
イベント(この場合は「ウィンドウがフルスクリーンモードに変わります」)を購読し、そのイベントにコールバックを関連付けることができます(SIGCONT
に送信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
再起動するたびにソケットへの接続が切断されるため、スクリプトが再起動されます。ここで間違った点が見つかったら指摘してください。