Как мой сценарий оболочки может управлять размещением окна zenity? - PullRequest
5 голосов
/ 12 ноября 2009

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

Есть ли способ управления координатой (x, y), при которой вывешивается окно zenity?

Если нет, есть ли способ решить эту проблему, возиться с ресурсами X или с оконным менеджером (я использую fvwm)?


РЕДАКТИРОВАТЬ : в ~/.fvwm2rc (fvwm версия 2.5.26) не работают:

Style "Information" PositionPlacement -0 -0
Style "Zenity" PositionPlacement -0 -0

Они также не работают с пропущенным -0 -0, как предлагается на странице справки. (Заголовок окна для zenity --info - «Информация».)

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


EDIT

Среди многих других интересных сведений xprop(1) сообщает об этом в окне zenity:

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
WM_NORMAL_HINTS(WM_SIZE_HINTS):
                program specified location: 0, 0
                program specified minimum size: 307 by 128
                program specified maximum size: 307 by 128
                window gravity: NorthWest
WM_CLASS(STRING) = "zenity", "Zenity"
WM_ICON_NAME(STRING) = "Information"
WM_NAME(STRING) = "Information"

Несмотря на этот явно обнадеживающий отчет, окно фактически не размещено в месте 0,0: - (

Я знаю, что команда Style вступает в силу, потому что я добавил опцию !Borders, и, конечно же, zenity окно сообщений без границ ... но все еще в центре проклятого экрана!

Ответы [ 5 ]

4 голосов
/ 08 ноября 2012

Я делаю это, используя wmctrl в подоболочке. Пример:

((sleep .4;wmctrl -r TeaTimer -R TeaTimer -e 0,50,20,-1,-1)
for ((a=$LIMIT; a > 0; a--)); do
# for loop generates text, not shown
done
wmctrl -R TeaTimer
) | zenity --progress --title="TeaTimer" --percentage=0

Первый wmctrl перемещает zenity в верхний левый угол, второй перемещает его в текущее рабочее пространство. См. полный пример .

2 голосов
/ 06 января 2011

Вы можете попробовать использовать «старый» способ сделать это, используя FvwmEvent.

AddToFunc StartFunction I Module FvwmEvent FvwmEvent-MoveWindow

DestroyModuleConfig FvwmEvent-MoveWindow: *
*FvwmEvent-MoveWindow: Cmd Function
*FvwmEvent-MoveWindow: add_window MoveZenity

DestroyFunc MoveZenity
AddToFunc   MoveZenity
+ I ThisWindow ("zenity") Move -0 -0

Если это все еще не работает (или вы намерены заставить его работать с помощью PositionPlacement), вы можете попробовать

BugOpts ExplainWindowPlacement

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

Также просто к сведению, если вы хотите получить информацию об окне, вы можете использовать модуль FvwmIdent для получения этой информации (вместо xprop, хотя оба работают нормально).

1 голос
/ 24 января 2010

Попробуйте Devilspie: http://burtonini.com/blog/computers/devilspie/

1 голос
/ 12 ноября 2009

Да, это возможно при соответствующей помощи оконного менеджера. Например, с xmonad это будет одна строка кода ...

Мой fvwm немного ржавый, но похоже на что-то вроде:

Style "zenity" PositionPlacement -0 -0

в вашем fvwm2rc должен добиться цели.

РЕДАКТИРОВАТЬ: обратите внимание на "zenity" в нижнем регистре, так как, согласно документам, он должен соответствовать не только заголовку окна, но и классу окна (что можно узнать с помощью утилиты "xprop": запустите ее и укажите на окно в вопрос).

Согласно xprop, окно zenity имеет два интересных свойства:

  1. Имеется _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG, что указывает на то, что это диалоговое окно
  2. Он имеет WM_TRANSIENT_FOR(WINDOW): window id # <some window id here>, указывая главное окно, для которого это диалог (в моем случае - окно xterm)

Итак, если мое предложение не работает, то это почти наверняка, потому что fvwm обрабатывает диалоги особым образом - либо из-за конфигурации, либо из-за жестко заданного поведения.

Вы можете попробовать добавить "EWMHIgnoreWindowType" к стилю окон zenity, что должно заставить fvwm игнорировать эти подсказки

0 голосов
/ 12 декабря 2015

Вы можете использовать wmctrl, чтобы получить идентификатор окна, затем xdotool, чтобы разместить его там, где вы хотите. Простой и адаптируемый ко многим типам сред.

 ## Arg 1 - Pid of window to move.
 ## Arg 2 - X-Coord.
 ## Arg 3 - Y-Coord. 
function move_win() { 
 xdotool windowmove $(wmctrl -lp | grep ${1} | cut -d' ' -f1) ${2} ${3}
} 

например. $> move_win $(pidof zenity) 0 0

...