LINUX.ORG.RU

А в cygwin имеется wmctrl? Я вот что-то такое запеленговал. Вот им надо попробовать для начала. Как поставить NET_WM_STATE в above описано в документации.

Zubok ★★★★★
()
Ответ на: комментарий от ipc

Еще можно попробовать xprop. Но эта xprop — вещь сама в себе. Документации ясной нет, примеров тоже.

Можно попробовать вот это, но, вероятно, не сработает. С помощью того же xprop можно проверить, как свойство выставилось:

xprop -id 0x120000f -f _NET_WM_STATE 32a -set _NET_WM_STATE _NET_WM_STATE_ABOVE

Вместо id можно -name использовать.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>Можно попробовать вот это, но, вероятно, не сработает. С помощью того же xprop можно проверить, как свойство выставилось:

У меня это работает, но только после перезагрузки WM. Не знаю, это особенность WM или так должно быть. То есть свойство выставляется, но WM сразу на него не реагирует.

Zubok ★★★★★
()

>В контекстном меню окон Cygwin присутствует пункт «Always On Top». Как сделать то же из консоли? Т. е. есть ли что-то похожее на

$ xterm --always-on-top=true

И поясни, тебе надо только сделать, чтобы при запуске окно сразу становилось above или управлять окном в процессе работы? Ты просто глянь на возможности WM, который у тебя. Там могут быть (но могут и не быть) опции per window, которые даются при старте. Например, в IceWM в файле ~/.icewm/winoptions есть опция layer, которую можно приписать окну по его class, name и role. Тогда при старте этому окну сразу дается нужный слой.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Можно попробовать вот это, но, вероятно, не сработает. С помощью того же xprop можно проверить, как свойство выставилось:

xprop -id 0x120000f -f _NET_WM_STATE 32a -set _NET_WM_STATE _NET_WM_STATE_ABOVE

На поведение окна никак не повлияло (нормального WM у меня нет, см. конец сообщения). Вывод:

$ xprop.exe -id 0x200023 
_NET_WM_STATE(ATOM) = _NET_WM_STATE_ABOVE <----------- добавилось
_WINDOWSWM_NATIVE_HWND(INTEGER) = 524760
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW
_NET_WM_PID(CARDINAL) = 2376
WM_CLIENT_LEADER(WINDOW): window id # 0x200023
WM_LOCALE_NAME(STRING) = "C.UTF-8"
WM_CLASS(STRING) = "xterm", "XTerm"
WM_HINTS(WM_HINTS):
                Client accepts input or input focus: True
                Initial state is Normal State.
WM_NORMAL_HINTS(WM_SIZE_HINTS):
                user specified location: 1, 1
                user specified size: 492 by 356
                program specified size: 492 by 356
                program specified minimum size: 12 by 44
                program specified resize increment: 6 by 13
                program specified base size: 6 by 31
                window gravity: NorthWest
WM_CLIENT_MACHINE(STRING) = "pc"
WM_COMMAND(STRING) = { "xterm", "-geometry", "+1+1", "-n", "login" }
WM_ICON_NAME(STRING) = "login"
WM_NAME(STRING) = "login"

Сравнил вывод xprop -id xxxxx для обычного окна и окна с above (установленным через вышеупомянутое меню) - никакой разницы:

$ xprop.exe -id 0xa00023 > a
$ xprop.exe -id 0xc00023 > c
$ diff a c
1c1
< _WINDOWSWM_NATIVE_HWND(INTEGER) = 459246
---
> _WINDOWSWM_NATIVE_HWND(INTEGER) = 524762
3,4c3,4
< _NET_WM_PID(CARDINAL) = 2888
< WM_CLIENT_LEADER(WINDOW): window id # 0xa00023
---
> _NET_WM_PID(CARDINAL) = 3212
> WM_CLIENT_LEADER(WINDOW): window id # 0xc00023

И поясни, тебе надо только сделать, чтобы при запуске окно сразу становилось above или управлять окном в процессе работы?

Чтобы сразу становилось above. Переключать режим above/below/normal незачем.

Ты просто глянь на возможности WM, который у тебя.

Пока что WM в чистом виде нет. Cygwin у меня работает с опцией «hide root window» т. е. его окна отображаются как обычные окна Windows. Если бы можно было отображать native приложения Windows в (а не Windows отдельно, все от Cygwin - в одном окне с WM и программами) IceWM (или другом WM из Cygwin) перешел бы на на него.

Видимо, проще всего будет написать утилиту на Win API...

ipc
() автор топика
Ответ на: комментарий от ipc

Я реально не использовал никогда Cygwin. Хочу спросить, а это возможность «всегда наверху» она только у окон X-приложений есть или у виндовых приложений тоже? Там же ведь какой-то оконный менеджер все-равно есть, нет? Internal window manager for multiwindow mode:

http://x.cygwin.com/docs/ug/using-window-managers.html

Если этот оконный менеджер поддерживает Extended Window Manager Hints, то он вполне может откликаться на wmctrl, которую можно собрать. wmctrl посылает ClientMessage для корневого окна с атомом _NET_WM_STATE_ABOVE. Тогда окно и выпрыгивает наверх.

Реакция на изменение NET_WM_STATE вручную наверняка не определена. На самовольное изменение этого свойства напрямую не предусмотерно действия. В [url=http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#id2507241]станд... об этом и сказано, поэтому я и написал, что не заработает. Единственное корректное действие — это ClientMessage. Я вот это свойство меняю через xprop (это напрямую), но ничего не происходит. Потом я делаю Restart IceWM без закрытия клиентов. И вот при рестарте (инициализации IceWM) он уже учитывает состояние этого свойства. В процессе работы — никак. Вероятнее всего, окнный менеджер реагирует только на ClientMessage. Тогда единственный правильный способ — это wmctrl.

Zubok ★★★★★
()
Ответ на: комментарий от ipc

А, ну вот про это я и веду разговор. И должно заработать. А вот способ указания окна через класс — это надо разобраться поплотнее. Ты проверял через xprop — класс изменился?

Zubok ★★★★★
()
Ответ на: комментарий от ipc

Упс, это какой-то winctl, а не wmctrl. Это не порт wmctrl случайно или просто как-то портированный wmctrl? сейчас исходник гляну, какой там механизм используется.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Глянул. Через WinAPI работает, а не через иксовые дела. Наверное, вот в этом умолчательном rootless режиме рулить можно только так.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.