열려 있는 창 사이를 순환하려면 wmctrl을 사용하십시오.

열려 있는 창 사이를 순환하려면 wmctrl을 사용하십시오.

응용 프로그램 작업을 더 쉽게 만들기 위해 사용하려는 스크립트가 있습니다. 이제 애플리케이션 이름(첫 번째 매개변수)의 창 ID를 가져와서 window_id존재하는지 확인합니다. 존재하지 않는 경우 명령을 실행하여 애플리케이션을 엽니다(두 번째 매개변수). 존재하는 경우 wmctrl창을 가져와 window_id앞으로 이동하는 데 사용됩니다 .

내 계획은 내가 정기적으로 사용하는 모든 응용 프로그램의 바로 가기에 이 스크립트를 추가하는 것입니다. 그러나 마지막으로 열려 있는 창만 열 수 있는 것이 아니라 응용 프로그램이 열려 있는 모든 창을 순환하는 기능을 추가하고 싶습니다. Bash에서 이 작업을 수행하는 방법에 대한 제안이 있습니까? 전역 시스템 변수를 설정해야 합니까? 분명하지만 나는 bash를 처음 접했습니다. 이것은 windowctl의 스크립트입니다. 제가 확장하고 싶은 것은 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

예를 들어 + windowctl sublime subl3에 명령을 추가하는 것입니다 .AltS

답변1

lonew나는 오랫동안 이것의 이름을 딴 미니 스크립트를 사용해 왔습니다 . 의 약자입니다 "lastof or new". lastof최근에 액세스한 특정 명령과 일치하는 표시되는 창을 찾으려고 시도하는 또 다른 스크립트입니다.

두 스크립트는 다음과 같습니다.

(아마도 일부 리팩토링을 사용할 수 있지만 작업이 완료됩니다)

로니우:

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

마침내:

#!/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__

답변2

어쩌면 이것이 바로 당신이 찾고 있는 것일 수도 있습니다. 방금 그것을 사용했지만 sleep또는 같은 대화 상자를 사용하고 루프를 변경하여 반복을 유지하거나 필요한 모든 것을 변경할 수 있습니다. 그런 다음 필요한 경우 단축키를 추가할 수 있습니다. yadzenity

이를 위해서는 애플리케이션의 실행 명령과 애플리케이션의 창 제목 정규식(특정 애플리케이션의 각 창마다 다를 수 있음)을 사용하여 스크립트를 실행해야 합니다.

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

wmctrl특정 기능을 활성화(상호작용)할 수 없다는 점 참고하세요.상표응용 프로그램의 X 창 내.

관련 정보