別のアプリケーションで開いたファイルからファイルエクスプローラを開く

別のアプリケーションで開いたファイルからファイルエクスプローラを開く

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も窓を見せてくれました。

葉の形のDフィート

ここで何とかファイルパスとウィンドウ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 2Foliateの起動速度が遅い場合は、この値を増やす必要があります。現在、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コードベースで深刻な開発作業が必要になる場合があります。

関連情報