이미 열린 파일에서 호출되면 okular는 단순히 다른 인스턴스를 시작합니다. 예를 들어 LaTeX 문서를 컴파일하고 뷰어를 반복적으로 시작할 때 또는 단순히 파일을 여는 것을 잊었다가 파일 관리자에서 다시 열 때 복잡해집니다.
반대로 Evince는 이것을 감지하고 대신 기존 창을 올립니다.
okular로 이것을 달성하는 방법은 무엇입니까?
여기에 빠르고 더러운 트릭이 있습니다. 기존 인스턴스 만 확인하는 Python 스크립트입니다.
사용하려면 이 스크립트의 이름 /usr/bin/okular
을 ./usr/bin/okular.real
/usr/bin/okular
#! /usr/bin/env python3
import subprocess
import sys
import os
import getpass
OKULAR_FN = "okular.real"
def get_okular_instance(filename) :
try :
lproc = subprocess.check_output(["ps", "-C", OKULAR_FN, "-o", "pid,user,args", "--no-headers"], universal_newlines=True).splitlines()
except subprocess.CalledProcessError :
return []
result = []
me = getpass.getuser()
for proc in lproc :
pid, user, _, args = proc.split(maxsplit=3)
if user == me and args == filename :
result.append(pid)
return result
def get_window_id(pid) :
fenetres = subprocess.check_output(["wmctrl", "-ulp"], universal_newlines=True)
for f in fenetres.splitlines() :
donnees = f.split()
if len(donnees) < 3 :
continue
if donnees[2] == pid :
return donnees[0]
return None
def raise_window(wid) :
subprocess.call(["wmctrl", "-i", "-a", wid])
def runcmd(cmdl) :
subprocess.Popen(cmdl, stdin=None, stdout=None, stderr=None, close_fds=True)
def main() :
if len(sys.argv) < 2 :
runcmd([OKULAR_FN])
else :
filename = os.path.abspath(sys.argv[1])
pidl = get_okular_instance(filename)
if len(pidl) != 1 :
runcmd([OKULAR_FN, filename])
else :
wid = get_window_id(pidl[0])
if wid is None :
runcmd([OKULAR_FN, filename])
else :
raise_window(wid)
if __name__ == "__main__" :
main()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다