i3 wm: запустить мое приложение на определенном экране, сфокусировать его и переместить туда мышь

Я искал несколько форумов, и я всегда нахожу частичные ответы, но ни один из них не решает мою проблему.

Я разрабатываю свою собственную игру на настольном ПК (кстати, я использую Arch ;-)) с двумя экранами и оконным менеджером i3. Я разрабатываю на правом (квадратном 1:1) экране и хотел бы, чтобы моя игра открывалась на левом (16:9) экране после компиляции. Я могу имитировать это, всегда перемещая мышь на левый экран во время компиляции, чтобы игра открывалась там, но тогда мне нужно иметь открытое пустое рабочее пространство для перемещения.

Я могу найти решения, которые нужно поместить в файл i3-config, где я могу специально открыть окно с определенным именем класса в определенной рабочей области (которая не обязательно является конкретным монитором), и после этого я, конечно, не могу придать ему фокус.

Я хотел бы иметь возможность делать это только с помощью команд командной строки: я разрабатываю в vim и имею горячую клавишу, которая запускает мой скрипт make&run. Скрипт запустит приложение при отсутствии ошибок компилятора. Было бы здорово, если бы эту команду можно было расширить с помощью «а также поместить ее на левый монитор в пустую рабочую область и дать ей фокус, также перемещая туда мышь».

Надежное решение i3-config также подойдет, может быть, даже лучше, потому что мне не нужны функциональные возможности моего ноутбука.

Я был бы не против зарезервировать определенное рабочее пространство для моей игры, если это поможет.

Кто угодно?


person scippie    schedule 04.09.2019    source источник


Ответы (1)


Я могу найти решения, которые нужно поместить в файл i3-config, где я могу специально открыть окно с определенным именем класса в определенной рабочей области (которая не обязательно является конкретным монитором), и я, конечно, не могу (sic?) дать ему фокус после того.

(примечание: "не" здесь опечатка? Я немного запутался).

Что касается решения с конфигурационным файлом, то вы уже на полпути. Единственное, что вам нужно сделать, это иметь это рабочее пространство на мониторе по вашему выбору.

Вот полное решение (с файлом конфигурации), включая шаги, которые вы уже решили:

1. Выделите рабочее пространство для своей игры

Поскольку вы можете создать столько рабочих областей, сколько захотите, в этом нет недостатка.

assign [class="MyGame"] game

2. Назначьте это рабочее пространство левому экрану.

Во-первых, вам нужно узнать имя экрана с xrandr (xorg-xrandr в Arch).

Вот пример вывода в моих настройках:

$ xrandr

Screen 0: minimum 8 x 8, current 2560 x 2520, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+1440 (normal left inverted right x axis y axis) 310mm x 170mm
   1920x1080     60.00*+  59.93    48.00  
   1680x1050     59.95    59.88  
   1400x1050     59.98  
   1600x900      60.00    59.95    59.82  
   1280x1024     60.02  
   1400x900      59.96    59.88  
   1280x960      60.00  
   1368x768      60.00    59.88    59.85  
   1280x800      59.81    59.91  
   1280x720      59.86    60.00    59.74  
   1024x768      60.00  
   1024x576      60.00    59.90    59.82  
   960x540       60.00    59.63    59.82  
   800x600       60.32    56.25  
   864x486       60.00    59.92    59.57  
   640x480       59.94  
   720x405       59.51    60.00    58.99  
   640x360       59.84    59.32    60.00  
DP1 disconnected (normal left inverted right x axis y axis)
DP2 connected 2560x1440+0+0 (normal left inverted right x axis y axis) 550mm x 310mm
   2560x1440     59.95*+
   2048x1080     60.00    24.00  
   1920x1080     60.00    50.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1600x1200     60.00  
   1280x1024     75.02    60.02  
   1152x864      75.00  
   1280x720      60.00    50.00    59.94  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   720x576       50.00  
   720x480       60.00    59.94  
   640x480       75.00    60.00    59.94  
   720x400       70.08  
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

В моем случае eDP1 — это мой основной (ноутбук) монитор, а DP2 — мой внешний монитор.

Если бы мне нужно было рабочее пространство game на моем внешнем мониторе, я бы использовал:

workspace game output DP2

3. Создайте привязку клавиш, которая запустит ваш «скрипт make&run» и переместит фокус и мышь в рабочую область игры.

bindsym <my-bind> exec --no-startup-id <make&run script>; workspace game

Вместо использования горячей клавиши vim вы используете привязку клавиш i3 как для запуска сценария (который откроет приложение, и приложение откроется на правильном мониторе благодаря настройкам выше), так и для перемещения фокуса на этот монитор:

Легко заставить i3 выполнять команды, в то время как очень сложно заставить команду перемещать мышь и фокусироваться (поскольку это задача среды wm или рабочего стола).


Я могу придумать недостаток этого метода:

Когда вы столкнетесь с ошибкой компилятора, ваш фокус и мышь все равно переместятся на левый монитор. Это может вас раздражать, если это происходит часто.


Способ, которым я перескакиваю из рабочей области в рабочую область, заключается в том, что у меня есть список именованных рабочих областей и простые мнемонические сочетания клавиш, чтобы добраться до них.

Поэтому я бы справился с этим немного иначе, чем с одной привязкой клавиш (или командой, как вы просили), выполняющей все это:

  • У меня было бы рабочее пространство с кучей приложений, которые я всегда хочу видеть на левом мониторе.
assign [class="MyGame"] workspaceleft
assign [class="App1"] workspaceleft
assign [class="App2"] workspaceleft
assign [class="App3"] workspaceleft

workspace workspaceleft output <left-monitor-name-given-by-xrandr>
workspace workspacevim output <right-monitor-name-given-by-xrandr>
  • и у меня была бы простая привязка клавиш для перехода к этой рабочей области (и другие для перехода к другим моим рабочим областям. Так что у меня также были бы привязки клавиш для возврата к или , в зависимости от того, предпочитаете ли вы иметь одно приложение для каждой рабочей области или только одно рабочее пространство на каждый монитор и т. д.)
bindsym <bind1> workspaceleft 
bindsym <bind2> workspacevim

Поэтому я бы работал в vim и использовал горячую клавишу vim. Если компиляция сработает, игра появится на правильном мониторе благодаря нашим ранним настройкам. Затем я нажимал <bind1>, чтобы перейти к нему (и <bind2>, чтобы вернуться к правому боковому монитору, когда захочу).

Я думаю, что это может быть удобнее, чем универсальная привязка клавиш.

Кроме того, возможность перейти к любому приложению нажатием клавиши и заставить все мои приложения по умолчанию загружаться туда, куда я хочу и так, как я хочу, — это одна из вещей, которые мне очень нравятся в i3. Таким образом, установка таких вещей может сделать ваш рабочий процесс намного приятнее для этого конкретного приложения.


В качестве альтернативы вы можете использовать привязку клавиш для переключения между вашими мониторами:

bindsym <bind> focus output left

(Обратите внимание, что здесь «влево» — это не имя рабочей области, а направление. Это позволит переключаться между мониторами, установленными рядом друг с другом. Замените «влево» на «вверх», если они находятся друг над другом).

person prosoitos    schedule 13.01.2020