What is gtk in linux

Введение в 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»

Для начала за основу возьмём вот такую заготовку:

#include /* подключаем GTK+ */ /* эта функция будет выполнена первой */ int main( int argc, char *argv[]) < /* тут мы объявим переменные */ /* запускаем GTK+ */ gtk_init(&argc, &argv); /* тут будет код нашего приложения */ /* передаём управление GTK+ */ gtk_main(); return 0; >

Пожалуйста, не используйте одинарные комментарии (//), если как и я решили писать на Си.

Читайте также:  Linux готовый загрузочный диск

Давайте для начала создадим окно нашего приложения. В GTK существует несколько типов окошек, но нам понадобится обычный GtkWindow. Вставьте в нашу заготовку следующий код:

 /* это вставьте вначале, хотя на самом деле порядок не так важен */ GtkWidget *window; /* . */ /* создать новый виджет - окно */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* дать окну заголовок */ gtk_window_set_title(GTK_WINDOW(window), "Введение в GTK"); /* установить внутренние границы (читайте ниже) */ gtk_container_set_border_width (GTK_CONTAINER(window), 50); 

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

В GTK+ виджеты принято размещать не по координатам, а упаковывать в специальные контейнеры. Окно, которое мы создали, также является контейнером, который может содержать только один виджет. Нам этого хватит, но в ином случае нам бы пришлось добавить специальный виджет-контейнер, который может представлять из себя сетку, а также горизонтальные или вертикальные поля. Но об этом я подробнее расскажу в следующем топике.

Пока остановимся на окне. Напомню, что окно — это контейнер, которому мы указали толщину границ в 50 пикселей. Что это значит?

Это значит, что мы создаём своего рода невидимую рамку вокруг этого контейнера и по этому ничего не сможем разместить в этой области.

Теперь рассмотрим сигналы.

Мы можем связать определённое событие, которое должно произойти с виджетом, со своей функцией.

 /* когда пользователь закроет окно, то выйти из приложения */ g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); 

В данном случае это стандартная фунция gtk_main_quit() , которая безопасно завершит наше приложение.

Теперь создадим кнопку, по нажатию на которую будет появляться окошко с надписью «И тебе привет, %username%!».

Кнопка (GtkButton) — это тоже контейнер, который также может содержать один виджет. Чтобы не усложнять код созданием метки и помещением её в кнопку, сделаем вот так:

 /* это вставьте вначале, хотя на самом деле порядок не так важен */ GtkWidget *button; /* . */ /* создать кнопку с меткой */ button = gtk_button_new_with_label("Привет, ХабраХабр!"); /* упаковать нашу кнопку в окно */ gtk_container_add(GTK_CONTAINER(window), button); /* когда пользователь кликнет по ней, то вызвать ф-цию welcome */ g_signal_connect(GTK_BUTTON(button), "clicked", G_CALLBACK(welcome), NULL); 

Теперь реализация функции welcome :

/* выводит приветствие */ void welcome (GtkButton *button, gpointer data) < /* виджеты */ GtkWidget *dialog; GtkWidget *label; GtkWidget *content_area; /* создать диалог */ dialog = gtk_dialog_new_with_buttons("Ошибка LOL. 111", NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); /* получить контейнер, в который будем пихать метку */ content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); /* сама метка */ label = gtk_label_new("\n\nИ тебе привет, %username!%"); gtk_container_add(GTK_CONTAINER(content_area), label); gtk_widget_show(label); /* запускаем диалог */ gtk_dialog_run(GTK_DIALOG(dialog)); /* а потом прячем */ gtk_widget_destroy(dialog); >

Вот так просто и быстро мы создали рабочую программу. В следующих топиках я расскажу про использование Glade (программа, чтобы рисовать виджеты без кода) и создание собственных виджетов.

Читайте также:  Realtek network driver linux

Компиляция

gcc file_name.c -o file_name `pkg-config --cflags --libs gtk+-3.0` 

Не забудьте установить пакет GTK для разработчика (кончается на «-dev»).

Что-нибудь ещё?

Да, пожалуй, приведу несколько ссылок:

www.gtkforums.com — англоязычный форум, посвящённый GTK

developer.gnome.org — информация для разработчиков под среду GNOME. Содержит много полезной информации о GTK, в том числе и на русском языке.

UPD: Полный код примера на PasteBin — pastebin.com/iPttWBne

Источник

GTK Documentation

GTK is the primary library used to construct user interfaces. It provides user interface controls and signal callbacks to respond to user actions.

GSK

An intermediate layer which provides a rendering API implemented using Cairo, OpenGL or Vulkan.

GDK

An intermediate layer which isolates GTK from the details of the windowing system.

Pango

Pango is the core text and font handling library used in GTK applications. It has extensive support for the different writing systems used throughout the world.

GdkPixbuf

GdkPixbuf is a library for image loading and manipulation.

Cairo

Cairo is a 2D graphics library with support for multiple output devices. It is designed to produce consistent, high quality output on all media.

Core libraries

GLib

GLib provides the core application building blocks for libraries and applications written in C. It provides common data types used in GTK, the main loop implementation, and a large set of utility functions for strings and general portability across different platforms.

GObject

GObject provides the object system used by GTK.

GIO

GIO provides a portable, modern and easy-to-use file system abstraction API for accessing local and remote files; a set of low and high level abstractions over the DBus IPC specification; an application settings API; portable networking abstractions; and additional utilities for writing asynchronous operations without blocking the user interface of your application.

Читайте также:  Etc ssh sshd config linux

Источник

Оцените статью
Adblock
detector