Цикл между открытыми окнами с wmctrl

У меня есть сценарий, который я пытаюсь использовать, чтобы упростить передачу приложений. Сейчас он получает идентификатор окна имени приложения (первый параметр) и проверяет, существует ли window_id или нет. Если он не существует, он запускает команду для открытия этих приложений (второй параметр. Если он существует, он использует wmctrl чтобы получить окно window_id и переместить его на передний window_id .

Мой план состоит в том, чтобы добавить этот скрипт к ярлыкам для каждого используемого приложения. Тем не менее, я хочу добавить возможность циклически запускать все окна, открытые для приложения, вместо того, чтобы просто открывать последний. Любые рекомендации о том, как это сделать в bash? Мне нужно установить глобальную системную переменную? Хотя это очевидно, я довольно новичок в битве. Вот сценарий для windowctl, место, которое я хочу расширить, это функция get_window_id .

  • Как запустить два виртуальных экрана X11 на одном мониторе?
  • Обмен переменными среды с www-данными
  • Формат вывода Mysql в сценарии Bash
  • Java не отображает текст меню
  • Итерация над массивом bash
  • xmessage over ssh
  •  #!/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 в Alt + S.

  • Как мне получить ~ / .bashrc для выполнения всех скриптов в каталоге ~ / Shell с помощью цикла?
  • Xmove не может подключиться к серверу X11 через пересылку SSH X
  • Добавить выход VIRTUAL в Xorg
  • Добавить определенные слова в файл
  • Прочитайте файл и прокомментируйте строку, соответствующую строке, с помощью сценария оболочки
  • Извлекать и удалять первое вхождение XML-тега несколько раз
  • 2 Solutions collect form web for “Цикл между открытыми окнами с wmctrl”

    Я долго использовал мини-скрипт, который я назвал lonew для этого. Он должен быть коротким для "lastof or new" . lastof – еще один мой скрипт, который пытается найти видимое окно, которое соответствует данной команде.

    Оба сценария ниже:

    (они могут использовать некоторые рефакторинги, но они выполняют свою работу)

    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__ 

    Возможно, это что-то вроде того, что вы ищете. Я просто использовал sleep , но вы можете использовать диалог, такой как yad или zenity , и изменить цикл, чтобы он продолжал ездить на велосипеде или все, что вам нужно. Затем вы можете добавить горячую клавишу по необходимости.

    Это требует, чтобы вы запустили скрипт с помощью команды запуска приложения, а также регулярное выражение заголовка окна приложения (которое может варьироваться от окна к окну для конкретного приложения.

     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 Window приложения.

    Linux и Unix - лучшая ОС в мире.