Gtk linux что это
Введение в GTK
На ХабраХабре наконец-то появился новый блог, посвящённый GTK. Присоединяйтесь! 🙂
В сети бытуют страшные слухи об этом фреймворке, однако серией статей о нём на ХабраХабре я попытаюсь разрушить сложившиеся стереотипы.
GTK+ — это фреймворк для создания кроссплатформенного графического интерфейса пользователя (GUI). Наряду с Qt он является одной из двух наиболее популярных на сегодняшний день библиотек для X Window System.
Изначально эта библиотека была частью графического редактора GIMP, но позже стала независимой и приобрела популярность. GTK+ — это свободное ПО, распространяемое на условиях GNU LGPL и позволяющее создавать как свободное, так и проприетарное программное обеспечение.
Как это работает
GTK+ написан на языке Си, однако несмотря на это, является объектно-ориентированным. Также можно использовать обёртки для следующих языков: Ada, C, C++, C#, D, Erlang, Fortran, GOB, Genie, Haskell, FreeBASIC, Free Pascal, Java, JavaScript, Lua, OCaml, Perl, PHP, PureBasic, Python, R, Ruby, Smalltalk, Tcl, Vala.
Внутри GTK+ состоит из двух компонентов: GTK, который содержит набор виджетов (кнопка, метка и т.д.) и GDK, который занят выводом результата на экран.
Внешний вид приложений может меняться программистом и/или пользователем. По-умолчанию приложения выглядят нативно, т.е. так же, как и другие приложение в этой системе. Кроме того, начиная с версии 3.0, можно менять внешний вид элементов с помощью CSS.
Делаем «Hello, World»
Для начала за основу возьмём вот такую заготовку:
Пожалуйста, не используйте одинарные комментарии (//), если как и я решили писать на Си.
Давайте для начала создадим окно нашего приложения. В GTK существует несколько типов окошек, но нам понадобится обычный GtkWindow. Вставьте в нашу заготовку следующий код:
Прежде чем продолжить, несколько слов об упаковке.
В GTK+ виджеты принято размещать не по координатам, а упаковывать в специальные контейнеры. Окно, которое мы создали, также является контейнером, который может содержать только один виджет. Нам этого хватит, но в ином случае нам бы пришлось добавить специальный виджет-контейнер, который может представлять из себя сетку, а также горизонтальные или вертикальные поля. Но об этом я подробнее расскажу в следующем топике.
Пока остановимся на окне. Напомню, что окно — это контейнер, которому мы указали толщину границ в 50 пикселей. Что это значит?
Это значит, что мы создаём своего рода невидимую рамку вокруг этого контейнера и по этому ничего не сможем разместить в этой области.
Теперь рассмотрим сигналы.
Мы можем связать определённое событие, которое должно произойти с виджетом, со своей функцией.
Теперь создадим кнопку, по нажатию на которую будет появляться окошко с надписью «И тебе привет, %username%!».
Кнопка (GtkButton) — это тоже контейнер, который также может содержать один виджет. Чтобы не усложнять код созданием метки и помещением её в кнопку, сделаем вот так:
Выглядеть это будет так:
Теперь реализация функции welcome :
Результат после нажатия:
Вот так просто и быстро мы создали рабочую программу. В следующих топиках я расскажу про использование Glade (программа, чтобы рисовать виджеты без кода) и создание собственных виджетов.
Компиляция
Не забудьте установить пакет GTK для разработчика (кончается на «-dev»).
Что-нибудь ещё?
Да, пожалуй, приведу несколько ссылок:
www.gtkforums.com — англоязычный форум, посвящённый GTK
developer.gnome.org — информация для разработчиков под среду GNOME. Содержит много полезной информации о GTK, в том числе и на русском языке.
UPD: Полный код примера на PasteBin — pastebin.com/iPttWBne
В чем разница между GTK+ и Qt?
Языки программирования и инструментарий – сложные темы. Вероятно, вам удавалось использовать компьютеры долгое время, не задумываясь.
Но когда вы переключились на GNU/Linux, проблема внезапно стала актуальной. Это потому, что насколько хорошо приложение интегрируется с остальной частью вашего рабочего стола, часто возникает вопрос: сделано ли оно в GTK+ или Qt?
Что такое GTK+ и Qt?
GTK+ и Qt – это наборы инструментов, которые разработчики используют для структурирования внешнего вида и ощущения приложения. Эти наборы инструментов предоставляют кнопки, панели инструментов, ползунки и меню, которые вы видите при использовании приложения.
Инструментарий экономит время разработчиков. Вместо того, чтобы кодировать или проектировать размер, форму и внешний вид каждой кнопки, они могут позволить инструментарию позаботиться об этой работе. Это позволяет им сосредоточиться на основных функциях, которые предоставляет приложение, таких как редактирование документов или воспроизведение музыки.
История GTK+ и Qt
Haarvard Nord и Eirik Chambe-Eng начали разработку Qt в 1991 году. Название, которое произносится как «милый», появилось из-за того, как буква Q выглядела в шрифте Eavcs Haavard и предыдущего использования буквы t в Xt, X инструментарий уже используется на рабочих столах Unix.
Nord и Chambe-Eng позже стали соучредителем Quasar Technologies, которая стала Throll Tech, затем Throlltech, и теперь существует в другой форме, как The Qt Company.
В 1995 году Throll Tech выпустила исходный код для версии Qt для GNU/Linux. Но это не соответствовало определению Free Software Foundation (FSF), так как людям не разрешалось распространять код, если они вносили какие-либо изменения. Только в 2000 году Throlltech предоставил пользователям свободу свободно редактировать и распространять код.
GTK+ начинался как GIMP Toolkit, созданный Питером Мэттисом в качестве замены существующего интерфейса, используемого в программе манипуляции изображениями GNU. После переписывания инструментарий стал GTK+ и вышел в 1998 году. В отличие от Qt, у людей была свобода редактировать, изменять и делиться GTK+ с самого начала.
Хотя Qt в некотором смысле является более универсальным и адаптируемым инструментарием, сообщество в течение первых лет консолидировалось вокруг GTK+. Стоит также отметить, что некоммерческий фонд GNOME теперь поддерживает GTK+, в то время как публично торгуемая компания The Qt Company ведет разработку Qt. Тем не менее, на данный момент ни один инструментарий не является «более бесплатным», чем другой.
Настольные ПК и программное обеспечение на базе GTK
Если вы недавно перешли на GNU/Linux, есть большая вероятность, что вы используете настольный компьютер на базе GTK. Это связано с тем, что многие из лучших сред GNU/Linux для настольных систем используют GTK+.
Возьмите GNOME, опцию по умолчанию в таких известных и хорошо зарекомендовавших себя ОС GNU/Linux, как Ubuntu, Fedora и Debian. Затем есть альтернативы, такие как MATE и Xfce, которые предлагают более легкие и более традиционные интерфейсы.
Давайте не будем забывать об elementary OS, новичке, который обслуживает последние коммутаторы больше, чем давние пользователи GNU/Linux.
Многие из самых популярных приложений с открытым исходным кодом лучше интегрируются с десктопами на базе GTK. Это включает в себя такие программы, как Firefox, Thunderbird, LibreOffice и GIMP. Менее известные кроссплатформенные приложения на основе GTK включают AbiWord, Inkscape и Pidgin.
Среди приложений GTK+ растет степень разнообразия. Программное обеспечение, разработанное специально для GNOME, может выглядеть неуместно даже на других настольных ПК на базе GTK. Это связано с тем, что руководящие принципы разработки интерфейса пользователя GNOME не поощряют использование меню и вносят другие, менее распространенные изменения.
Также знайте, что многие приложения, предназначенные для elementary OS, недоступны для других рабочих столов.
Между тем, большинство вышеупомянутых популярных кроссплатформенных инструментов GTK+ остаются относительно независимыми от настольных компьютеров (что означает, что они выглядят неуместно в GNOME и elementary OS, поскольку акцент делается на уникальном дизайне).
Настольные ПК и программное обеспечение на основе Qt
Рабочий стол KDE Plasma является старейшей полнофункциональной рабочей средой для Linux. Если бы Qt был полностью открыт еще в 1996 году, GNOME мог бы даже не существовать. Более двух десятилетий спустя сообщество KDE продолжает предоставлять самый многофункциональный рабочий стол GNU/Linux.
Поскольку существует так мало других настольных ПК на базе Qt, многие приложения Qt специально разработаны для настольных компьютеров Plasma и могут даже зависеть от различных компонентов KDE. По этой причине интеграция программного обеспечения KDE является одной из лучших среди любых настольных систем.
Вы можете настроить интерфейс, который влияет на каждое приложение, или вы можете настроить одно приложение, пока оно не станет удобным. Тем не менее, Plasma Desktop не единственный, кто использует Qt. LXQt – это одна из альтернатив, которая фокусируется на том, чтобы быть легче и проще.
Хотя некоторые программы KDE являются кроссплатформенными, эти программы не так известны за пределами сообщества GNU/Linux. Наиболее заметными исключениями могут быть Krita и digiKam.
Не все программное обеспечение Qt специально разработано для KDE. К таким программам относятся медиаплеер VLC и настольное издательское приложение Scribus.
Насколько важна разница?
Есть технические различия между GTK+ и Qt, но большинство из них больше интересуют разработчиков, чем кого либо из нас. В наши дни ограничения еще труднее заметить, чем раньше. Благодаря отличной гибкости, многие приложения GTK+ теперь выглядят как дома на рабочем столе Plasma на базе Qt. Некоторые из этих приложений выглядят лучше на плазме, чем в GNOME.
Между тем, вы также можете установить Scribus или VLC на рабочий стол на базе GTK, даже не осознавая, что есть разница за кулисами.
Но небольшие несовместимости появляются время от времени. Приложения могут открывать другое окно выбора файлов, когда вы ищете файл для открытия. Настройки системных тем могут относиться к определенным приложениям, но не к другим. Чем больше вы возитесь с вашим рабочим столом, тем больше причуд может появиться.
В конечном счете, вопрос о том, предпочитать ли вам GTK+ или Qt, сводится к выбору вашего любимого интерфейса рабочего стола и ваших любимых приложений для Linux.
Gtk linux что это
Библиотека очень проста в понимании и использовании. Очень удобна.
Распакуем файлы:
$ tar xvfz filename.gz
Если ругается на отсутствие чего либо, но вы уверенны, что устанавливали это. Тогда набираем вот такую команду:
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
По этому адресу будут искаться конфигурационные файлы от ваших библиотек. Или скопируйте все файлы из /usr/local/lib/pkgconfig/ в /usr/lib/pkgconfig/
Скорее всего у Вас ничего не потребуют устанавливать в большинстве систем уже установлены необходимые библиотеки как и GTK+. Ну вот вроде всё в порядке, всё установлено.
Соберём просто пустое окно.
#include
int main( int argc,
char *argv[] )
<
GtkWidget *window;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
Создаем окно параметром GTK_WINDOW_TOPLEVEL указываем, что окно управляется менеджером окон и использовать его настройки. Этим gtk_widget_show (window) говорим, что этот виджет настроен и готов к отображению. Запуск главного цикла ожидает всяких событий gtk_main.
void hello(GtkWidget *widget, gpointer data)
<
g_print («Hello, World. n»);
>
gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data)
<
g_print («delete event occurredn»);
void destroy(GtkWidget *widget, gpointer data)
<
gtk_main_quit();
>
int main(int argc, char *argv[])
<
GtkWidget *window;
GtkWidget *button;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window),»delete_event»,
G_CALLBACK(delete_event), NULL);
g_signal_connect(G_OBJECT(window),»destroy»,
G_CALLBACK(destroy), NULL);
button = gtk_button_new_with_label(«Hello World. «);
g_signal_connect(G_OBJECT(button), «clicked»,
G_CALLBACK (hello), NULL);
g_signal_connect_swapped(G_OBJECT(button), «clicked»,
G_CALLBACK (gtk_widget_destroy),
G_OBJECT(window));
gtk_container_set_border_width (GTK_CONTAINER (window),
10);
gtk_container_add(GTK_CONTAINER (window), button);
Компилируется подобно первой программе. Мы здесь использовали 6 новых библиотечных функции и 3 свои. Опишем библиотечные. Функция g_print сообщение на терминал из которого мы запустили программу работает, как printf. Функция g_signal_connect:
Привязывает к определённому объекту object вызов функции func по событию name с передачей параметра func_data. Возможны следующее варианты функции callback:
В эту функцию передается указатель на объект для которого произошло событие, само событие и какие-то данные. Если функция возвращает TRUE значит событие обработано, дальнейшая обработка не нужна, если возвращает FALSE управление передается в следующую привязанную функцию. Теперь понят почему при попытке закрыть окно крестиком в заголовке наша программа продолжает работать, как не в чем не бывало лишь сообщив нам выводом сообщения в терминал, что событие было. Функция delete_event возвращая TRUE останавливает обработку события, если заменить TRUE на FALSE окно спокойно закроется.
Передается тоже всё тоже самое, но без события. Функция ничего не возвращает. Обработка не прекращается.
Передается только объект. Функция ничего не возвращает. Обработка не прекращается. Но для привязки функции к событию используется g_signal_connect_swapped:
Параметр slot_object передает в функцию указатель на объект. Обычно используется для вызова функций GTK.
создает экземпляр кнопки с надписью.
задают обводку окна шириной 10 пикселей иначе кнопка будет в притирку к краям окна и «засовывают» кнопку внутрь окна. Далее показываем кнопку, окно и запускаем цикл.
Небольшой список событий:
Есть два основных способа компоновки виджетов 1-й с помощью коробок(box), 2-й с помощью таблиц.
void hello(GtkWidget *widget, gpointer data)
<
g_print («Quit na fig ot sel. n»);
>
gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data)
<
g_print («delete event occurredn»);
return FALSE;
>
void destroy(GtkWidget *widget, gpointer data)
<
gtk_main_quit();
>
GtkWidget * make_box(
gboolean homogeneous,
gint spacing,
gboolean expand,
gboolean fill,
guint padding)
<
GtkWidget *box;
GtkWidget *button;
box = gtk_hbox_new (homogeneous, spacing);
button = gtk_button_new_with_label («First»);
gtk_box_pack_start (GTK_BOX(box), button, expand,
fill, padding);
gtk_widget_show (button);
button = gtk_button_new_with_label («Second»);
gtk_box_pack_start (GTK_BOX(box), button, expand,
fill, padding);
int main(int argc, char *argv[])
<
GtkWidget *window;
GtkWidget *button;
GtkWidget *label;
GtkWidget *ver_box;
GtkWidget *hor_box;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), «delete_event»,
G_CALLBACK (delete_event), NULL);
g_signal_connect(G_OBJECT(window), «destroy»,
G_CALLBACK (destroy), NULL);
g_signal_connect(G_OBJECT(button), «clicked»,
G_CALLBACK (hello), NULL);
g_signal_connect(G_OBJECT(button), «clicked»,
G_CALLBACK (gtk_main_quit),
G_OBJECT(window));
ver_box = gtk_vbox_new(FALSE, 0);
label = gtk_label_new («First box»);
gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
gtk_box_pack_start (GTK_BOX (ver_box), label,
FALSE, FALSE, 20);
hor_box = make_box (TRUE, 0, FALSE, TRUE, 20);
gtk_box_pack_start (GTK_BOX (ver_box), hor_box,
FALSE, FALSE, 0);
hor_box = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start (GTK_BOX(hor_box), button,
TRUE, TRUE, 20);
gtk_box_pack_start (GTK_BOX(ver_box), hor_box,
FALSE, FALSE, 20);
gtk_container_add(GTK_CONTAINER (window), ver_box);
gtk_widget_show(button);
gtk_widget_show(hor_box);
gtk_widget_show(ver_box);
gtk_widget_show(window);
Суть метода заключается в использовании двух видов контейнеров (коробок) вертикального и горизонтально. Комбинируются они в каком угодно порядке и сочетании т.е. в один контейнер помещать другой пару кнопок и метку например. Горизонтальный контейнер помещает в себя виджеты по горизонтали в ряд. Вертикальный в столбик. Теперь рассмотрим код.
GtkWidget * make_box(
gboolean homogeneous,
gint spacing,
gboolean expand,
gboolean fill,
guint padding)
<
GtkWidget *box;
GtkWidget *button;
box = gtk_hbox_new (homogeneous, spacing);
button = gtk_button_new_with_label («First»);
gtk_box_pack_start (GTK_BOX(box), button, expand,
fill, padding);
button = gtk_button_new_with_label («Second»);
gtk_box_pack_start (GTK_BOX(box), button, expand,
fill, padding);
Функция gtk_hbox_new (homogeneous, spacing) создает горизонтальную коробку.
Параметры box, child, expand, fill и padding указывают соответственно коробку, инкапсулируемый виджет, увеличить размер коробки, если виджет «не влезает» в коробку, заполнить свободное пространство виджетом и последние отступ от виджета в пикселах. После завершения манипуляций с конкретным виджетом мы его отображаем. На этом с коробками можно закончить код достаточно прозрачен.
void hello(GtkWidget *widget, gpointer data)
<
g_print («%s was pressedn», (char *) data);
>
gint delete_event(
GtkWidget *widget,
GdkEvent *event,
gpointer data)
<
g_print («delete event occurredn»);
return FALSE;
>
void destroy(GtkWidget *widget, gpointer data)
<
gtk_main_quit();
>
int main(int argc, char *argv[])
<
GtkWidget *window;
GtkWidget *button;
GtkWidget *table;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), «delete_event»,
G_CALLBACK (delete_event), NULL);
g_signal_connect(G_OBJECT(window), «destroy»,
G_CALLBACK (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window),
20);
table = gtk_table_new (2, 2, TRUE);
gtk_container_add (GTK_CONTAINER (window), table);
button = gtk_button_new_with_label («button 1»);
g_signal_connect (G_OBJECT (button), «clicked»,
G_CALLBACK (hello), (gpointer) «button 1»);
gtk_table_attach_defaults (GTK_TABLE (table), button,
0, 1, 0, 1);
button = gtk_button_new_with_label («button 2»);
g_signal_connect (G_OBJECT (button), «clicked»,
G_CALLBACK (hello), (gpointer) «button 2»);
gtk_table_attach_defaults (GTK_TABLE (table), button,
1, 2, 0, 1);
gtk_widget_show(button);
g_signal_connect(G_OBJECT(button), «clicked»,
G_CALLBACK (hello), (gpointer) «Quit button»);
g_signal_connect(G_OBJECT(button), «clicked»,
G_CALLBACK (gtk_main_quit),
G_OBJECT(window));
gtk_table_attach (GTK_TABLE (table), button,
0, 2, 1, 2,
GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
20, 40);
gtk_table_set_col_spacing (GTK_TABLE(table), 0, 10);
Упаковка таблицами похожа на разбивку HTML.
Сначала мы создаем таблицу нужного размера x*y в данном случае 2*2.
Указывается количество строк, столбцов и выравнивание под один размер. В дальнейшем используем для задания координат в таблице следующую систему для таблицы 2*2:
Для добавления виджета в таблицу используется функция:
Отрезанные параметры принимают следующие значения по умолчанию:
Так же для форматирования используются:
Первая указывает расстояние между строкой row и строкой row + 1. Вторая тоже для столбцов. В случае, если надо установить расстояние для всех столбцов или строк используется:
Они не устанавливают spacing только для последнего столбца строки.
Т.к. и коробки и таблицы являются виджетами, то они комбинируются, как Вам нравится. Для компиляции всего этого можно использовать такой Makefile:
Gtk linux что это
GTK, or the GIMP Toolkit, is a multi-platform toolkit for creating graphical user interfaces. Offering a complete set of widgets, GTK is suitable for projects ranging from small one-off tools to complete application suites.
GTK, The GIMP Toolkit, was initially made by the GNU Project for GIMP, but it is now a very popular toolkit with bindings for many languages. This article will explore the tools used to configure the GTK theme, style, icon, font and font size, and also detail manual configuration.
Contents
Installation
Three versions of GTK are currently available in the official repositories. They can be installed with the following packages:
Themes
To force a specific theme, set the following environment variables:
More themes can be installed from the official repositories or the AUR. Manually extracted themes go in
Themes supporting GTK 2 and GTK 3:
There are a number of additional GTK themes in the AUR, example: search for gtk-theme.
GTK and Qt
If you have GTK and Qt (KDE) applications on your desktop then you know that their looks do not blend well. If you wish to make your GTK styles match your Qt styles please read Uniform look for Qt and GTK applications.
Configuration tools
Most major desktop environments provide tools to configure the GTK theme, icons, font and font size, and manage these settings via XSettings:
Other GUI tools generally overwrite the configuration files.
Both GTK 2 and GTK 3 are supported:
Only GTK 2 is supported:
Configuration
GTK settings can be specified manually in configuration files, but desktop environments and applications can override these settings. Depending on GTK version, these files are located at:
Basic theme configuration
To manually change the GTK theme, icons, font and font size, add the following to the configuration files, for example:
If the theme is not applied for GTK 3, use gsettings in addition:
Dark theme variant
Some GTK 3 themes contain a dark theme variant, but it’s only used by default when the application requests it explicitly. To use dark theme variant with all GTK 3 applications, set:
Keyboard shortcuts
Keyboard shortcuts (otherwise known as accelerators in GTK) may be changed by hovering the mouse over the respective menu item, and pressing the desired key combination. To enable this feature, set:
Emacs key bindings
To have Emacs-like key bindings in GTK applications add the following:
XFCE has a similar setting:
The config files in /usr/share/themes/Emacs/ determine what the Emacs bindings are, and can be changed. Copying sections to the users
/.gtkrc-2.0 file allows for changes on a per user basis.
GNOME menu delay
This setting controls the delay between pointing the mouse at a menu and that menu opening. This delay is measured in milliseconds.
Reduce widget sizes
If you have a small screen or you just do not like big icons and widgets, you can resize things easily.
To have icons without text in toolbars (valid values), use
To use smaller icons, use a line like this:
Or to remove icons from buttons completely:
You can also remove icons from menus:
Hide CSD buttons
To remove the client-side decorations (CSD)[3] minimize and maximize buttons from gtk3 windows:
Disable mouse paste
To turn off pasting on middle mouse button click (aka PRIMARY):
File-chooser start-up location
Open the file-chooser within the current working directory and not the recent location. Normally the current working directory is the Home directory.
Change setting with the following command:
Add the following to
Legacy scrolling behavior
Prior to GTK 3.6, clicking on either side of the slider in the scrollbar would move the scrollbar in the direction of the click by approximately one page. Since GTK 3.6, the slider will move directly to the position of the click. This behaviour can be reverted in some applications by creating the file with the content below:
Disable overlay scrollbars
Remove overlay scroll indicators
The positions of the overlay scrollbars are indicated by thin dashed lines in the application window. These dashed lines will be present even when overlay scrolling is disabled using the environment variable discussed in the section above. To remove the indicator lines, create the following file:
Examples
GTK example configurations:
GDK backends
GDK (the underlying abstraction layer of GTK) supports multiple backends to display GTK applications.
Wayland backend
The GDK Wayland backend is supported only by gtk3 and is the default backend when using Wayland display server.
Applications that use versions of GTK prior to gtk3 do not have wayland support, and need to use Xwayland in order to run on a wayland session using the X11 backend.
Xorg backend
If Xorg display server is in use, the backend defaults to x11 automatically.
Broadway backend
The GDK Broadway backend provides support for displaying GTK applications in a web browser, using HTML5 and web sockets. [5]
When using broadwayd, specify the display number to use, prefixed with a colon, similar to X. The default display number is 0 (zero).
Port used by default
Alternatively can set address and port
Troubleshooting
Different themes between GTK 2 and GTK 3 applications
In general, if a selected theme has support for both GTK 2 and GTK 3, the theme will be applied to all GTK 2 and GTK 3 applications. If a selected theme has support for only GTK 2, it will be used for GTK 2 applications and the default GTK theme will be used for GTK 3 applications. If the selected theme has support for only GTK 3, it will be used for GTK 3 applications and the default GTK theme will be used for GTK 2 applications. Thus for application theme consistency, it is best to use a theme which has support for both GTK 2 and GTK 3.
You could find what themes installed on your system have both an GTK 2 and GTK 3 version by using this command (does not work with names containing spaces):
Theme not applied to root applications
/.gtkrc-2.0 ) are not read by other accounts, the selected theme will not apply to X applications run as root. Possible solutions include:
Client-side decorations
GTK 3.12 introduced client-side decorations, which move the title-bar away from the window manager. This may present issues such as double title-bars, no title-bar at all, double shadows with compositing enabled, or being unable to move a frozen application.
To remove the shadow and gap around windows (for example in combination with a tiling window manager), create the following file:
Note that if visual problems persist, you may want to use the GTK Inspector to find the offending elements as explained here [6].
To adjust the buttons in the header bar, use the gtk-decoration-layout setting. [7] The below examples removes all buttons:
cedilla ç/Ç instead of ć/Ć
See [8], and [9] for a workaround using Xcompose (US international layout).
Suppress warning about accessibility bus
If you do not use any Gnome Accessibility features, you may receive warnings like:
To suppress these warnings, execute programs with NO_AT_BRIDGE=1 or set that as a global environment variable.
Titlebar background color mismatch
If you are using a window manager which uses a window decoration theme that mimics the GTK theme background color, you may find that the titlebar color no longer completely matches the application color in some GTK 3 applications. As a workaround, create the following file:
Wrong focus events with tiling window managers
Define GDK_CORE_DEVICE_EVENTS=1 to use GTK2 style input, instead of xinput2. [11]
Thumbnail support for GTK file dialog
Install gtk2-patched-filechooser-icon-view AUR and gtk3-patched-filechooser-icon-view AUR to have the option to view files as thumbnails instead of list in the GTK file chooser.
Button and menu icons
The factual accuracy of this article or section is disputed.
For some applications in GNOME’s Wayland session. Your
/.config/gtk-3.0/settings.ini file is misconfigured. This can happen if you try other GTK based desktop environments. These are the offending values:
Simply set them to 0 or remove the whole file to use GNOME defaults.
GTK 3 without polkit
GTK3 depends on polkit through colord, which is required for printing. However printing works fine without polkit installed; at least with a monochrome printer and package versions gtk3-print-backends=3.22.19-2 and colord=1.4.1-1.
Some GTK 2 themes only change the UI color palette
Depending on the theme of choice’s support for GTK 2, UI controls may still have the default Raleigh appearance, possibly with a different color palette. This is due to these themes requiring the GTK 2 Murrine engine, which is missing (GTK 2 programs should complain about it on their standard error output). Install the gtk-engine-murrine package.
Patching GTK file chooser to use regular type ahead
GTK file chooser uses the same type-ahead-find feature as GNOME/Files. This can be very jarring and does not fit in very well with other desktop enviroments.
Text in GTK 4 applications is blurry or renders incorrectly
GTK 4 switched to to grayscale antialiasing without hinting when rendering fonts. There is no ability to switch back to the previous behavior. You can use gtk4-without-subpixel-hinting AUR to restore GTK 3 font rendering. GTK 4.6 will make a setting available that will restore some of the GTK 3 behavior. Subpixel antialiasing is not going to become available with this change.