LINUX.ORG.RU

gtk2 сам себя не форкнет

 , , ,


8

13

Что ж, этот день настал. Будем делать gtk 2.26.

Минимальный план работ такой:

  • Обеспечить масштабирование заданных в настройках тулкита размеров иконок в соответствии с DPI.
  • Обеспечить масштабирование заданных темой пиксельных размеров в соответствии с DPI.
  • Предоставить для приложения API для масштабирования размеров из условных пикселей (под 96 DPI) в реальные в соответствии с DPI.
  • Исправить мелкие косяки в теме Redmond, которые остались с тех пор, как отрисовка темы была переведена на cairo.
  • Дополнить дефолтный пакет тем стилями для gtk3, максимально приближенно имитирующими классические темы.
  • Бэкпортировать из gtk3 некоторые улучшения в диалогах открытия/сохранения файлов.

Приглашаются все желающие. Пишите ваши соображения.

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

P.S. @hobbit, верни тэг gtk2 в БД сайта!!!

GTK2 хорош, вопрос только в том, что делать со всем софтом, который перешёл на GTK3? Реализовывать конверсию GTK3->GTK2 или делать уже отдельный форк GTK3?

И нужно другое название, чтобы не нарушать торговую марку GNOME Foundation - NextTK, NovaUI…

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

Но можно и без фотка патчи отправлять.

Нужен полноценный независимый форк. Официальные репозитории GTK2/3 как минимум модерируются неадекватами, которые ещё потирают неудобные комментарии. Тот кто владеет доступом к кнопке merge владеет проектом. По другому никак.

Skullnet ★★★★★
()

Бэкпортировать из gtk3 некоторые улучшения в диалогах открытия/сохранения файлов.

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

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

Чем вызван приступ некрофилии?

Тащемта это давно напрашивалось, поелику GTK+2 это один из немногих нормальных (шустрых и фичастых) графических тулкитов под фрюниксы, из адекватных можно вспомнить разве что FLTK и еще от силы парочку. Будет круто, если дистрибутивы начнут переходить на активный форк вместо выпиливания, несколько лет у wandrien в запасе есть.

danfe
()

Коротко о поддержке переменного DPI в этих наших линуксах.

  • Весь такой из себя векторный гипертекстовый GTK3 не в состоянии масштабировать элементы UI под DPI. Полосы прокрутки в нём и так микроскопические, а при увелечении DPI они превращаются просто в какой-то позор. С остальными виджетами не лучше.
  • Вместо плавного масштабирования под DPI гытыка может предложить юзеру только целочисленное масштабирование интерфейса. Которое мылит половину иконок. При этом пользователям экранов с DPI 130 предлагается только пососать лапу, например. Потому что с масштабом 1 на таком экране нихрена не видно, а с масштабом 2 - всё гигантское.
  • Отдельного порицания заслуживает XFCE. При попытке выставить там в настройках это самое масштабирование 2, получаем это: https://ibb.co/m8wFVFp Если вы тоже не поняли, что за срань из артефактов на экране вместо окон, то вы не одиноки. А разрабам норм, это пошло в релиз.
  • Дохренадцать мест в коде жестко прибиты гвоздями к пиксельным размерам, и никто это чинить не собирается. Снова пну XFCE, потому что размеры её панелей никак не масштабируются под размеры шрифта. Шрифт-то с изменением DPI меняется, а вот размер панели - хрен.
  • Ну и в третий раз пну, уж не знаю кого, XFCE или GTK, но у XFCE менюшки, такие как меню приложений или меню выхода из системы, не умеют пересчитывать свой размер динамически. Изменяем DPI в настройках, и вёрстка в менюшке разъезжается. Красота!

И вот на фоне этого мрака @EXL носится со своим скриншотом кривой поделки на wxwidgets, которая якобы доказывает, что gtk2 не годен для переменного DPI. А вот эта вся срань годна что ли?

Снова живующие под кроватью зелёные человечки из зубной пасты помешали Матиасу, мать его, Класену адекватно спроектировать тулкит?

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

Тут вон в теме выше вопрошали: это что же, для полной поддержки DPI нужно патчить прикладной софт?

Нужно!

Потому что если не патчить, то получается описанная выше херня, и никакой волшебный тулкит не спасает. А если он не волшебный и запроектирован как курица лапой - тем более.

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

пользователям экранов с DPI 130 предлагается только пососать лапу

ССЗБ. При удалении от магических 96 линуксовые гуи начинают рассыпаться, какие бы там нанотехнологии не были заявлены. Ещё и растровые шрифты отыквляются. Мне кажется всем пофиг, потому что линукс это система для сисадминов и нищуков. В консоле можно терминус покрупнее выставить, а на ноуте с 1366x768 эти проблемы совсем уже не беспокоят.

bread
()
18 октября 2023 г.
24 февраля 2024 г.
Ответ на: комментарий от anonymous

Так у вас же есть xlibe

Эта штука довольно кривая и неполная. Сделать полноценную альтернативную реализацию X11/xlib с нуля – это очень сложная задача. Wayland намного проще X11.

Скорее всего в итоге полноценная поддержка протокола X11 будет добавлена через XWayland.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
25 мая 2024 г.
Ответ на: комментарий от wandrien

Черновик по DPI, сюда скину.

Сижу над черновиком кода.

Понимаю, что ничего не соображает голова. Не знаю, то ли это побочка от гриппа, то ли я просто тупею от возраста. Уже 4-й день как прошла температура, но ясность сознания не возвращается. Вчера с трудом код SDE читал, та же петрушка.

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

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

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

Не, сдвг иначе проявляется. Сдв это вот что я год к проекту не возвращался.

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

Ну вроде собрал кпртинку методов. Ща прогуляюсь по магазинам и с компа попробую изобразить.

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

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

попробуй меньше торчать на лоре, сливая силы в пустоту

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

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

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

Первая задача требует меньшего объёма изменений со стороны кода приложений, вторая – большего. Это связано с тем, что масштабирование на уровне отдельных окон требует контекста в виде объекта типа GdkWindow. Не во всех случаях, когда приложение вычисляет какие-либо размеры, у него доступен объект этого типа. То есть может потребоваться более сущестенная переделка кода приложения.

Теперь собственно к самому GTK.

GdkScreen – это класс, соответствующий понятию Screen в X11. В рамках одного Screen может быть сконфигурировано произвольное число мониторов.

Каждый GdkScreen держит указатель на экземпляр GtkSettings – класса, отвечающего за хранение и получение настроек.

Работа с иконками в основном сосредоточена в модуле gtkiconfactory.c. Там содержится функция, которая возврвщает пиксельные размеры иконки для заданного логического размера:

gboolean
gtk_icon_size_lookup_for_settings (
        GtkSettings *settings,
        GtkIconSize  size,
        gint        *width,
        gint        *height);

Документация в качестве лучшей альтернативы предлагает использовать функцию gtk_widget_render_icon().

gtk_widget_render_icon() через цепочку вызовов обращается к gtk_icon_size_lookup_for_settings() для получения размеров иконок.

Отсюда такой вывод:

Прикладной код, который использует gtk_widget_render_icon(), может быть легко переведён на per-window скейлинг иконок. Прикладной код, который напрямую использует gtk_icon_size_lookup_for_settings(), будет требовать более существенной модификации.

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

Пока такой прикладной API вырисовывается:

GtkUiScale
        gtk_ui_scale_apply_for_int()   // метод для фактического масштабирования
        gtk_ui_scale_apply_for_double()// метод для фактического масштабирования
        event: "changed"               // срабатывает, когда настройки масштабирования изменились

GdkScreen:
        property: "ui-scale"       // GtkUiScale для данного экрана
        gdk_screen_get_ui_scale()  // возвращает ui-scale
        gdk_screen_set_ui_scale()  // устанавливает ui-scale
        event: "ui-scale-changed"  // срабатывает когда срабатывает "changed" у GtkUiScale
                                   // или когда свойству ui-scale назначен новый объект
GdkWindow:
        property: "ui-scale"       // GtkUiScale для данного окна
        gdk_window_get_ui_scale()  // возвращает ui-scale
        gdk_window_set_ui_scale()  // устанавливает ui-scale
        event: "ui-scale-changed"  // срабатывает когда срабатывает "changed" у GtkUiScale
                                   // или когда свойству ui-scale назначен новый объект
gtkiconfactory.c:
        gtk_icon_size_lookup_for_settings_with_ui_scale()
wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

В простейшем случае реализация GtkUiScale подписывается на уведомления от объекта GtkSettings, а также на события со стороны оконной системы и пересчитывает масштабные коэффициенты в соответствии с меняющимися настройками.

При необходимости приложение может подсунуть собственную реализацию GtkUiScale окну внутри своего процесса и напрямую управлять его масштабированием. (Например, для отображения макета окна в каком-нибудь редакторе UI.)

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

А зачем приложению вообще что-то знать о масштабировании? Да и об отрисовке как таковой? По идее оно должно накидать виджетов layout manager'у и это станут ЕГО проблемы, как он их расположит, а потом передаст рендереру.

GAMer ★★★★★
()