LINUX.ORG.RU
ФорумTalks

Почему всё так всрато?

 


0

5

Навеяно программированием.

Вот сижу, никого не трогаю, программирую. Я не то что бы нубас в системном программировании, в прошлом под ДОС даже многозадачные оболочки писал на пассале, но и не гуру, тем более не гуру красноглазия.

Но все таки некоторые «решения» меня откровенно удивляют.

Вот взять например «системный трей».

Первая реализация этой штуки была реализована в 2002 году, уже после выхода XP, во время скажем так «претензии Линукса на десктоп». Реализаторы этой срани почему-то посчитали, что для вывода иконки приложения в определенную зону, и вызова контекстного меню по нажатию на эту иконку - нужно создавать целую сороконожку на костылях и сажать ее на велосипед с квадратными колесами. По логике реализаторов, приложение которое хочет в трей, обязано общаться с этим треем через протокол в протоколе в Иксах, при этом этот трей прежде должен был правильно инициализироваться и создать свою область (именно поэтому мы иногда могли видеть «another instance of systray already running», когда запускали вторую копию панели или системтрейного плагина). Если его не было - то приложение не могло быть затреено, соответственно при запуске трея, трей был обязан послать сообщение через Иксы всем приложениям, что вот он, я, запущен, треемся. Регистрация «действия», таких как активация или контекстное меню - так вообще сплошная головная боль. В итоге самая минималистичная программа, у которой три задачи: а) вывести иконки, б) обрабатывать их изменения, в) кидать вызов программе для активации ее, или контекстного меню - занимала почти тысячу строчек.

Шло время, и индеец Зоркий Глаз через ~15 лет увидел, что как-то это все не тру, и решил с подачи Каноникла и Кедов переделать этот велосипед, чтоб на нем было приятнее ездить.

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

Какой же это бред.

С 1985 существует ProcFS. Она следовала юниксовому принципу «все есть файл». Она предназначена для взаимодействия процесса с ядром, ядра с процессом, и процесса с процессом.

Ну вот что мешало приложению создать в своем пространстве запись «/proc/PID/i_want_to_be_trayed», «/proc/PID/my_tray_icon», и «/proc/PID/tray_menu», куда можно сделать «echo activate > /proc/PID/tray_menu» или echo «contextmenu» > /proc/PID/tray_menu ? Соответственно приложение которое хочет в трей - создает у себя в пространстве запись, а приложение которое хочет прочитать треевые приложения - просто пробегается в поиске «i_want_to_be_trayed»? И все! Все чтения изменений через простой inotify.

В порыве экспериментизма, я сделал вменяемую, простую, работающую реализацию такого трея за 4 часа. Эта реализация работает на PHP, C, Python, Pascal, Bash. Она не требует знаний третьей технологии (иксов, dbus, etc). В клиентском приложении она реализуется 10 строками на PHP, 25 строками на С, из которых 10 строк - строки и память.

О работе с иксами, d-bus, и wayland я расскажу в следующей серии.

Ну вот почему пингвинятники вечно идут каким-то своим, оверинжинирнутым путем? Ведь это снижает порог входа тех кто знает ЧТО писать, но не знает КАК.

★★★★★

Ответ на: комментарий от kirill_rrr

Надо сказать, что все эти «почему-то посчитали» на первый и второй взгляд выглядят 100% логичными. Как и решение сделать трей единым и единственным для всего окружения.

Что логичного в монопольном захвате?

Что логичного в невозможности запуститься без наличия клиента?

Что логичного в отсутствии абстрагированного API для сервиса?

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

Да, и привязано к куче ненужной хрени, и работает кстати практически так же.

И снова мы видем всё то же самое. Только реализация возможно технически и эффективна, но за трей явно должно отвечать не ядро, а слой-два повыше.

Безусловно. Я привел в пример. Сам сделал по-другому.

Как говоорится, флаг вам в руки. Если это так просто и универсально, как вы говорите, через 5 лет все на неё пересядут. Но вопрос что вы не учли на самом деле?

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

Концепция трея - слишком проста, чтобы там можно было что-то не учесть.

windows10 ★★★★★
() автор топика

Вот взять например «системный трей».

Первая реализация этой штуки была реализована в 2002 году, уже после выхода XP, во время скажем так «претензии Линукса на десктоп». Реализаторы этой срани почему-то посчитали

…что эта срань вообще нужна. А юзеры почему-то потом причмокивая приняли. Теперь расхлёбываем. Не обязательно любую срань тащить к себе только потому что она реализована где-то там.

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

Что логичного в монопольном захвате?

2 трея с разными реализациями начнут конкурировать. Обязательно найдётся что то такое, что не может быть синхронизировано. К тому же реализация «все клиенты в один сервер» намного проще и надёжней чем «все клиенты ко всем серверам + синхронизация».

Что логичного в невозможности запуститься без наличия клиента?

Ещё ни разу не встречал клиента, не способного запуститься без рабочего трея в окружении.

Что логичного в отсутствии абстрагированного API для сервиса?

Ну как бы эти странные api через Х-протокол или там д-бас и есть «абстрагированные api».

но не пересядут по всем известным причинам

Оно уже работает и более-менее адекватно. Чтобы что то изменить - надо показать разработчикам нескольких ДЕ что новый вариант будет лучше. Думаю в итоге всё в это упирается.

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

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

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

Ее посчитали нужной почти во всех ОС.

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

Если панель задач кое-как с горем пополам нетакусики вдолбили в док (по сути гибрид quicklaunch и taskbar), то с треем пытались, но выходила мерзость и не столько по функционалу, сколько по UI.

windows10 ★★★★★
() автор топика

вроде была простая реализация трея, когда на окно просто вешается свойство и если wm его понимает, то суёт окно в трей, если нет, ну висит окно 32x32 с иконкой.

но решили, что это недостаточно оверинжиниринг и забили в пользу dbus…

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

хз даже. Никогда не пользовался треем. Из того, чем пользуюсь, в двух программах я это отключил (Deluge и DeaDBeeF), в одной (Electrum) не отключается, но вроде не мешает, хоть и бесполезен.

Как по мне, если гуёвое приложение нужно запущенным — пускай будет его окошко. Если не нужно, то оно и в трее не нужно. Простой и понятный концепт. Есть же сворачивание окон или оставление их на другом воркспейсе. Зачем ещё один способ «сворачивания» по сути?

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

Если не нужно, то оно и в трее не нужно.

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

Уведомления о сообщениях опять же. Единственный неназойливый всегда видимый вариант - через трей.

kirill_rrr ★★★★★
()

Вообще-то линуксовый (Xlib) трей в смысле заюзывания из приложения мало чем отличается от вендового (win32). Даже принцип создания и окучивания иконки в трее примерно одинаков. Единственная разница - в линуксе трей совершенно и неограниченно опционален, а венде прибит гвоздями вместе с панелью к единственному WM. В принципе, в венде точно так же при перезапуске WM придётся всем приложениям присылать что-то, только проблема в винде в том, что нет какого-то стандартного сообщения для этого, и каждое приложение выставляет своё собственное сообщение, обычно WM_USER+X в uCallbackMessage при регистрации трея. Соответственно в винде всё ещё хуже чем в линуксе, и спасает только то, что панель WM там не принято менять или перезапускать.

При чём тут вообще упоротый d-bus и прочие абстракции ради абстракций вообще не ясно.

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

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

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

Ну а уведомления так вообще можно через notify-send посылать, хоть из скрипта.

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

уведомления так вообще можно через notify-send посылать, хоть из скрипта

Чтобы огромные банеры висели поверх всего и блокировали работу пока их не дёрнешь рукой? Идея полный треш.

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

С треем уведомления как-то иначе посылаются?

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

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

С треем уведомления как-то иначе посылаются?

Ну да. Это маленький значок от 16х16 до 32х32 где то в углу экрана и он всегда видим и ничего не перекрывает а за счёт мелкого размера не мешается.

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

Только значок не является уведомлением. Но я понял, что вы имеете в виду, кажется: видимо, он у каких-то программ меняется в зависимости от статуса. Такое использование имеет некоторый смысл, возможно. Мне, впрочем, ни разу такое не попадалось.

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

у каких-то программ меняется в зависимости от статуса

??!

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

Ну или просто тупо индикатор пришедшего сообщения в psi, claws-mail, lifearea (старой) или число сообщений в телеграме.

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

У меня из того, что может показывать значок в трее, есть три софтины, как я выше говорил (в двух отключил это, в одной не отключается): DeaDBeeF, Deluge, Electrum. И вроде ни одна из них значок не меняла. Так уж вышло. Но теперь вспоминаю, что видел и такое, что меняется — в ICQ на винде в нулевые.

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

Дык это. Уровень заряда батарейки по-моему у всех (сейчать смотрю на mate-шную) так себя ведет)

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

он у каких-то программ меняется в зависимости от статуса.

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

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

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

Мешает. Приход нового письма - это частный пример, а их много и они сразу все есть.

Регулятор звука - раз;

Мессенджер - два;

Почта - три;

Индикатор батареи - четыре;

Индикатор раскладки - пять;

Сетевые подключения - шесть;

Уведомления и прочие буферы - семь.

Ну что ты, будешь отображать раскладку в списке задач, чтобы она занимала целое место, и ловила на себе фокус при переключении альт-табом ?

Задача трея - не только уведомлять, а еще и предоставлять пользователю интерактивное, свойственное только этой программе меню.

Более того, некоторые пункты меню и вовсе будут спутаны. Как ты собрался в таскбаре отличать «закрыть окно» от «закрыть программу» ?

А как ты будешь программе определять область таскбара если их 100500 решений и все не стандартизированы?

Ради интереса имплементировал треевое меню в общий док. Получилось вельми мерзко: https://ibb.co/XykmpfK

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

Давай люди сами решат что им нужно, а что им не нужно ;)

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

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

На Ютубе есть лекция Паккарда об истории Иксов, там многое из таких факторов он рассказывает.

У Keith Packard во многом личная вина что X11 оброс костылями и по сути прекратил развитие ~20 лет назад. Одни Xfixes чего стоят из-за которых его попёрли из проекта Xfree86.

  1. Разработка сложного ПО это очень сложная задача.

Сложная задача у неосиляторов. Windows 1.0 разрабатывался в крачайшие сроки и уже к версии 3.11 был готов к повседневному использованию. Основной API остался без изменений самой первой версии.

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

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

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

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

У меня в трее висит три программы:

  • Индикатор наличия обновлений ОС. Меняет значок на красный.
  • Менеджер буфера обмена. Значок не меняет, но иногда лажу в его настройки так.
  • Апплет управления wifi. Тут понятно - и значок меняет при подключении, и управление через меню по клику.
wandrien ★★
()
Ответ на: комментарий от X512

Сложная задача у неосиляторов. Windows 1.0 разрабатывался в крачайшие сроки и уже к версии 3.11 был готов к повседневному использованию. Основной API остался без изменений самой первой версии.

Windows 1.0 не был таким уж сложным.

Если уж брать более реальные примеры - это разработка Windows NT, 32-битного WinAPI и технологии COM.

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

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

Задача трея - не только уведомлять, а еще и предоставлять пользователю интерактивное, свойственное только этой программе меню.

Это не задача трея. Задача трея - дать место для маленькой области уведомлений от приложения. Это и в винде, и в иксах работает почти одинаково, разница только в мелких деталях реализации.

То, что в вейланде ломают юзкейсы для API, которые работали по 30 лет - это проблема вялендофанатиков.

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

Если уж брать более реальные примеры - это разработка Windows NT, 32-битного WinAPI и технологии COM.

Это всё тоже разрабатывалось значительно быстрее чем тот же Wayland.

Но зато сейчас MS уже не способна на такие подвиги.

Забытые технологии древних.

X512 ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)