Как сделать так, чтобы приложение автоматически отображалось на всех рабочих столах с openbox?

Можно ли использовать wmctrl или что-то еще, чтобы конкретное окно автоматически отображалось на всех рабочих столах?

Я использую расширение Prime Player Google Play Music Chrome для управления воспроизведением музыки. У меня уже есть псевдоним bash, который я могу вызвать, чтобы мини-слой оставался поверх других окон, но я также хочу, чтобы он отправлял окно мини-слоя на все рабочие столы, поэтому мне не нужно щелкать правой кнопкой мыши и выбирать Отправить на рабочий стол Все рабочие столы (через openbox).

В идеале, я бы хотел, чтобы скрипт запускал что-то в фоновом режиме, и как только он обнаруживал окно мини-слоя, он помещал его поверх и отправлял на все рабочие столы. Это возможно?

3
задан 11 July 2016 в 02:14

2 ответа

Можно на самом деле сделать это без стороннего сценария. Openbox поддерживает обширный диапазон на параметры настройки приложения.

Создание определенного для приложения правила

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

obxprop | grep "^_OB_APP"

и нажатие на рассматриваемое окно.

Наблюдение, как Вы планируете указать правило для окна расширения Chrome, Вы могли бы хотеть предоставить как можно больше свойств соответствия, чтобы сделать правило максимально конкретным. Вы не хотите, чтобы это относилось ко всем окнам Chrome. Испытайте различные свойства соответствия и посмотрите что работы лучше всего для Вас.

Определив окно соответствия, можно установить различные свойства, которые будут исключительно относиться к рассматриваемому окну/приложению. Вот выборка значения по умолчанию rc.xml который описывает все доступные свойства:

# each rule element can be left out or set to 'default' to specify to not 
# change that attribute of the window

<decor>yes</decor>
# enable or disable window decorations

<shade>no</shade>
# make the window shaded when it appears, or not

<position force="no">
  # the position is only used if both an x and y coordinate are provided
  # (and not set to 'default')
  # when force is "yes", then the window will be placed here even if it
  # says you want it placed elsewhere.  this is to override buggy
  # applications who refuse to behave
  <x>center</x>
  # a number like 50, or 'center' to center on screen. use a negative number
  # to start from the right (or bottom for <y>), ie -50 is 50 pixels from
  # the right edge (or bottom). use 'default' to specify using value
  # provided by the application, or chosen by openbox, instead.
  <y>200</y>
  <monitor>1</monitor>
  # specifies the monitor in a xinerama setup.
  # 1 is the first head, or 'mouse' for wherever the mouse is
</position>

<size>
  # the size to make the window.
  <width>20</width>
  # a number like 20, or 'default' to use the size given by the application.
  # you can use fractions such as 1/2 or percentages such as 75% in which
  # case the value is relative to the size of the monitor that the window
  # appears on.
  <height>30%</height>
</size>

<focus>yes</focus>
# if the window should try be given focus when it appears. if this is set
# to yes it doesn't guarantee the window will be given focus. some
# restrictions may apply, but Openbox will try to

<desktop>1</desktop>
# 1 is the first desktop, 'all' for all desktops

<layer>normal</layer>
# 'above', 'normal', or 'below'

<iconic>no</iconic>
# make the window iconified when it appears, or not

<skip_pager>no</skip_pager>
# asks to not be shown in pagers

<skip_taskbar>no</skip_taskbar>
# asks to not be shown in taskbars. window cycling actions will also
# skip past such windows

<fullscreen>yes</fullscreen>
# make the window in fullscreen mode when it appears

<maximized>true</maximized>
# 'Horizontal', 'Vertical' or boolean (yes/no)

В Вашем конкретном случае Вы будете интересоваться определением layer и desktop из приложения. Вот пример правила, которое определяло бы все окна определенного приложения быть поверх остальных окон и вездесущие на всех доступных рабочих столах:

<application name="miniplayer" class="miniplayer" type="normal">
  <layer>above</layer>
  <desktop>all</desktop>
</application>

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


Править: Я изучил Ваше определенное приложение и придумал правило, которое работает над моей системой:

<application name="crx_npngaakpdgeaajbnidkkginekmnaejbi" class="Google-chrome" type="normal" role="pop-up">
  <layer>above</layer>
  <desktop>all</desktop>
</application>

Я надеюсь, что это работает на Вас также.


Modifiying Ваша openbox конфигурация для добавления приложения определенное правило

Для добавления правила приложения открывают openbox rc.xml (найденный под ~/.config/openbox/rc.xml для запаса openbox или ~/.config/openbox/lxde-rc.xml для LXDE), и перешли к <applications> раздел в самом конце файла.

Вставьте свои специализированные правила между <applications>..</applications> теги. Затем сохраните файл и продолжите перезагружать конфигурацию путем выполнения:

openbox --reconfigure

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

5
ответ дан 11 July 2016 в 02:14

Найденное более общее решение с помощью Python 2.7 и python-wnck библиотеки.

Если заинтересовано деталями проверяют это и это

Если не просто делают это ступает. Шаги 1-2 должны быть уже сделаны в Ubuntu:

  1. установка python2.7. sudo apt-get install python2.7

  2. python-wnck установки. sudo apt-get install python-wnck

  3. создайте файл stick_player.py. touch stick_player.py

  4. добавьте хижину Python.

эхо '#!'which python > stick_player.py

  1. сделайте это исполняемым файлом. chmod +x stick_player.py

  2. вставьте этот сценарий в stick_player.py. Это должно быть похожим

#!/usr/bin/python

import wnck

screen = wnck.screen_get_default()
screen.force_update()

for win in screen.get_windows():
    if win.get_name() == 'Prime Player':
        win.stick()
  1. выполните свой плеер в новом окне. В моем случае имя окна было "Главным Плеером". Если это не сообщено мне.

  2. запустите скрипт. ./stick_player.py


Если Вы также хотите отменить "видимый на всех рабочих областях", делают это. сделайте шаги 3-7 снова, но.

  1. создайте файл unstick_player.py. touch unstick_player.py

  2. добавьте хижину Python.

эхо '#!'which python > unstick_player.py

  1. сделайте это исполняемым файлом. chmod +x unstick_player.py

  2. измените последнюю строку от win.stick() кому: win.unstick()

  3. запустите скрипт. ./unstick_player.py


Также

Можно найти все имена окон с помощью этого сценария:

#!/usr/bin/python

import wnck

screen = wnck.screen_get_default()
screen.force_update()

for win in screen.get_windows():
    print win.get_name()
3
ответ дан 11 July 2016 в 02:14

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

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