LINUX.ORG.RU

GTK+ 3 на винде. Нативные UI-элементы.

 , ,


1

2

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

Стал часто натыкаться на сообщения по типу «если пишешь гуйню под винду, то бери qt, ведь gtk в ней выглядит убого». Я вот просто накатил ее на виртуалку и решил проверить, так ли это. Поставил mingw, там поставил пакет gtk3, в комплекте шла демка с кодом на C. В файле /mingw64/bin/gtk-3.0/settings.ini дописал:

[Settings]
gtk-theme-name=win32
Получилось вот это: https://imgur.com/a/Du5AWnn На скринах полностью виндовые элементы гуя, только ползунки там почему-то отображаются немного не так, но это не страшно. Страшнее, что «толстые» шапки окон отображаются как в 7 винде. Похоже, что поддержку таких шапок оставили в качестве легаси. Что же, полмира на семерке еще сидит, так что у них все нормально будет.

Диалог выбора файла и диалог печати тоже виндовые и работают исправно.

На маке раньше были костыли с притягиванием в качестве зависимостей всяких X11 пакетов, но теперь это пофиксили и разработали jhbuild специально для создания GTK+ приложений под мак (не знаю как там с нативной темой, но тем а-ля MacOS довольно много и вполне можно заюзать одну из них).

Этим постом просто хочу развеять мифы о том, что у GTK+ кроссплатформенность хромает и обязательно нужно учить кресты ради Qt. Вполне можно написать на Rust что-нибудь кроссплатформенное и с GUI.

Кстати, все зависимости GTK+ под виндой весят чуть больше 40 МБ, что по сегодняшним меркам не так уж много.

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

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

D

У него есть кроссплатфоремнная либа для гуя написанная полностью на D. И есть биндинги Qt.

Им же тоже возможно хочется кроссплатформенную гуйню писать

С D тут проблема может возникнуть только в кросскомпиляции, да и то из-за dub, потому что ldc умеет в кросскомпиляцию без всяких mingw

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

Только его никто не использует. Интересно почему?

Потому что это проект GNU. И все используют C#, потому что он намного легче в изучении, чем кресты. GTK конечно менее популярен, чем Qt, но многие обертки используют его в качестве бэкенда на Linux, потому что это удобнее для разработчиков этих оберток.

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

У него есть кроссплатфоремнная либа для гуя написанная полностью на D

Это dlangui от нашего соотечественника? Или ещё что-то есть?

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

Так вот я и про то же самое говорю. Прочти выше на что я ответил ))

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

Так отвисло или заново перезапустил установку?

Висело минут 15, затем нарисовало окно. Перезапускал трижды, безрезультатно.

Интересно, если GTK-либу взять из GIMP'а, поможет ли это? :) Хотя Pidgin вроде на GTK+3.

Пиджин на гтк2, насколько я помню. Но дело в том, что пиджин х86, а гимп amd64.

P.S.: http://pic4a.ru/i4kT/ Чего-то с совпадениями по именам библиотек вообще беда :)

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

там на гитхабе каждый васян свой биндинг пилит

Это разве не считается? Плюс в современном D запилили поддержку конструкторов и деструкторов для C++ классов, так что можно даже номальные биндинги запилить.

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

Да, я про этот труп.

А что так пессимистично?

Мне вот понравилось, что у Dlang UI есть возможность заюзать консольный backend:

https://camo.githubusercontent.com/5e1d7d31b184269bb5756a183b7330a3ff7e5ac4/6...

Интересная фича. Её применение можно найти на серверах :)

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

Это всё? О каких фичах ты говорил?

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

Только старые не забудь забекапить.

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

У старого GIMP'а — старые GTK+-либы с багом в раскладке. Тут человек, наоборот, пытается новой либой из GIMP'а без бага заменить старую в Pidgin'е.

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

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

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

Поддерживаю. Выглядит классно. Еще бы мышку в виде курсора консольного, как в старые добрые времена :)

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

А что так пессимистично?

Суровая правда жизни. Сам DlangUI не развивается с 2016 года, выходят только патчи, при чем один из последних PR, висел нидели 2, который просто фиксил импорт Сишных строк под новый компилятор (стабильную версию).

P.S. dlangide тоже мертв. Уже не компилируется, я кинул PR с исправлением и тоже висит уже 10 дней. Плюс интеграция с DCD устарела и теперь автокомплит кривой. Был бы проект жив такого бы не было, для примера PR для ImGui рассматриваются в тот же день.

SR_team ★★★★★
()

Тред переписи адекватов с одним поехавшим фанатиком.

Guess who is who.

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

gpm же. Но этот бекенд багованый (только на линуксе?), есть проблемы с вводом.

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

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

Автор кстати хотел свою программу (Cool Reader) на D и свою либу Dlang UI переписать. Да видимо так всё и заглохло на этапе планов.

EXL ★★★★★
()

Из кроссплатформенного есть ещё: FOX toolkit, FLTK и Wx.
Они ещё меньше размером и выглядят более менее (не как Tk).

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

Инсталлятор 2.10.6 переделывали, только уже не помню, почему. Сейчас есть 2.10.8.

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

Не знаю, вроде да.
Но я щас посмотрел - они изначально все на C++,
а автору нужен голый Си.

Novator ★★★★★
()

Это ты ещё wx не видел.

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

Он настолько мнимый, что:

Qt - не могу скомпилировать - /usr/bin/ld: cannot find -lGL
Qt ошибка: collect2: error: ld returned 1 exit status
Qt Creator
qt widget в linux rosa
OpenGL в QT
Разработка Qt Creator
Проблема с пакетом
qt 5.3 и qt 5.5 (комментарий)

И десятки таких подобных тредов здесь.

Вот ведь парадокс, проблема по мнению RazrFalcon мнимая, а сотня-другая тем с этой хренью на форуме имеется.

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

Впринцыпе есть более короткое обьяснение. В старые добрые времена, когда Qt рулила TrollTech, движек Qt представляло собою кучку костылей скрепленных скотчем (в отличие от вылизанного GLib). И чтобы в этих условиях получить нормальный юзер-экспириенс было принято решение все что можно отрисовывать на видеокарте, через OpenGL. С тех времен OpenGL в Qt - что-то типа традиции. Что из себя представляет движек Qt на сегодня я не знаю, но буду удивлен если что-то изменилось.

ArkaDOSik

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

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

Мифы нашего двора #1

Виджеты в Qt как отрисовывались процессором с самых первых версий, так и отрисовываются в последних. OpenGL там совсем не для отрисовки виджетов.

Заставить Qt рендерить виджеты через OpenGL можно с помощью специальных platform-plugins, но нигде по-умолчанию это не используется.

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

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

Ещё один. Что же в Qt отрисовывается через OpenGl? Неужели контролы?

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

Ещё раз повторюсь, что в Qt 4 таких проблем просто не существовало. И ещё раз повторюсь, что ты споришь с тем, что деплой усложнился. Эта сотня тем (далеко не последняя на этом форуме) как раз ещё одно подтверждение моих слов.

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

Я рад, что уверены в собственной правоте.

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

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

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

Если добавили зависимость - значит на то были причины.

Какие-то сомнительные причины пихать в QtGui инициализации GL-контекстов, Vulkan-контекстов, раз они в Qt 5 пытаются сделать всё максимально модульно. Не ровён час и эту QtGui разделят, как недавно разделили вот ту самую qwindows.dll, про которую я выше говорил. И в этом случае я буду только рад, ведь тогда проблема с линковкой этого OpenGL уйдёт вообще.

ибо кроме вас об это никто не говорит.

Никто не говорит, но сотни тем на ЛОРе с этой проблемой создаются. Вы либо не видите этого, либо не хотите видеть.

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

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

Значит зацикленность в моих ответах вы склонны замечать, а зацикленность в вопросах пользователей для вас остаётся вне внимания. Поразительная избирательность.

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

GTK+ будет распространяться вместе с программой нужной и оттестированной версии.

Как это правильно паковать?:

$ meson my_app builddir --cross-file x86-windows
$ cd ./builddir && ninja
$ wine my_app.exe
0009:err:module:import_dll Library libgdk-3-0.dll (which is needed by L"Z:\\home\\vic\\Projects\\builddir\\src\\my_app.exe") not found
0009:err:module:import_dll Library libgio-2.0-0.dll (which is needed by L"Z:\\home\\vic\\Projects\\builddir\\src\\my_app.exe") not found
0009:err:module:import_dll Library libintl-8.dll (which is needed by L"Z:\\home\\vic\\Projects\\builddir\\src\\libglib-2.0-0.dll") not found
0009:err:module:import_dll Library libgcc_s_sjlj-1.dll (which is needed by L"Z:\\home\\vic\\Projects\\builddir\\src\\libglib-2.0-0.dll") not found
0009:err:module:import_dll Library libglib-2.0-0.dll (which is needed by L"Z:\\home\\vic\\Projects\\builddir\\src\\my_app.exe") not found
0009:err:module:import_dll Library libgobject-2.0-0.dll (which is needed by L"Z:\\home\\vic\\Projects\\builddir\\src\\my_app.exe") not found
0009:err:module:import_dll Library libgtk-3-0.dll (which is needed by L"Z:\\home\\vic\\Projects\\builddir\\src\\my_app.exe") not found
0009:err:module:import_dll Library libintl-8.dll (which is needed by L"Z:\\home\\vic\\Projects\\builddir\\src\\my_app.exe") not found
0009:err:module:LdrInitializeThunk Importing dlls for L"Z:\\home\\vic\\Projects\\builddir\\src\\my_app.exe" failed, status c0000135
Нужен msi?

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

Очевидно, тебе во-первых, нужно собрать все эти DLL-зависимости в дистрибутив своей программы. А потом хоть MSI, хоть просто архивом распространяй.

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