Gtk theme in GTK# (Windows)
I’m trying to change the theme in GTK# (OS: Windows, IDE: Xamarin). But I get next issues:
I was able to find only one theme which correctly render, it is «Orta». All was well, except for lags and freezes. Here is my code:
string Resource_File = «Orta\\gtk-2.0\\gtkrc»; Application.Init (); Gtk.Rc.AddDefaultFile (Resource_File); Gtk.Rc.Parse (Resource_File); MainWindow win = new MainWindow (); win.Show (); Application.Run ();
When I changing the size of the Paned or clicking on button I get GUI freezes(I already asked about this). This problem occurs only when using this theme, with the other themes all works tolerably. I used the search and found a couple of opinions, about that this is due to the use of Cairo to render graphics (one of them).
if I try to use a different theme, a lot of GUI elements not correctly rendered in my GTK# application, but they are correctly render in the GTK Theme Selector. If the theme is displayed correctly in GTK Theme Selector, then I try to use the selected gtkrc file in my Gtk# app(as shown in Example with «Orta»), but almost always, most widgets are not displayed correctly(here is an example)
So I have a few questions:
- How to choose a work theme?
- How to set a theme for GTK# (Windows)?
- What Gtk# open source application using the theme and how?
- What other way to change the style of GUI in the GTK# app?
- Why «Orta» theme freezes?
Изменение темы GTK для приложения
Недавно мне понадобился текстовый редактор Geany. Я его установил, настроил и решил написать небольшой гайд, шпаргалку по изменению темы отдельного приложения. Я использую дистрибутив Fedora 31, но эта инструкция подойдет практически для любого дистрибутива с рабочим окружением GNOME. Как мы знаем гном имеет «спартанский» выбор настроек. Хорошо это или плохо я рассуждать не буду, а разберусь как это исправить.
Разработчики GNOME и многих дистрибутивов, каждый по своему настраивают тему приложений. Весной разработчики GNOME даже написали открытое письмо с просьбой к дистростроителям, не изменять дефолтные настройки приложений GNOME. Также в интернете можно скачать и установить любые темы и значки на свой вкус.
Как изменить тему GTK для приложения
В рабочем окружении GNOME я использую светлую тему Adwaita. У вас, в зависимости от дистрибутива и личных предпочтений может быть любая другая тема. Как видим из заголовка статьи, я хочу поменять тему одного (или нескольких) приложений GTK.
Итак начнем. Как мы знаем приложение Gnome-tweak изменяет тему всех приложений в системе.
Например светлая:
Также есть исключения дистростроителей или разработчиков GNOME. Например у меня в светлой Adwaita приложения Eye of GNOME (eog) и Totem отображаются в темной теме:
Также на скрине я вставил видеоплеер Celluloid, он не входит в стандартный набор гномовских приложений, но тоже поставляется с темной темой. Хотя в настройках приложения ее можно поменять на светлую.
Примерно тоже хочу сделать и я с нужным мне приложением. Для примера я беру текстовый редактор Geany. По дефолту у меня он выглядит так:
Я же хочу, чтобы он выглядел примерно так, как на официальном сайте Geany:
Идем на сайт Geany: https://www.geany.org/ . Далее по ссылке : https://github.com/geany/geany-themes скачаем ZIP-файл с темами, распакуем и установим (скриптом install.sh или копированием тем в каталог
Включим в настройках Geany любую темную тему на свой вкус Вид => Цветовые схемы.
Здесь мы видим темный терминал внутри светлого приложения. Немного не так, как хотелось бы.
Идем дальше. Попробуем включить GtkInspector. Это приложение-инструмент для проверки, изменения и понимания приложений GTK+ на лету. В Debian, Ubuntu предварительно убедитесь, что у вас установлен пакет libgtk-3-dev. Наберем в терминале:
gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true
Мы включили GtkInspector. Чтобы запустить GTKInspector, сфокусируйте свое приложение GTK и нажмите Control-Shift-D. Или переместите курсор мыши на нужный виджет и нажмите Control-Shift-I, чтобы специально проверить виджет под курсором мыши.
Запустим GtkInspector. Он включается только в окне с запущенным приложением.
Перейдем на вкладку Внешний вид и включим Темный вариант (или тему Adwaita-dark):
Как видим мы получили желаемый результат, в приложении Geany тема поменялась на темную. Закрываем GtkInspector. Он пока мне не нужен (далее он понадобится для проверки изменений). Вы же можете самостоятельно посмотреть здесь и поиграть с ним. Это довольно таки интересный инструмент и достоин отдельного изучения.
Попробуем перезапустить приложение Geany:
И что мы видим? Темная тема не сохранилась. Geany снова открылся в светлой теме. Нужно искать другое решение, но ничего «Нормальные герои всегда идут в обход» — Айболит — 66 к/ф.
Теперь мы попробуем жестко привязать Geany к темной теме. Согласно руководству GTK+, вы можете загрузить определенную тему и ее вариант (темный, светлый) для каждого приложения через переменную среды: GTK_THEME=theme:variant . И добавить в файл по адресу:
команду env (позволяет модифицировать список переменных окружения перед исполнением пользовательской команды) в строке Exec. Где «name application» — имя приложения. В моем случае строка файла:
должна выглядеть так:
Exec=env GTK_THEME=Adwaita:dark geany %F
Если нам нужна светлая тема строка должна выглядеть так:
Exec=env GTK_THEME=Adwaita:ligh geany %F
Тему можно жестко привязать двумя способами. Первый вариант привязать в корне системы по адресу:
Для всех пользователей, или второй вариант привязать в домашний каталог по адресу:
Для текущего пользователя. Я предпочитаю и рекомендую хранить различные пользовательские настройки в домашнем каталоге, но рассмотрю оба варианта.
Изменение темы для текущего пользователя
Откроем и отредактируем наш файл запуска:
sudo nano /usr/share/applications/geany.desktop
добавим в нее запись env GTK_THEME=Adwaita:dark и приведем к виду :
Exec=env GTK_THEME=Adwaita:dark geany %F
Сохраним и запустим Geany:
Как видим все работает.
Снова запустим GtkInspector, перейдем на вкладку Внешний вид, попробуем переключить тему. Смена темы заблокирована (затемнена и неактивна), при наведении мыши на переключатель появляется окно с надписью «Тема жестко задана с помощью GTK_THEME» (к сожалению технически я не могу показать всплывающее окно на скриншоте). Как видим мы жестко привязали темную тему к приложению Geany, и сменить тему не получится.
Изменение темы для всех пользователей
Скопируем файл geany.desktop в домашний каталог .local/share/applications через терминал:
cp -r /usr/share/applications/geany.desktop
Или можно воспользоваться файловым менджером Nautilus. Далее откроем скопированный файл по адресу:
Как и в первом случае найдем строку:
Отредактируем, и приведем к виду:
Exec=env GTK_THEME=Adwaita:dark geany %F
И также проверим:
Как видим и здесь все работает. Вернуть в исходное состояние тему можно редактированием файла в корне или редактированием (или удалением) файла в домашнем каталоге.
Таким образом можно изменить тему одного или нескольких приложений на свой вкус. Стоит отметить, что согласно решению разработчиков Gnome-terminal имеет свое меню настроек и игнорирует темы. Кроме того, некоторые приложения GTK могут не соблюдать переменную: env GTK_THEME. Но это всегда можно проверить программой GtkInspector.
GTK+ 3 на винде. Нативные UI-элементы.
Да-да, знаю, что оффтопик, но косвенно с линуксом это связано — это портирование GTKшных приложений под разные платформы.
Стал часто натыкаться на сообщения по типу «если пишешь гуйню под винду, то бери qt, ведь gtk в ней выглядит убого». Я вот просто накатил ее на виртуалку и решил проверить, так ли это. Поставил mingw, там поставил пакет gtk3, в комплекте шла демка с кодом на C. В файле /mingw64/bin/gtk-3.0/settings.ini дописал:
Диалог выбора файла и диалог печати тоже виндовые и работают исправно.
На маке раньше были костыли с притягиванием в качестве зависимостей всяких X11 пакетов, но теперь это пофиксили и разработали jhbuild специально для создания GTK+ приложений под мак (не знаю как там с нативной темой, но тем а-ля MacOS довольно много и вполне можно заюзать одну из них).
Этим постом просто хочу развеять мифы о том, что у GTK+ кроссплатформенность хромает и обязательно нужно учить кресты ради Qt. Вполне можно написать на Rust что-нибудь кроссплатформенное и с GUI.
Кстати, все зависимости GTK+ под виндой весят чуть больше 40 МБ, что по сегодняшним меркам не так уж много.
P.S. ИМХО нативные темы — это вовсе необязательно, у виндузятников полно приложений, которые выглядят вырвиглазно на фоне остального. Например фотошоп по умолчанию с темной темой и всем нравится.
Этот пост как раз и показывает, что GTK+ ненужен.
На скринах полностью виндовые элементы гуя
Кстати, все зависимости GTK+ под виндой весят чуть больше 40 МБ
Qt в два-три раза меньше.
А вот тут виндовые, да? https://www.besplatnyeprogrammy.ru/wp-content/uploads/qbittorrent-1.png Скачал только что простенькую прогу на Qt Win32 Disk Imager. 32bit версия весит 45 МБ, там один opengl32sw.dll весит 15 МБ (хз зачем там OpenGL если честно).
Всё так. Кроме того, дроч на «нативные» вендоэлементы не нужен. Они говно и каждая третья поделка всё равно себя рисует как хочет, такова жизнь на венде.
Да я вообще не из таких, но Adwaita выглядит в винде довольно убого. Наверное надо поискать тему получше, но не обязательно win32 =) Главное, что печать работает и диалог выбора файла не введет пользователя в ступор.
Это какая-то херня. Мне пришлось его форкнуть, чтобы виндузятники могли заливать образы нашего софта. Сборки весят 12мб, при том, что я туда ещё немного буста впихнул.
все зависимости GTK+ под виндой весят чуть больше 40 МБ
Должно быть меньше. Там icu что ли?
Скачал только что простенькую прогу на Qt
Ну мою глянь, я её специально под винду статически собирал. Экзешник, куда всё нужное от Qt собрано — 11,7 Мб.
И да, корректно сравнивать не GTK+ с Qt, а GTK+ с QtGui+QtWidgets. Полная Qt — это немножко совсем другой уровень.
Дай ссылку, где ты берешь gtk3 под винду.
Его ещё больше можно ужать под виндой, например, вырубив неиспользуемые классы с помощью утилиты QConfig. Я добивался размера самой библиотеки Qt 4 в 700-900 КБ.
Впрочем, Qt 5 намного более жирный. И статическая сборка твоего приложения на Qt 5 будет уже где-то 20 МБ.
Я, если что, не против GTK. Просто насколько я понимаю, если говорить о кроссплатформенности, то под виндой там многовато придётся скручивать изолентой. А в Qt SDK из коробки есть практически всё нужное, включая систему сборки.
Тут всё написано:
в Qt SDK из коробки практически всё
Ну именно поэтому Qt называется фреймворком, а GTK+ называется просто тулкитом.
где брать gtk3-библиотеки for end-users для винды?
Ну да, ты абсолютно прав, оно просто в инсталлере пожато хорошо, итого 45мб. Специально сходил проверил.
P.S. Оффтопик в виартулке с аптаймом в 4 месяца раскручилвался минут 10, пока я смог через RDP что-то внятное сделать, жесть какая дрянь.
Например, из проекта MSYS2, как наверняка сделал это ТС.
Либо собрать самому.
Можно ссылку, где там библиотеки gtk3 для винды?
Что-то не очень «for end-users».
Впрочем, Qt 5 намного более жирный. И статическая сборка твоего приложения на Qt 5 будет уже где-то 20 МБ.
И кстати, если у тебя есть желание и проект юзает обычный PRO-файл для построения, то можешь это проверить. Для этого совсем не нужно компилировать Qt 5 в статике. Он уже есть в пакетах MSYS2 и его можно просто установить и использовать:
Вот только C++-код для статической сборки под Qt 5 требует внесения специальных изменений. См, например, это:
Можно ссылку, где там библиотеки gtk3 для винды?
Т.е. содержимое /mingw64/bin/ нужно распаковать куда-то в винде (про винду мало что знаю), и приложение собранное с gtk3 (my-app.exe) будет работать?
Ставите msys2 и вводите pacman -S mingw-w64-x86_64-gtk3 Через mingw сейчас многие проекты собираются, gcc на windows работает отлично. А если еще проще, то есть неофициальный инсталятор: https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer Он сам все прописывает в PATH и кодить можно на C/C++ хоть в Visual Studio. Еще был установщик для питона, но он не обновляется и работает сейчас только с питоном 3.4. В комплекте с ним шли gjs и Lua-JIT с lgi. На данный момент все это есть в репах msys.
В винде всё именно так, причем со всеми либами. Однако же, если нет желания возиться с MSYS и хочется юзать более нативные инструменты, то есть пакетный манагер для либ — vcpkg от микрософта, для студии никаких настроек не требует, интегрируется с CMake и содержит большинство нужных либ. В том числе и GTK 3.
Вам нужно использовать MSYS2 под Windows, как рекомендуют разработчики GTK+3, он подтянет все необходимые зависимости для сборки, как в обычном Linux’овом окружении.
и приложение собранное с gtk3 (my-app.exe) будет работать?
Ну если вы сложите к собранному приложению все его DLL-зависимости и зависимости GTK+3, то да. Как у вас сейчас приложение собирается без GTK+3 тогда, раз возникает этот вопрос? Мне непонятен этот момент.
На скинах говно, соре.
Ну вот видите, не удивлюсь, если и GTKшные приложения можно сжимать примерно до такого же размера. Так что думаю, что во-первых сейчас многие Android приложения весят больше, чем эти 40 МБ, а во-вторых есть UPX, если для кого-то это имеет значение. Но может ли кто-нибудь оьъяснить зачем в Qt5 приложении под виндой OpenGL?
Ну так ставишь крутую тему с неончиком вместо теней и все становится круче, чем в Need for Speed))) Тем ведь дофига для гнома.
Тем более я все виндовые эффекты выключил, поэтому она и выглядит как должна говно
GTK выглядит душевно, любой. Qt без долгой обработки напильником — как чужеродное ненужно. Хотя это не отменяет юзабельности программ на Кю-те. ¡Que viva GTK!
Для этого совсем не нужно компилировать Qt 5 в статике.
Поздно, я уже скомпилировал. 🙂 Билды, правда, всё равно пока выкладываю с 4.8.6, пока не доделал то, для чего мне Qt5 нужна.
Ну если вы сложите к собранному приложению все его DLL-зависимости и зависимости GTK+3, то да. Как у вас сейчас приложение собирается без GTK+3 тогда, раз возникает этот вопрос? Мне непонятен этот момент.
Я рассматриваю вопрос с позиции конечного неискушенного пользователя винды. Я себе это представлял так:
есть некий софт my-app.exe, который зависит от Gtk3. Соответственно, нужен некий https://webpath/to/setup-gtk3.exe инсталятор (набор dll), Скачал инталятор, проинсталировал и my-app.exe можно запустить.
Но может ли кто-нибудь оьъяснить зачем в Qt5 приложении под виндой OpenGL?
У разжиревшего Qt 5 в зависимостях к модулю QtGui обязателен OpenGL, даже если приложение никакой OpenGL и не использует. Эта зависимость не только под виндой, но и под Linux’ом и (наверное) macOS. И точно так же, под Linux’ом приложения на Qt 5 не используют OpenGL, но от него зависят. Лулз-тред на ЛОРе, с обсуждением сего: qt 5.3 и qt 5.5 (комментарий)
Зависимость QtGui от OpenGL была сделана для таких вот специфичных трюков, которые описываются, например, здесь:
А пример использования в реальных приложениях можно посмотреть здесь:
Далее, отвечаю на вопрос, зачем нужна библиотека opengl32sw.dll для приложений на Qt 5?
Суть в том, что в любой MS Windows в стандартной поставке «из-коробки» используется старейший OpenGL 1.1 родом из 1997 года:
А Qt 5 работает лишь c OpenGL >= 2.1
Поэтому, если приложение всё-таки использует OpenGL, то алгоритм подгрузки либ, согласно официально документации, получается следующий:
1. Проверяется библиотека opengl32.dll
Если эта библиотека в вашей ОС поставляется vendor’ом вашего GPU (AMD, NVidia, Intel) и имеет реализацию OpenGL 2.1, то она и будет использоваться без каких-либо ограничений. Это множество включает в себя большинство случаев и компьютеров.
Если же opengl32.dll в системе это дефолтная реализация OpenGL от MS Windows, родом из 1997 года, то значит требуется перейти к шагу №2. Этот случай повсеместно встречается в офисных компах «без видеокарты» или же ноутбуках с Intel GPU, где забили на реализацию OpenGL под MS Windows или она косячная.
2. Проверяется возможность работы через ANGLE
Итак, если ваша реализация OpenGL в системе оставляет желать лучшего, то Qt 5 пытается заюзать костыль под называнием ANGLE. Его суть в том, чтобы все вызовы OpenGL или OpenGL ES транслируются в вызовы DirectX. Библиотека ANGLE изначально была разработана Google для браузера Chrome для аналогичных целей.
В случае если ANGLE по каким-либо причинам использовать не получается, то переходим к шагу №3. Причин таких может быть несколько: видеокарта не поддерживает DirectX 9.0c, отсутствуют библиотеки ANGLE и DirectX в поставке с приложением, и т. д.
3. Fallback-режим: использование opengl32sw.dll
Если все проверки на OpenGL/DirectX зафейлились, то приложение переходит к использованию библиотеки opengl32sw.dll аля LLVMPipe. Её суть в реализации OpenGL на мощностях не GPU, а CPU. Медленно, зато будет работать.
Вот такие пироги. Зачем всё это приложению на Qt 5 с двумя кнопками — остаётся загадкой. Но видимо утилита windeployqt считает, что так и нужно.
P.S. Отвязать модуль QtGui от OpenGL можно лишь пересборкой всего Qt с флажком -disable-opengl. Однако во всех стандартных бинарных сборках для MS Windows и Linux эта фича активирована по умолчанию.
Как решение — если приложение точно не использует модули зависящие от OpenGL или не использует OpenGL из QtGui; и не планирует, то можно забить на все эти доп. либы аля ANGLE и opengl32sw.dll и тупо их вырезать. Места освободится много, а функциональность нарушена не будет.
С позиции конечного неискушённого пользователя винды тебе вообще не нужно знать об GTK+3.
Эта задача не входит в end-user’ские. Когда ты устанавливаешь GIMP или Inkscape в винду, ты греешь голову мыслями о GTK+? Или когда устанавливаешь какое-нибудь приложение на Qt 5, вроде IDA Pro, ты что, устанавливаешь Qt?
Для тебя, как для end-user’а, этот GTK+ будет распространяться вместе с программой нужной и оттестированной версии. Вместе со всеми его зависимостями. И вместе с другими зависимостями самой программы.
Понял, спасибо. Как обычно — винда весит гораздо больше, чем почти любой Linux дистрибутив, а в базовой поставке даже OpenGL нормального нет. Они даже DirectX свой родной по-моему только в 8 включили, до этого надо было ставить.
Отлично. Ничего не понимаем — но выводы делаем.
А почему не 4.8.7? У меня где-то была скомпиленная сборка Qt этой версии, валяющаяся на сервере под Ubuntu с MinGW-w64. Если что, могу дать доступ для сборки. Или у тебя там используется компилятор от MS Visual Studio?
Проблема с Qt 4 — отсутствие поддержки HiDPI экранов. В случае с Qt 5, насколько я помню, достаточно пересобрать приложение и выставить ему необходимый новый атрибут:
Это для того, чтобы скейлилось не виндой и мыльно, а самим фреймворком Qt.
Когда ты устанавливаешь GIMP или Inkscape в винду, ты греешь голову мыслями о GTK+?
Лет 10 назад, для установки GIMP нужно было установить Gtk. Вроде была инструкция, что-то вроде «прежде установите Gtk+ отсюда (и ссылка на инсталятор)»
У разжиревшего Qt 5 в зависимостях к модулю QtGui обязателен OpenGL
Отлично. Ничего не понимаем — но выводы делаем.
Ну если это оно:
То ему нахер этот OpenGL не нужен. Однако, по всей видимости windeployqt в разжиревший Qt 5 его радостно притянул. И все решили (разраб в том числе) что «это норма» (с) и наложили в релиз ненужных либ.
Если человек не понимает что делает — это не проблемы Qt.
А подробнее? Вряд ли модератор полезет в доки Qt. Да и вообще написано, что ее можно удалить. Как уже написали, эта либа на 15 МБ нужна для винды без графического драйвера, тогда интерфейс рисуется процессором. Хм, интересно было бы погонять какое-нибудь GTK приложение в таком режиме, запустится ли?
Вряд ли модератор полезет в доки Qt.
Какой ещё модератор?
Как уже написали, эта либа на 15 МБ нужна для винды без графического драйвера, тогда интерфейс рисуется процессором.
Это чушь. QtWidgets по умолчанию работает на проце.
Так можно ли содержимое /mingw64/bin/ из http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-gtk3-3.24.1-1-any.pkg.tar.xz распаковать куда-то в винде и использовать эти библиотеки для бинарного gtk3-приложения (не пакуя их вместе)?
Ну так вы ж изволили написать «4.2», а это как бы указание на мнимое нарушение. Или это такое ругательство местное?
Речь не про QtWidgets, он не зависит от OpenGL, а про QtGui.