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

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

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

おすすめ記事