Abrindo um programa em uma janela flutuante no i3

3

Eu quero abrir um programa em uma janela flutuante. eu tentei exec emacsclient -c ; floating enable , mas isso fez com que o janela que estava ativa antes de flutuar, não a nova janela.

    
por Toothrot 19.06.2018 / 20:27

3 respostas

2

Foi assim que fiz para o meu aplicativo Galculator:

~ / .config / i3 / config

for_window [class="Galculator" instance="galculator"] float enable

Para descobrir o que acontece em sua classe="..." e instância="...", digite xprop no terminal e clique na janela que você deseja exibir. Você encontrará as informações em algum lugar na parte inferior, abaixo de WM_CLASS (STRING)="galculator", "Galculator". Instância é a esquerda e a classe certa.

    
por 14.09.2018 / 00:14
2

A maneira correta de fazer a janela atualmente focalizada flutuar no i3 é executar

i3-msg floating enable

Isso é o que sua linha de configuração faz.

O problema agora é que i3-msg é executado antes que a janela esteja em foco (se ela conseguir manter o foco). Peter O. explica aqui como obter uma janela em foco com base em seu PID. Podemos usar isso como tal:

our_application &
pid="$!"

# Wait for the window to open and grab its window ID
winid=''
while : ; do
    winid="'wmctrl -lp | awk -vpid=$pid '$3==pid {print $1; exit}''"
    [[ -z "${winid}" ]] || break
done

# Focus the window we found
wmctrl -ia "${winid}"

# Make it float
i3-msg floating enable > /dev/null;

# Move it to the center for good measure
i3-msg move position center > /dev/null;

# Wait for the application to quit
wait "${pid}";

Nota:

  • Se o aplicativo fizer capturar o foco sozinho, talvez seja suficiente esperar que isso aconteça. Consulte aqui para saber como determinar a janela atualmente focada.
  • Eu não trabalhei com isso, mas deveria ser possível estender o script para retornar o foco para onde ele estava antes de alterá-lo.
  • wmctrl nem sempre consegue descobrir o PID para todas as janelas; display do ImageMagick sempre tem PID 0 em sua listagem, por exemplo. Veja aqui para uma abordagem modificada que usa o título da janela.
  • Envolvendo as partes salientes da solução acima em um script, deve ser possível escrever algo como

    exec our_command; grab_focus; floating enable
    

    na configuração do i3.

por 09.10.2018 / 18:46
0

Eu gostaria de resumir postagem do HubbleT com algumas outras soluções alternativas adicionadas informação:

TLDR : acrescente && i3-msg "[id=$(xdotool getactivewindow)] floating enable" à sua definição de atalho (requer xdotool ). Por exemplo. bindsym $mod+button exec program && i3-msg "[id=$(xdotool getactivewindow)] floating enable"

Você pode configurar regras para todas janelas que correspondam a uma lista de critérios que podem ser configurados no seu i3-config ou equivalentemente enviados usando i3-msg .

A sintaxe é for_window [ criteria ] command . Você pode ler mais sobre isso aqui . Se você quer que ele funcione apenas em uma única janela, você pode garantir a exclusividade de seus critérios.

Não existe apenas

class

Compares the window class (the second part of WM_CLASS). Use the special value focused to match all windows having the same window class as the currently focused window.

     

instância

     

Compares the window instance (the first part of WM_CLASS). Use the special value focused to match all windows having the same window instance as the currently focused window.

mas muito mais, como title ou id :

title

Compares the X11 window title (_NET_WM_NAME or WM_NAME as fallback). Use the special value __focused__ to match all windows having the same window title as the currently focused window.

     

id

     

Compares the X11 window ID, which you can get via xwininfo for example.

Assumindo que emacsclient seja um programa de linha de comando, você pode adicionar

for_window [ title="uniquetitle" ] floating enable

para sua configuração do i3 e abra seu terminal favorito usando

termite -e emacsclient -t uniquetitle

e seria aberto diretamente no modo flutuante.

Se não for um programa de linha de comando e não tiver opções de título, você poderá brincar com os outros critérios ou, por exemplo, (usando xdotool e i3-msg ):

bindsym $mod+button exec program && xdotool getactivewindow set_window --name uniquetitle

ou menos sujo

bindsym $mod+t exec program && i3-msg "[id=$(xdotool getactivewindow)] floating enable"
    
por 25.10.2018 / 20:42