LINUX.ORG.RU

Пара вопросов по Wayland

 , ,


0

4

Здравствуйте

Я пытаюсь добиться, чтобы моя программа работала под Wayland (пока мне удалось запустить работу под Windows и X11). Хочу уточнить некоторые ограничения, которые, как мне кажется, в Wayland являются непреодолимыми. У меня многооконное приложение типа «одно главное окно + любое количество дополнительных окон». Дополнительные окна являются чем-то вроде «панелей», которые можно стыковать к докерам (напоминает интерфейс Photoshop-а). GUI свой, поэтому я рисую в окне всё, что хочу. Но с Wayland возникают большие проблемы.

  1. Я не вижу возможности гарантированно обнаружить нажатие кнопки «свернуть окно». Да, одно окно, на котором эта кнопка нажата свернётся, но остальные останутся на экране. Вроде бы есть состояние XDG_TOPLEVEL_STATE_MINIMIZED, но, как я понял, оно не приходит почти нигде. А другого способа вообще не видно.

  2. Как я понимаю, окна в wayland нельзя перемещать по глубине. Соответственно, запросто возможна ситуация, когда дополнительные окна оказываются под основным, о чем я даже не узнаю. Это совсем плохо.

  3. Существует проблема с ALT+TAB, потому что wayland нельзя указать какое именно окно там показывать, а значит он может выкинуть туда все окна сразу. Правда, вроде бы есть вариант с помощью xdg_toplevel_set_app_id() указать одинаковый id для всех своих окон, что в теории должно остановить wayland от показа всех окон сразу по ALT+TAB.

Это тот минимум, в который я пока упёрся. Если я что-то неверно понимаю, то прошу мне объяснить этот вопрос. Я могу рисовать все «панели» внутри главного окна, но это портит всю концепцию, так как «панели» полезут на рабочую область главного окна. Единственное что приходит в голову - это развернуть окно на весь экран превращая его в «рабочий стол» и по нему уже расставлять другие окна. Но это какой-то «крайний случай»…

Всем спасибо!

Я могу рисовать все «панели» внутри главного окна, но это портит всю концепцию, так как «панели» полезут на рабочую область главного окна.

Дополнительные окна являются чем-то вроде «панелей», которые можно стыковать к докерам

xdg-toplevel-drag

Sunderland93 ★★★★★
()

Я не вижу возможности гарантированно обнаружить нажатие кнопки «свернуть окно». Да, одно окно, на котором эта кнопка нажата свернётся, но остальные останутся на экране. Вроде бы есть состояние XDG_TOPLEVEL_STATE_MINIMIZED, но, как я понял, оно не приходит почти нигде. А другого способа вообще не видно.

Этим занимается композитор. Тебе нужно дать ему подсказку, что твое окно свернуто, через состояние (выше ты его написал), при этом поверхность своего окна можешь скрыть, убрать фокус. Композитор сам разберется. Если рамку окна у тебя рисует libdecor - то будет ещё проще.

Как я понимаю, окна в wayland нельзя перемещать по глубине. Соответственно, запросто возможна ситуация, когда дополнительные окна оказываются под основным, о чем я даже не узнаю. Это совсем плохо.

Можно. Для этого есть xdg-activation

Sunderland93 ★★★★★
()
Последнее исправление: Sunderland93 (всего исправлений: 1)

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

Имеет смысл подумать над интерфейсом с удобно реализованными вкладками и контекстами. Посмотри как сделаны сложные программы: браузеры, IDE, графические редакторы, видеоредакторы и др. Все они давным-давно ушли от многооконности и устаревшей концепции «MDI», которая оказалась неудобной.

Более того, отказ от MDI-like интерфейса здорово облегчит кодовую базу твоего приложения. Ты просто нафиг выкинешь все эти кривокостыльные WinAPI/X11/Wayland самописные примочки и сделаешь своё приложение максимально кросс-платформенным и переносимым. Особенно если заюзаешь какой-нибудь Qt который тебе ещё и поддержку macOS и iOS, Android, WebAssembly добавит.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 3)
Ответ на: комментарий от Sunderland93

Благодарю за ценные советы !

Честно говоря, я не очень понял насчет сворачивания. Я пока решил обойтись без libdecor, поэтому кнопкой «свернуть» я не управляю. Когда произойдет сворачивание одного окна, то я в редких случаях получаю обратный вызов, который, например, выглядит так:

void handle_toplevel_configure(void* data, xdg_toplevel* toplevel, int32_t width, int32_t height, wl_array* states)

И внутри массива states может находиться XDG_TOPLEVEL_STATE_MINIMIZED. Но сам я вообще не понимаю, как мне что-то намекнуть композитору. Не мог бы ты подробнее пояснить, что ты предлагаешь ?

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

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

Особенно если заюзаешь какой-нибудь Qt

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

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

В Qt есть очень хороший пример

https://doc.qt.io/archives/qt-5.15/qtwidgets-mainwindows-mainwindow-example.html

Можешь покрутить его и посмотреть к чему стоит двигаться в концепции открепляемых и прикрепляемых панелей.

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

Делать многооконные интерфейсы не стоит

Многооконные интерфейсы могут быть достаточно удобны, только для этого нужен нормальный WM. А с этим сейчас сложно.

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

Эммм…. нуууууу… это не то чтобы помогло, GIMP всё ещё маргинален.

hateyoufeel ★★★★★
()

GUI свой, поэтому я рисую в окне всё, что хочу. Но с Wayland возникают большие проблемы.

Вроде в SDL3 что-то улучшили с Wayland.
https://wiki.libsdl.org/SDL3/README-wayland – хорошо написано.
Кстати, TGUI -- кроссплатформенная библиотека виджетов на C++ поддерживает компиляцию с SDL3, но с Wayland я не пробовал.

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

Ни один клиент в Wayland не может управлять собственными окнами, вообще никак. Для открепляемых/прикрепляемых панелей есть xdg-toplevel-drag, для диалоговых окон (чтобы не перекрывались основным) - xdg-dialog, для переключения фокуса на появившееся дополнительное окно - xdg-activation. Все.

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

концепции безопасности вейланда

Какая там к чёрту безопасность? Где протокол для защиты детей? Нету и даже не предвидится! Так что это не безопасность, а симукляр.

anonymous
()
Ответ на: комментарий от EXL

Можешь покрутить его и посмотреть к чему стоит двигаться в концепции открепляемых и прикрепляемых панелей.

Мне уже поздно что-то менять - я уже перешел к портированию на разные OS. Соответственно, остальное всё находится в состоянии «близко к готовности», да и то что у меня есть, меня вполне устраивает.

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

Делать многооконные интерфейсы не стоит, они вызывают лишь раздражение

Раздражение вызывают вялендофанаты, которые работают только на одном мониторе. Однооконные приложения ВНЕЗАПНО не разместишь на обоих мониторах разом, чтобы середину не резала граница мониторов.

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

Твои хотелки противоречат концепции безопасности вейланда.

Да в том-то и дело, что я не вижу ничего опасного в том, чтобы узнать о том, что нажата кнопка «свернуть». Да и перемещение окон по глубине (если перемещать только среди своих) тоже не сильно чему-то там угрожает. Поэтому я и спрашиваю, как это сделать

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

Для открепляемых/прикрепляемых панелей есть xdg-toplevel-drag, для диалоговых окон (чтобы не перекрывались основным) - xdg-dialog

Ещё раз спасибо за полезную информацию. Вы не могли бы на мой предыдущий вопрос ответить, который я вам задал по поводу «сворачивания окна»? Я не понимаю, как намекнуть композитору на это «сворачивание» и момент когда нажата кнопка «свернуть» я тоже не вижу.

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

Раздражение вызывают вялендофанаты, которые работают только на одном мониторе.

Ага, сейчас расскажут, как оно нам не нужно. Но когда надо поклевать иксы, эти клованы тут же вытаскивают из пыльного чулана древний моник 1280x1024, подключают рядом с 4K и бегут на лор размахивать вялым.

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

Делать софт под такую фашистскую систему – себя не уважать.

Я, насчет характеристики системы, кстати, с вами полностью согласен. Это какой-то отголосок «большой политики», когда человека лишают всех прав и возможностей, а в ответ предлагается какая-то мутная безопасность. А как известно полная безопасность есть разве что в одиночной камере, где у вас на всякий случай отбирают шнурки. И мир действительно идёт в этом направлении. Но… в моем случае я делаю «инструмент», а не просто приложение, поэтому хочется сделать так, чтобы работало на максимальном количестве устройств.

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

они вызывают лишь раздражение, вспомните с ужасом ранний GIMP.

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

Qui-Gon ★★★★★
()
Ответ на: комментарий от Odin_KG

Да в том-то и дело, что я не вижу ничего опасного в том, чтобы узнать о том, что нажата кнопка «свернуть»

Это исходя из понятий о безопасности здорового человека. И понятия о безопасности вейланда - это дугое. Это между дебильносью и паранойей.

И до тех пор пока

Ни один клиент в Wayland не может управлять собственными окнами, вообще никак.

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

Qui-Gon ★★★★★
()
Ответ на: комментарий от Odin_KG

Внутри xdg-shell есть вот этот реквест:

<request name="set_minimized">
      <description summary="set the window as minimized">
	Request that the compositor minimize your surface. There is no
	way to know if the surface is currently minimized, nor is there
	any way to unset minimization on this surface.

	If you are looking to throttle redrawing when minimized, please
	instead use the wl_surface.frame event for this, as this will
	also work with live previews on windows in Alt-Tab, Expose or
	similar compositor features.
      </description>
    </request>
То есть да, тебе просто нужно отправить xdg_toplevel_set_minimized(xdg_toplevel); по нажатию кнопки свернуть (я хз как она у тебя реализована), а дальше композитор уже должен свернуть окно. Вот, можешь посмотреть как это сделано в MPV https://github.com/mpv-player/mpv/blob/730062b5103f40cbd90af27f54e35705548a1c...

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

Да я в курсе про xdg_toplevel_set_minimized, но тут есть варианты:

  1. Декорации окна рисуются композитором - невозможно узнать, что произошел щелчок по кнопке «свернуть». Но зато окно имеет стандартный стиль, согласно установленной теме.
  2. Декорации окна рисуются libdecor - можно поймать щелчок по кнопке «свернуть», но внешний вид декораций никак не связан с установленной темой.
  3. Декорации окна рисует разработчик с помощью libdecor - также нет проблем с «поймать щелчок», но внешний вид декораций остается на совести разработчика, а я,честно говоря, пока даже не очень понимаю, как углы можно закруглить - а у всех других приложений углы закруглены.

В результате я пока не решил, куда мне двигаться. В идеале нужен вариант 1, но с поимкой щелчка, а этого нет.

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

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

Ну, я хочу попробовать, а если не получится, то могу всегда бросить.

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

Твои хотелки противоречат концепции безопасности вейланда.

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

anonymous
()
Ответ на: комментарий от Odin_KG

Если ты используешь libdecor, то отрисовка собственной декорации тебя будет волновать только в композиторах, не умеющих рисовать рамку на стороне сервера, и предоставляющей её через xdg-decoration (и то если его стандартная не устроит). А это GNOME, Weston и Enlightenment. Но внешний вид да, все самому. Хотя в гноме вроде бы (могу ошибаться) при использовании libdecor автоматом устанавливается стиль Adwaita.

Sunderland93 ★★★★★
()
Последнее исправление: Sunderland93 (всего исправлений: 1)
Ответ на: комментарий от Sunderland93

отрисовка собственной декорации тебя будет волновать только в композиторах, не умеющих рисовать рамку на стороне сервера

Ну, допустим композитор рисует рамку. Но он же не говорит, что кнопка «свернуть» нажата. И получается, что опять нельзя свернуть несколько окон. Т.е. в результате вариант с рисованием композитором не рабочий.

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

Ну как бы тебе сказать. Он типа рабочий. Если ты имеешь свой копозитор в котором делаешь для «своих» окон хорошо а чужие отправляешь в стандарт вяленого. Это путь гномосеков которые праллельно разрабатывают и вяленд (не только они - но гномосеков там большинство с правом решающего голоса ). Когда начинаются неудобные вопросы а как же закрыть два окна или найти курсор мыши - а давайте протокол добавим - гномосеки начинают это блокировать аргументируя тем что у нас все и так работает. Поэтому полезные протоколы пылятся в задвинутых реквестах, а полезный софт либо теряет эффективность и наживает баги делая костыли, либо втихушку активирует Xwayland и работает в иксах.

А учитывая что гном штука весьма примитивная с примтивным софтом а-ля мобильное приложение рассчитанное на полноэкран - то гному много не надо. Если бы вяленого курировали не гномосеки а кдешники - то он гораздо быстрее оброс бы нужными протоколами и стал юзабельной альтернативой но уы. if i was a nigger, my dick would be bigger.

Qui-Gon ★★★★★
()
Ответ на: комментарий от Odin_KG

Ну, допустим композитор рисует рамку. Но он же не говорит, что кнопка «свернуть» нажата.

Не говорит, я выше же написал. Отследить только по состоянию toplevel'а. Вот как в примере из libdecor это все сделано. https://gitlab.freedesktop.org/libdecor/libdecor/-/blob/master/demo/demo.c?re... Тебе вообще тут ничем заморачиваться не придется, на системах с xdg-decoration будет запрошена серверная декорация, контролируемая композитором. В Гноме - клиентская нарисуется, благодаря плагину на GTK будет внешний вид как у всего Гномовского. Остальным займется библиотека. Композитор просто будет менять состояние твоего окна, скрывая его. Насчет нескольких окон - я не знаю как здесь что сделать, в Wayland многооконные интефейсы приложений работают плохо. В гимпе например можно отдельные окна свернуть по кнопке на окне, но кликая по значку в панели - сворачиваются и разворачиваются все разом. Протокол есть только для стыкуемых окон (dockers). Если для тебя принципиален многооконный интерфейс твоей проги, и ты ни при каких обстоятельствах не хочешь это менять, то лучше запускай принудительно в Xwayland. И жди когда доделают и смержат это https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/264

Sunderland93 ★★★★★
()
Последнее исправление: Sunderland93 (всего исправлений: 2)
Ответ на: комментарий от Qui-Gon

Вейланд продолжит оставаться лютым говном

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

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

Либо ты что-то меняешь, либо адаптируешься.

Я и меняю. По мере сил - увы сдвинуть куда-то тусовку зависших в вечном пубертате дебилов которые допускают или не допускают протоколы в стандарт на нашем уровне нереально - поэтому приходится изобретать обходные пути чтобы сделать эту среду юзабельной. Говно оно еще и отличное удобрение которое может дать вполне хорошие всходы если его правильно засеять - но прежде чем наслаждаться ароматом цветов и вкусом плодов его придется немного полопатить.

Qui-Gon ★★★★★
()
Ответ на: комментарий от EXL

Делать многооконные интерфейсы не стоит, они вызывают лишь раздражение, вспомните с ужасом ранний GIMP

Ранний гимп как раз открыл мне глаза на удобный интерфейс, потому что на 3 мониторах только многооконное приложение и может нормально работать.

anonymous
()
Ответ на: комментарий от Qui-Gon

Ни один клиент в Wayland не может управлять собственными окнами, вообще никак.

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

Это очень правильный подход, не должно быть возможности у приложений, как в иксах, включить, например, полноэкранный режим 640x480 (а ещё упасть и в нём остаться). Или зависнуть с 100% загрузкой CPU, бесконечно пытаясь заресайзить своё сраное окно в пропорциях 1:1, при том что на tiled wm это невозможно.

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

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

а ещё упасть и в нём остаться

Ты не думал, что это вопросы к дисплейному менеджеру? Если приложение (а не пользователь) запросило разрешение 640x480, то на него нужно переключиться. Если приложение закончило свою работу (в том числе и некорректно), то нужно вернуть обычное разрешение.

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

потому что аналогичные сообщения от вейланда они получить не могут - потому что «тиринг» и «секьюрити». А накручивать костыли не хотят, скорее всего потому что там сидят профильные спецы которые сильны в разводке печатных плат и управлением 3д печатью, а не эксперты по хитровывернутому выкостыливанию вокруг вейландового дебилизма.

Я тут как-то в своих дилетантских попаниях по коду мате наткнулся на такую штуку. Есть архив-менеджер engrampa - форк гномовского file-roller. Так вот под иксом я могу из ентой енгрампы драг-дропить файлы в файл-менеджер и взад. В вяленде - в енгрампу кидать можно, а вот из нее - хрена лысого. ну и подумалось - ну да, мате форкнулся на этапе гтк2, потом кое-как портировался без учета вяленого, потом кое-как в два студента алаптировался к вяленому. Но гномовский то файл-роллер еще живЪ. А значит должен был быть заточен под вейланд нормально, и если взять код гнома то можн раобраться как же они это сделали и втащить это в мате. И что же вы думаете - как гномосеки портировали эту фичу? Ладно, не буду тянуть кота за его котят как любит приговаривать царь ноутбукоремонта Ляксей Юрьич - ее просто выпилили. Все что нужно знать о команде гнома и команде вяленда и о качестве этих суперпупер протоколов и разработки. Они свою же софтину не смогли нормально врятнуть в вейланд. Кастрировали и сказали что так и было. Так что нефиг рассказывать какие там плохие разрабы пишут wx/

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

потому что аналогичные сообщения от вейланда они получить не могут

На кнопки могут, а остальное не могут? Тебя самого эта чушь не смущает?

Остальной твой поток сознания тут вообще ни к чему.

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

Зачем тебе получать глобальные координаты курсора мыши? В Wayland ни у кого их нет, только относительные. То есть пока курсор над окном твоей проги - ты «видишь» его. Видишь события от него через wl_pointer_motion, с помощью relative-pointer-unstable-v1 можешь задавать его смещения, с помощью pointer-constraints-unstable-v1 задавать ему рабочую область. Этого мало? Даже GTK и Qt под вялым не умеют получать глобальные координаты курсора, оно всегда будет возвращать 0,0

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

Ты не думал, что это вопросы к дисплейному менеджеру?

Что ещё за «дисплейный менеджер»? В случае иксов это вопрос исключительно к иксам.

Если приложение (а не пользователь) запросило разрешение 640x480, то на него нужно переключиться

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

Это лишь один из примеров. С полноэкранным режимом вообще помойка - у всех игрушек, например, разные дефолты - полноэкранный, окно или fullscreen_desktop. Не все поддерживают Alt+Enter как переключалку фуллскрина. Хорошо что у меня i3, и там приложения всегда раскрываются на полный экран, и Alt+Enter перехватывается WM’ом, но это половинчатое решение. Полноценное и правильное решение - оторвать у приложений любую возможность контролировать геометрию своего окна, а уж тем более полноэкранность, а разработчиков-вредителей которые считают что это им нужно, нужно просто сажать.

Если приложение закончило свою работу (в том числе и некорректно), то нужно вернуть обычное разрешение.

Иксы этого не умеют и никогда не научатся.

anonymous
()
Ответ на: комментарий от MagicMirror

Не ну вот ты тут такой блин вумный как вутка. Ну пойди и выкати фикс в wx чтобы у них пруса и кикад заработали. Тогда и поймешь почему кнопки могут а чип на схеме платы перетянуть на другое место нельзя. А то все сидят и рассказывают какой вяленд хороший и как там все просто и замечательно - а по факту одно мир-дверь-мячество.

Qui-Gon ★★★★★
()
Ответ на: комментарий от Sunderland93

Еще один мегамозг. Челленж тот же - так все замеяательно, протоколы есть все работает. А баг в wx висит уже несколько лет. Причем это не то что солюшен есть но его злые мудаки не принимают - если бы такое было я бы в свою сборку давно его накатил и отключил форс Xwayland. Но его нету. Ну вот пойди и сделай.

Или в тот же самый FileRoller верни обратный драг-дроп чтобы работало.

Или научи mate-panel под вяленым делать hide.

Куча же проектов - в которых нет назарплатных дядек и где нет исторически экспертизы с вейландом у старых разрабов и где с радостью твой патч вольют в мейнстрим. Если все так просто, в вейланде все есть - ну? Легко же - столько же уже тут протоколов перечислил что хватит на все эти недозадачки и еще останется.

Да - еще можно Странскому помочь в вялендизации фокса. А то его модный суперкомпозитор забуксовал и оброс багами как затонувший галеон ракушками. Там адовая проблема с vsync. То что в иксах делалось как два пальца -в вяленом требует адовых усилий.

Qui-Gon ★★★★★
()
Ответ на: комментарий от anonymous

бесконечно пытаясь заресайзить своё сраное окно в пропорциях 1:1, при том что на tiled wm это невозможно

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

anonymous
()