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

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

Мой план состоит в том, чтобы добавить этот скрипт к ярлыкам для каждого используемого приложения. Тем не менее, я хочу добавить возможность циклически запускать все окна, открытые для приложения, вместо того, чтобы просто открывать последний. Любые рекомендации о том, как это сделать в 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 в Alt + S.

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

  • После обновления системы Debian X не запускается при загрузке
  • Галерея установленных шрифтов
  • lxde stop auto максимизирует вертикаль при перемещении окна в правый край экрана
  • новой установке debian не нравится показывать собственное разрешение дисплея
  • Есть ли эквивалент Linux для Mac «Shake to Find Cursor»?
  • Как начать вторую сессию X?
  • Как скрыть курсор мыши, когда он находится на краю экрана
  • Как выйти из TTY и в X сеанс
  • Монетный двор: startx от tty грузы X в китайском
  • X не запускается, потому что /tmp/.X11-unix/X0 - это каталог
  • Запуск моно на CentOS 5 CLI
  • RHEL6 && OEL6 Как определяется $ DISPLAY при запуске?
  • Linux и Unix - лучшая ОС в мире.