
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";
실행한 후 포커스 창을 변경하고 전체 화면으로 전환하면 두 개의 알림이 표시됩니다.
다음은 몇 가지 추가 정보입니다.
리눅스:우분투 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
다시 시작할 때마다 소켓에 대한 연결이 끊어지므로 스크립트가 다시 시작됩니다. 여기서 잘못된 점을 발견하면 지적해주세요.