Eu uso o seguinte script (está vinculado a um atalho de teclado) para abrir o arquivo selecionado (clicando em uma janela depois de usar o atalho) no nemo. O que ele faz é a partir do id da janela (depois de clicar na janela), pega o id do processo, então usando esse pega o caminho do arquivo que pertence ao pid. Depois de adquirir o caminho do arquivo, ele abre esse arquivo com o 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
Mas o problema é com Foliate. Ele usa o mesmo processo para várias janelas . Se eu abrir vários arquivos .epub, ele terá várias janelas. Mas todas as janelas têm um 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
Estou usando o Zorin OS 16.2, que usa o Gnome 3.
Verifiquei os subprocessos para ver se consigo o caminho de outros arquivos, mas não ajudou muito.
% 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
Como posso obter o caminho exato do arquivo do ID da janela, quando o arquivo é aberto no Foliate?
Atualização 1
Eu fiz algumas pesquisas. O seguinte comando funciona.
% dbus-send --session --print-reply --dest=com.github.johnfactotum.Foliate /com/github/johnfactotum/Foliate org.freedesktop.DBus.Introspectable.Introspect
Também verifiquei com d-feet se o d-bus também mostra as janelas.
Agora, se eu pudesse de alguma forma obter o caminho do arquivo e o ID da janela daqui, isso resolveria meu problema.
O que você pode fazer para identificar qual arquivo é mostrado em uma janela ao usar
Foliate
, é olhar o nome da janela propriamente dito, que parece conter o título do documento. Você pode obter isso interativamente emxdotool selectwindow getwindowname
ouxprop WM_NAME
.Você pode agrupar
Foliate
dentro de um script de shell para que, quando executado, digamos,myFoliate myfile.epub
ele possa adicionar a um arquivo de log o nome do arquivo$PWD/$1
(ou$1
se começar/
) e o título equivalente. Mais tarde, quando você selecionar uma janela, poderá obter o nome que é o título e procurá-lo no log para encontrar o nome do arquivo.Obter o título de um arquivo epub é viável: o formato é um arquivo compactado, com o
<title>
in xml emtoc.ncx
.Em vez disso, você pode executar algo como
no início do script para obter a lista de nomes/títulos atuais e, novamente, alguns segundos depois de iniciar
Foliate
em segundo plano. A nova entrada será o novo título.Isso não será capaz de distinguir entre duas versões do mesmo documento com o mesmo título. Em vez disso, você pode anotar no log o ID da janela da janela recém-criada (usando apenas
xdotool search --class Foliate
o que gera a lista de IDs de janela), junto com o nome do arquivo. Então, quando você seleciona a janela, procura esse número, em vez do título.Obviamente, a última correspondência no log deve ser usada, se houver muitas entradas desatualizadas.
Aqui está uma possível implementação como um script,
myfoliate
, que é chamado com um nome de arquivo ou-q
para selecionar uma janela e recuperar um nome de arquivo. É um pouco complicado demais, pois adicionei um mecanismo de bloqueio para evitar obter o ID errado se duas novas janelas Foliate forem abertas ao mesmo tempo. Odeclare -A
torna a variávelwindows
uma matriz associativa, com os IDs de janela como chaves para que possamos encontrar facilmente uma nova entrada ausente. Podesleep 2
ser necessário aumentar o Foliate se o início for lento. O arquivo de log provavelmente deve ser esvaziado no início se puder ser determinado que não há nenhum Foliate em execução no momento.Sim, isso não é realmente solucionável: a suposição de que cada janela pertence a um processo próprio está simplesmente errada.
Você terá que verificar se Foliate oferece alguma API com a qual você pode mapear janelas para o arquivo mostrado naquela janela - provavelmente não oferece, há alguns níveis de abstrações entre eles.
Então, resumindo, com sua abordagem atual, é impossível conseguir o que você deseja.
Você pode implementar algo que peça especificamente ao Foliate para converter um WID no documento aberto nessa janela, mas pode exigir um esforço de desenvolvimento sério dentro da base de código do Foliate.