nemo에서 선택한 파일을 열기 위해 다음 스크립트(단축키에 바인딩되어 있음)를 사용하고 있습니다(단축키를 사용한 후 창을 클릭하세요). 그것이 하는 일은 창 ID에서 프로세스 ID를 얻은 다음(창을 클릭한 후) 이를 사용하여 pid에 속하는 파일 경로를 얻는 것입니다. 파일 경로를 얻은 후 nemo를 사용하여 파일을 엽니다.
#!/bin/bash
WINDOW_ID=$(xdotool getactivewindow)
PID_OF_ACTIVE_WINDOW=$(xdotool getwindowpid $WINDOW_ID)
MY_COMMAND_PATH=$(ps -p $PID_OF_ACTIVE_WINDOW -o command)
# https://stackoverflow.com/q/76028252/1772898
if printf -- '%s\n' "$MY_COMMAND_PATH" | grep -qoP '(file://)?(?<!\w)/(?!usr/).*?\.\w{3,4}+'; then
nemo "$(printf -- '%s\n' "$MY_COMMAND_PATH" | grep -oP '(file://)?(?<!\w)/(?!usr/).*?\.\w{3,4}+')"
fi
그런데 문제는 엽산이다. 그것은 사용한다여러 창에 대해 동일한 프로세스. 여러 개의 .epub 파일을 열면 여러 개의 창이 나타납니다. 그러나 모든 창에는 PID가 있습니다.
% xdotool getwindowpid 59418676
15977
% xdotool getwindowpid 59422435
15977
% ps -aux | grep 15977
ismail 15977 0.1 0.7 95405880 128992 ? Sl May05 10:23 /usr/bin/gjs /usr/bin/com.github.johnfactotum.Foliate /media/ismail/SSDWorking/book-collection/_Books/self-development-anxiety-self-talk/child/Freeing Your Child from Anxiety Powerful, Practical Solutions to Overcome Your Childs Fears, Worries, and Phobias (Tamar Chansky Ph.D.).epub
% readlink -f /proc/15977/exe
/usr/bin/gjs-console
저는 Gnome 3을 사용하는 Zorin OS 16.2를 사용하고 있습니다.
다른 파일에 대한 경로를 얻을 수 있는지 확인하기 위해 하위 프로세스를 확인했지만 별로 도움이 되지 않았습니다.
% pgrep -P 15977
15995
15998
16011
139458
139662
% ps -p 15995 -o command
COMMAND
/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitNetworkProcess 7 16
% ps -p 15998 -o command
COMMAND
/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitNetworkProcess 8 19
% ps -p 16011 -o command
COMMAND
/usr/bin/bwrap --args 29 -- /usr/bin/xdg-dbus-proxy --args=26
% ps -p 139458 -o command
COMMAND
/usr/bin/bwrap --args 58 -- /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess 59 54
% ps -p 139662 -o command
COMMAND
/usr/bin/bwrap --args 62 -- /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess 73 58
Foliate에서 파일을 열 때 창 ID에서 정확한 파일 경로를 어떻게 알 수 있나요?
업데이트 1
나는 약간의 연구를했다. 다음 명령이 유효합니다.
% dbus-send --session --print-reply --dest=com.github.johnfactotum.Foliate /com/github/johnfactotum/Foliate org.freedesktop.DBus.Introspectable.Introspect
d-feet으로도 확인했고, d-bus도 창을 보여줬습니다.
이제 여기서 어떻게든 파일 경로와 창 ID를 얻을 수 있다면 문제가 해결될 것입니다.
답변1
Foliate
사용할 때 할 수 있는 일은 문서 제목이 포함된 것으로 보이는 창 이름 속성을 보고 창에 표시되는 파일을 결정하는 것입니다. xdotool selectwindow getwindowname
이 정보는 에서 또는 대화형으로 얻을 수 있습니다 xprop WM_NAME
.
그런 다음 이를 Foliate
쉘 스크립트로 래핑하여 실행할 때 파일 이름(또는 다음으로 시작하는 경우)과 이에 상응하는 헤더를 myFoliate myfile.epub
로그 파일에 추가하도록 할 수 있습니다. 나중에 창을 선택하면 이름(예: 제목)을 확인하고 로그에서 해당 파일 이름을 찾을 수 있습니다.$PWD/$1
$1
/
epub 파일의 제목을 얻을 수 있습니다. 형식은 <title>
.xml이 .xml인 압축된 아카이브입니다 toc.ncx
.
대신 다음과 같은 것을 실행할 수 있습니다.
xdotool search --class 'Foliate' |
xargs -i xdotool getwindowname {}
스크립트가 시작될 때 현재 이름/제목 목록을 가져오고 Foliate
백그라운드에서 시작한 지 몇 초 후에 다시 가져옵니다. 새 항목은 새 제목이 됩니다.
이는 동일한 제목을 가진 동일한 문서의 두 버전을 구별하지 않습니다. 대신 로그에 새로 생성된 창의 창 ID( xdotool search --class Foliate
창 ID 목록을 출력하는 데 사용)와 파일 이름을 기록할 수 있습니다. 그런 다음 창을 선택하면 제목이 아닌 해당 번호를 찾게 됩니다.
오래된 항목이 많으면 로그의 마지막 일치 항목을 사용해야 합니다.
myfoliate
다음은 파일 이름으로 호출하거나 -q
창을 선택하고 파일 이름을 검색할 수 있는 가능한 스크립트 구현입니다 . 두 개의 새로운 Foliate 창을 동시에 열 때 잘못된 ID를 얻는 것을 방지하기 위해 잠금 메커니즘을 추가했기 때문에 이것은 약간 복잡합니다. 이렇게 하면 declare -A
변수가 windows
창 ID를 키로 사용하여 연관 배열이 되므로 누락된 새 항목을 쉽게 찾을 수 있습니다. sleep 2
Foliate의 시작 속도가 느린 경우 이 값을 늘려야 할 수도 있습니다. 현재 Foliate가 실행되고 있지 않은 것이 확실하다면 처음부터 로그 파일을 지워야 할 것입니다.
#!/bin/bash
log=$HOME/.myfoliate.log
if [ $# -ne 1 ]
then echo "$0: usage: <filename> or -q"
exit 1
fi
if [ '-q' = "$1" ]
then id=$(xdotool selectwindow)
gawk <$log -v id="$id" '
$1==id { $1 = ""; file=$0; }
END{ print file; exit(file==""); }'
exit
fi
if [[ "$1" =~ ^/ ]]
then file=$1
else file=$PWD/$1
fi
listwindows(){
xdotool search --class 'Foliate'
}
( flock -n 9 || exit 2
declare -A windows
for id in $(listwindows)
do windows[$id]=1
done
Foliate "$1" 9>&- &
sleep 2
for id in $(listwindows)
do if [ "${windows[$id]}" == "" ]
then newwin=$id
fi
done
if [ -z "$newwin" ]
then echo "$0: failed"
exit 3
fi
echo "$newwin $file" >&9
) 9>>$log
답변2
예, 이것은 실제로 해결할 수 없습니다. 각 창이 자체 프로세스에 속한다는 가정은 완전히 잘못된 것입니다.
Foliate가 창을 해당 창에 표시된 파일에 매핑할 수 있는 API를 제공하는지 확인해야 합니다. 아마도 그렇지 않을 수도 있습니다. 그 사이에는 많은 추상화 수준이 있습니다.
즉, 현재 접근 방식으로는 원하는 결과를 얻는 것이 불가능합니다.
WID를 해당 창에서 열린 문서로 구체적으로 변환하기 위해 Foliate가 필요한 기능을 구현할 수 있지만 이를 위해서는 Foliate 코드 기반에서 심각한 개발 작업이 필요할 수 있습니다.