修正する

修正する

i3 window manager私はUbuntuでi3blocksディスプレイにwithを使用していますi3bar。注意が必要な場合(バッテリー残量など)にもデスクトップ通知が必要です。これを達成するために、「構成」でそのブロックの属性にあるコマンドを使用しますnotify-send --urgency=criticalcommandi3blocks

[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再起動するたびにソケットへの接続が切断されるため、スクリプトが再起動されます。ここで間違った点が見つかったら指摘してください。

おすすめ記事