Ciclo entre janelas abertas com wmctrl

4

Eu tenho um script que estou tentando usar para facilitar a criação de aplicativos. Agora ele obtém o id da janela de um nome de aplicativo (o primeiro parâmetro) e verifica se o window_id existe ou não. Se ele não existe, ele executa o comando para abrir esses aplicativos (segundo parâmetro. Se ele existir, ele usa wmctrl para obter a janela por window_id e movê-lo para a frente.

Meu plano é adicionar esse script a atalhos para cada aplicativo que eu uso com frequência. No entanto, quero adicionar a capacidade de percorrer todas as janelas abertas para um aplicativo, em vez de apenas aumentar o último aberto. Alguma recomendação sobre como fazer isso no bash? Eu precisaria definir uma variável de sistema global? Embora seja óbvio, sou relativamente novo para bater. Aqui está o script para windowctl, o lugar que eu quero estender é a função get_window_id .

#!/bin/bash
#command [app_name] [app_command]

function get_window_id() {
    #this is the part I want to extend
    window_id=$(wmctrl -l | grep -i "$1" | tail -1 | cut -f1 -d" ")
}

function open_app() {
    exec $2  
}

get_window_id $1

if [ -z $window_id ]
    then 
        open_app $1 $2
    else
        wmctrl -i -a "$window_id" 
fi

Um exemplo seria adicionar o comando windowctl sublime subl3 a Alt + S .

    
por Deciple 04.08.2015 / 21:45

2 respostas

1

Estou há muito tempo usando um miniscript chamado lonew para isso. Ele deve ser curto para "lastof or new" . lastof é outro script meu, que tenta encontrar uma janela visível que corresponda a um determinado comando que foi acessado mais recentemente.

Ambos os scripts estão abaixo:

(eles podem usar alguma refatoração, mas fazem o trabalho)

lonew:

#!/bin/bash
CMD="$1"; shift; ARGS="$@"
lastof $CMD || { echo $CMD $ARGS; $CMD $ARGS & }
disown

lastof:

#!/usr/bin/env ruby
#open-last
#List all windows and sort them by the time they were last accessed

require 'shellwords'

XTIME="_NET_WM_USER_TIME"

QARGV=ARGV.map {|arg| Shellwords.escape(arg)}

ids=IO.popen "xdotool search --onlyvisible #{QARGV.join(" ")}"
max_time_id=nil
max_time=nil

ids.each_line do |id|
  id.chomp!
  puts "id=#{id}"
  time='xprop -id #{id} #{XTIME}'.split('=')[1].to_i

  max_time||=time
  max_time_id||=id
  if time > max_time
    max_time=time
    max_time_id=id
  end
end
exit(1) unless max_time_id
puts "Switching to ID: #{max_time_id}"
exit system("xdotool windowactivate #{max_time_id}")

__END__
    
por 05.08.2015 / 01:26
1

Talvez isso seja algo parecido com o que você está procurando. Acabei de usar sleep , mas você pode usar uma caixa de diálogo como yad ou zenity e alterar o loop para que continue circulando ou o que precisar. Você pode adicionar uma tecla de atalho conforme necessário.

É necessário que você prepare o script com o comando de inicialização do aplicativo e também com o título da janela do aplicativo regex (que pode variar de janela para janela para um aplicativo específico.

shortname=$1
case $shortname in
  (firefox)  cmd='firefox';  rx='Mozilla Firefox$';; 
 (nautilus)  cmd='nautilus'; rx=' (-|—) File Browser';;
        (*)  echo 'unknown shortname'; exit;;
esac
id=( $(wmctrl -l | awk "/$rx/"'{print $1}') )
(( !${#id[@]} )) && { "$cmd" & exit; }
for (( i=0; i<${#id[@]}; i++ )) ;do
    wmctrl -i -a ${id[i]}
    sleep 3
done

Observe que wmctrl não pode ativar (interceptar com) uma determinada guia dentro da X Window de um aplicativo.

    
por 05.08.2015 / 01:03