고쳐 쓰다

고쳐 쓰다

i3 window manager저는 Ubuntu에서 i3blocks디스플레이를 위해 with를 사용하고 있습니다 i3bar. 주의가 필요한 경우(예: 배터리 잔량)에도 데스크톱 알림이 필요합니다. 이를 달성하기 위해 "구성"에서 해당 블록의 속성에 있는 명령을 사용합니다 notify-send --urgency=critical.commandi3blocks

[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";

실행한 후 포커스 창을 변경하고 전체 화면으로 전환하면 두 개의 알림이 표시됩니다.


다음은 몇 가지 추가 정보입니다.

리눅스:우분투 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다시 시작할 때마다 소켓에 대한 연결이 끊어지므로 스크립트가 다시 시작됩니다. 여기서 잘못된 점을 발견하면 지적해주세요.

관련 정보