Как только разместить / размер * первое * соответствующее окно?

Используя 11.04 с интерфейсом Unity и Compiz 3D, через Менеджер настроек CompizConfig (ccsm, по умолчанию не установлен, но очень полезен), я могу использовать плагин «Поместить Windows» для установки расположения окна по умолчанию, и плагин «Window Rules» для установки размера окна по умолчанию, что очень удобно. (Хорошо, если бы мне не нужно было дублировать правила, но, эй, * nix - это все о маленьких кусочках, работающих вместе ...)

Можно ли как-то настроить эти правила, чтобы они только применять, если открываемое окно является единственным совпадением для них? Например, не ко второму или третьему соответствующему окну, которое я открываю? (Пример: в первый раз, когда я открываю Chrome, я хочу его в X, Y с размером W, H, но если я нажимаю Ctrl + N, я хочу, чтобы второе окно было размещено в соответствии с общими правилами, а не с моим фиксированным правилом.) Должен ли я прибегнуть к wmctrl и / или сценариям «Пирог с дьяволом» для такого рода вещей?

1
задан 21 October 2011 в 14:33

1 ответ

Хорошо, ответ будет отрицательным, вы не можете сделать это с помощью плагинов «Поместить Windows» и «Правила окна». Вместо этого вы должны использовать wmctrl и / или Пирог дьявола .

В моем случае, в качестве примера, я удалил все элементы «Поместить Windows» / «Правила окна» для Chrome и использовал wmctrl, создав специальный файл google-chrome.desktop с некоторыми сценариями:

[ 1122]
  • Скопируйте обычный файл google-chrome.desktop:

    cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications
    
  • Редактировать ~/.local/share/applications/google-chrome.desktop

  • Найти [ 1110] и измените его так, чтобы он указывал на скрипт в удобном месте:

    Exec=/home/tjc/bin/runchrome %U
    
    1. Мой скрипт runchrome просто вызывает мой обобщенный скрипт runandmove с аргументами, которые я хочу используйте для Chrome:

      #!/bin/bash
      
      # For 1440x900:
      runandmove "Google Chrome" 0 246 0 1025 875 /opt/google/chrome/google-chrome $*
      

      Эти цифры workspace x y width height.

      Мой runandmove скрипт & nbsp; & mdash; ничего прекрасного & nbsp; & mdash; is:

      #!/bin/bash
      #
      # runandmove looks to see if a program with a given title is already running. If so,
      # it raises that program (brings it to the foreground). If not, it runs the program
      # in the background (eating all output) and tries to move it to the given position.
      
      # Check we have enough args
      if [ $# -lt 7 ]; then
          echo "ERROR: Please supply at least seven arguments."
          echo
          echo "Usage:"
          echo
          echo "    runandmove \"program title\" workspace x y width height \"run command\" {args for command}"
          echo
          echo "Be sure to use quotes around the program title and the run command if they include"
          echo "any spaces (no need if they don't)."
          exit -1
      fi
      
      # Get the args
      program_title=$1
      program_ws=$2
      program_x=$3
      program_y=$4
      program_width=$5
      program_height=$6
      program_cmd=$7
      shift 7
      
      # If the program is already running, bring it to the foreground. If it wasn't, wmctrl will
      # return 1 and we'll use that as a flag telling us that we just started it.
      wmctrl -a "$program_title"
      just_started=$?
      
      # If it isn't running, run it and put it in the right place
      if [ $just_started -gt 0 ]; then
          "$program_cmd" $* &> /dev/null &
          wmctrlretry -r "$program_title" -e $program_ws,$program_x,$program_y,$program_width,$program_height
      fi
      

      Так как может быть задержка после того, как мы введем команду программы, прежде чем она появится в диспетчере окон, обратите внимание, что выше используется wmctrlretry, если она запускает программу, которая является простая повторная упаковка вокруг wmctrl:

      #!/bin/bash
      
      # wmctrl with up to 100 retries; we use this when we've just launched a program
      # and it takes a moment to show up in the window manager's list.
      counter=0
      wmctrl $*
      while [ $? -gt 0 ]; do
          counter=$[$counter+1]
          if [ $counter -gt 19 ]; then
              exit -1
          fi
          sleep 0.125
          wmctrl $*
      done
      
    0
    ответ дан 21 October 2011 в 14:33

    Другие вопросы по тегам:

    Похожие вопросы: