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
グラウンドで開始して数秒後に再インポートします。新しいアイテムは新しいタイトルになります。
これは、同じタイトルを持つ同じ文書の2つのバージョンを区別しません。代わりに、ログに新しく作成されたウィンドウのウィンドウID(xdotool search --class Foliate
ウィンドウIDのリストを出力するために使用)とファイル名を記録できます。その後、ウィンドウを選択すると、タイトルではなく対応する番号が見つかります。
古いエントリが多い場合は、ログの最後の一致を使用する必要があります。
myfoliate
以下は、ファイル名で呼び出すか、-q
ウィンドウを選択してファイル名を検索できるスクリプトの実装です。 2つの新しい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コードベースで深刻な開発作業が必要になる場合があります。