Programowanie w systemie UNIX/c grafika/gtk
wstęp
[edytuj]GTK
- to zestaw narzędzi widgetów. Każdy interfejs użytkownika stworzony przez GTK składa się z elementów UI, znanych jako widżety
- jest zaprojektowana obiektowo, w oparciu o implementację obiektowości dla C – GObject.
- jest sterowany zdarzeniami (ang. event-driven)
Instalacja
[edytuj]zależności
[edytuj]- gLib
- Pango
- Gdk-pixbuf
- ATK
- GObject-Introspection
- Epoxy
GTK używa pkg-config
sposoby
[edytuj]Z użyciem apt[1]
sudo apt install libgtk-4-dev gtk-4-examples build-essential
apt-get
sudo apt-get install libgtk-4-dev gtk-4-examples geany
w katalogu:
/usr/share/doc/gtk-3-examples/examples/
pakiety
[edytuj]Lista
- libgtk-4-dev
- gtk-4-examples
- gtk-4-tests
- gtk-doc-tools
wersja
[edytuj]- The current stable API version of GTK is 4.0.
- Latest stable 4.6.6
- Latest old stable 3.24.34
apt
[edytuj]Za pomocą apt-cache[2]
apt-cache policy libgtk2.0-0 libgtk-3-0
przykładowy wynik:
libgtk2.0-0: Zainstalowana: 2.24.32-1ubuntu1 Kandydująca: 2.24.32-1ubuntu1 Tabela wersji: *** 2.24.32-1ubuntu1 500 500 http://pl.archive.ubuntu.com/ubuntu bionic/main amd64 Packages 100 /var/lib/dpkg/status libgtk-3-0: Zainstalowana: 3.22.30-1ubuntu1 Kandydująca: 3.22.30-1ubuntu1 Tabela wersji: *** 3.22.30-1ubuntu1 500 500 http://pl.archive.ubuntu.com/ubuntu bionic/main amd64 Packages 100 /var/lib/dpkg/status
Za pomocą apt-list[3]
apt list --installed libgtk*
Przykładowy wynik:
libgtk-3-0/jammy-updates,now 3.24.33-1ubuntu2 amd64 [zainstalowany,automatycznie] libgtk-3-bin/jammy-updates,now 3.24.33-1ubuntu2 amd64 [zainstalowany,automatycznie] libgtk-3-common/jammy-updates,jammy-updates,now 3.24.33-1ubuntu2 all [zainstalowany,automatycznie] libgtk-3-dev/jammy-updates,now 3.24.33-1ubuntu2 amd64 [zainstalowany] libgtk-4-1/jammy-updates,now 4.6.6+ds-0ubuntu1 amd64 [zainstalowany,automatycznie] libgtk-4-bin/jammy-updates,now 4.6.6+ds-0ubuntu1 amd64 [zainstalowany,automatycznie] libgtk-4-common/jammy-updates,jammy-updates,now 4.6.6+ds-0ubuntu1 all [zainstalowany,automatycznie] libgtk-4-dev/jammy-updates,now 4.6.6+ds-0ubuntu1 amd64 [zainstalowany] libgtk1.2-common/now 1.2.10-18.1 all [zainstalowany,lokalny] libgtk1.2-dev/now 1.2.10-18.1 amd64 [zainstalowany,lokalny] libgtk1.2/now 1.2.10-18.1 amd64 [zainstalowany,lokalny] libgtk2.0-0/jammy,now 2.24.33-2ubuntu2 amd64 [zainstalowany,automatycznie] libgtk2.0-bin/jammy,now 2.24.33-2ubuntu2 amd64 [zainstalowany,automatycznie] libgtk2.0-common/jammy,jammy,now 2.24.33-2ubuntu2 all [zainstalowany,automatycznie] libgtk3-perl/jammy,jammy,now 0.038-1 all [zainstalowany,automatycznie] libgtkmm-3.0-1v5/jammy,now 3.24.5-1build1 amd64 [zainstalowany,automatycznie] libgtksourceview-4-0/jammy,now 4.8.3-1 amd64 [zainstalowany,automatycznie] libgtksourceview-4-common/jammy,jammy,now 4.8.3-1 all [zainstalowany,automatycznie]
dpkg
[edytuj]dpkg -l libgtk2.0-0 libgtk-3-0
przykładowy wynik:
Wybór:U=nieznany/I=instalacja/R=usunięcie/P=wyczyszczenie/H=zatrzymanie | Stan:N=brak/I=zainstalowany/C=skonfigurowany/U=rozpakowany/ |/ F=częśc. skonfigurowany/H=częśc. zainstalowany/W=wyzw. czek./T=wyzw. zapl. || Błędy?=(brak)/R-do pon. inst. (duże litery w "Stan" i "Błędy"=problemy) ||/ Nazwa Wersja Architektura Opis +++-================================================================-=====================================-=====================================-====================================================================================================================================== ii libgtk-3-0:amd64 3.22.30-1ubuntu1 amd64 GTK+ graphical user interface library ii libgtk2.0-0:amd64
dpkg -l | egrep "libgtk(2.0-0|-3-0|-4)"
przykładowy wynik:
ii libgtk-3-0:amd64 3.24.33-1ubuntu2 amd64 GTK graphical user interface library ii libgtk-4-1:amd64 4.6.6+ds-0ubuntu1 amd64 GTK graphical user interface library ii libgtk-4-bin 4.6.6+ds-0ubuntu1 amd64 programs for the GTK graphical user interface library ii libgtk-4-common 4.6.6+ds-0ubuntu1 all common files for the GTK graphical user interface library ii libgtk-4-dev:amd64 4.6.6+ds-0ubuntu1 amd64 development files for the GTK library ii libgtk2.0-0:amd64 2.24.33-2ubuntu2 amd64 GTK graphical user interface library - old version
gtk-launch
[edytuj]gtk-launch --version
pkg-config
[edytuj]pkg-config --modversion gtk+-3.0
wynik :
3.22.30
położenie plików pc
locate gtk | grep '\.pc'
pkg-config --modversion gtk4
pkg-config --list-all | sed -ne 's/\(gtk[0-9]*.0\).*/\1/p' | xargs pkg-config --modversion gtk4
localizacja
[edytuj]locate gtk | grep /usr/lib
Kompilacja
[edytuj]Sprawdzamy ustawienia za pomocą pkg-config
pkg-config --cflags gtk4
Przykładowy wynik:
-mfpmath=sse -msse -msse2 -pthread -I/usr/include/gtk-4.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/x86_64-linux-gnu -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/graphene-1.0 -I/usr/lib/x86_64-linux-gnu/graphene-1.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
pkg-config --libs gtk4
Przykładowy wynik:
-lgtk-4 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
Kompilacja ręczna:[4]
$ cc `pkg-config --cflags gtk4` g.c `pkg-config --libs gtk4`
Użycie
- Glade
- make
- meson build system : is replacing GNU Build System (autotools) as build automation tools of choice
Programowanie
[edytuj]
Programy:
- gtk4-widget-factory = Program to demonstrate GTK themes and widgets
- gtk4-demo = Program to demonstrate GTK widgets
- gtk4-icon-browser
- gtk4-demo-application
- gtk4-encode-symbolic-svg : converts symbolic svg icons into specially prepared png files. GTK can load and recolor these pngs, just like original svgs, but loading them is much faster.
- gtk4-query-settings
- gtk4-builder-tool : GtkBuilder file utility. Może wykonywać różne operacje na plikach GtkBuilder .ui. Zmodyfikowane pliki .ui utworzone przez narzędzie gtk4-builder-tool należy zawsze przetestować przed użyciem ich w środowisku produkcyjnym.
GTK+ Inspector
[edytuj]- włączyć domyślny debugger ( polecenie w terminalu)[5]
- uruchom aplikacje gtk w trybie interaktywnego debugowania
gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true GTK_DEBUG=interactive your-app
Zastosowania[6]
RAD
[edytuj]Programy
- Glade = graphical user interface builder for GTK ( Glade User Interface Designer)
- GNOME Builder = integrated development environment (IDE) for the GNOME, dokumentacja
ui
[edytuj]Tworzenie
- ręcznie ( w kodzie programu)[7]
- wizualnie ( XML )
wizualnie
[edytuj]Jeśli tworzysz złożone interfejsy użytkownika, zaleca się opisanie struktury okna za pomocą formatu opisu XML GtkBuilder, zamiast składania go ręcznie.
Oddzielenie interfejsu użytkownika od logiki programu
- Glade to narzędzie RAD umożliwiające szybkie i łatwe tworzenie interfejsów użytkownika dla zestawu narzędzi GTK
- Interfejsy użytkownika zaprojektowane w Glade są zapisywane w formacie XML
- przy użyciu obiektu GtkBuilder GTK mogą być one dynamicznie ładowane przez aplikacje w razie potrzeby.
Glade
[edytuj]Narzędzie do projektowania interfejsów Glade umożliwia tworzenie i modyfikowanie interfejsów użytkownika dla programów GTK+.[8]
Biblioteka GTK+ dostarcza rozbudowany zbiór podstawowych elementów interfejsu użytkownika, takich jak pola tekstowe, etykiety okien, wpisy numeryczne, pola wyboru i menu. Te elementy są nazywane widżetami. Można używać programu Glade do rozmieszczania widżetów w graficznym interfejsie użytkownika. Glade umożliwia modyfikowanie układu i właściwości tych widżetów. Można także używać programu Glade do dodawania połączeń między widżetami a kodem źródłowym programu.
Interfejsy użytkownika zaprojektowane w programie Glade są przechowywane w formacie XML, umożliwiając łatwą integrację z zewnętrznymi narzędziami. Można używać biblioteki libglade do dynamicznego tworzenia graficznych interfejsów użytkownika z opisu XML.
Można pracować z widżetami w oknie Palety na jeden z tych sposobów:
- Tryb wyboru. Aby użyć trybu wyboru, kliknij strzałkę Wybór. Kursor zmieni się na strzałkę, co wskazuje, że tryb wyboru jest aktywny. W tym trybie można używać myszy do wyboru widżetów w projekcie. Następnie można użyć okna Właściwości do modyfikacji właściwości widżetów.
Można także użyć menu kontekstowego widżetu, aby wybrać widżet. Kliknij widżet prawym przyciskiem myszy, aby je otworzyć. Można dodać wiele widżetów danego typu z Palety do projektu przytrzymując klawisz Ctrl podczas wybierania widżetu. Należy kliknąć strzałkę Wybór lub inny widżet w Palecie, aby wrócić do zwykłego trybu.
- Tryb rozmieszczania widżetów Aby użyć trybu rozmieszczania widżetów, wybierz widżet w oknie Palety. Podczas wybierania większości widżetów kursor zmienia się na kursor z krzyżykiem. Można wtedy umieścić widżet w kontenerze, widżecie najwyższego poziomu i tak dalej. Po umieszczeniu widżetu program wróci do trybu wyboru.
- Tryb rozmieszczania najwyższego poziomu. Aby użyć trybu rozmieszczania najwyższego poziomu, wybierz określony widżet najwyższego poziomu w oknie Palety. Po wybraniu widżetu najwyższego poziomu w oknie Palety pojawi się on od razu na pulpicie. Można go wtedy modyfikować. Po wyborze widżetu najwyższego poziomu program wróci do trybu wyboru.
gsettings
[edytuj]gsettings
Użycie: gsettings --version gsettings [--schemadir KATALOG-SCHEMATÓW] POLECENIE [PARAMETRY…] Polecenia: help Wyświetla te informacje list-schemas Wyświetla listę zainstalowanych schematów list-relocatable-schemas Wyświetla listę zainstalowanych schematów, które można przenosić list-keys Wyświetla listę kluczy w schemacie list-children Wyświetla listę elementów potomnych schematu list-recursively Wyświetla listę kluczy i wartości, rekursywnie range Odpytuje zakres klucza describe Odpytuje opis klucza get Uzyskuje wartość klucza set Ustawia wartość klucza reset Przywraca wartość klucza reset-recursively Przywraca wszystkie wartości w podanym schemacie writable Sprawdza, czy klucz jest zapisywalny monitor Obserwuje zmiany Polecenie „gsettings help POLECENIE” wyświetla szczegółową pomoc.
query settings
[edytuj]Sprawdzamy :
gtk4-query-settings
Przykładowy wynik:
gtk-double-click-time: 400 gtk-double-click-distance: 5 gtk-cursor-blink: TRUE gtk-cursor-blink-time: 1200 gtk-cursor-blink-timeout: 10 gtk-split-cursor: FALSE gtk-cursor-aspect-ratio: 0,040000 gtk-theme-name: "Yaru-dark" gtk-icon-theme-name: "Yaru" gtk-dnd-drag-threshold: 8 gtk-font-name: "Ubuntu 11" gtk-xft-antialias: 1 gtk-xft-hinting: 1 gtk-xft-hintstyle: "hintslight" gtk-xft-rgba: "rgb" gtk-xft-dpi: 98304 gtk-hint-font-metrics: FALSE gtk-cursor-theme-name: "Yaru" gtk-cursor-theme-size: 24 gtk-alternative-button-order: FALSE gtk-alternative-sort-arrows: FALSE gtk-enable-animations: TRUE gtk-error-bell: TRUE gtk-print-backends: "cups,file" gtk-print-preview-command: "evince --unlink-tempfile --preview --print-settings %s %f" gtk-enable-accels: TRUE gtk-im-module: "gtk-im-context-simple" gtk-recent-files-max-age: -1 gtk-fontconfig-timestamp: 0 gtk-sound-theme-name: "Yaru" gtk-enable-input-feedback-sounds: TRUE gtk-enable-event-sounds: TRUE gtk-primary-button-warps-slider: TRUE gtk-application-prefer-dark-theme: FALSE gtk-entry-select-on-focus: TRUE gtk-entry-password-hint-timeout: 0 gtk-label-select-on-focus: TRUE gtk-shell-shows-app-menu: FALSE gtk-shell-shows-menubar: FALSE gtk-shell-shows-desktop: TRUE gtk-decoration-layout: ":minimize,maximize,close" gtk-titlebar-double-click: "toggle-maximize" gtk-titlebar-middle-click: "lower" gtk-titlebar-right-click: "menu" gtk-dialogs-use-header: TRUE gtk-enable-primary-paste: TRUE gtk-recent-files-enabled: TRUE gtk-long-press-time: 500 gtk-keynav-use-caret: FALSE gtk-overlay-scrolling: TRUE
widget
[edytuj]Widgety to podstawowe elementy składowe aplikacji GUI. Standardowe widgety to:
- przycisk
- pole wyboru
- pasek przewijania
Przykłady
[edytuj]Gotowe przykłady
[edytuj]Po zainstalowaniu przykładów możemy uruchomić:
gtk4-demo
Lup poszukać gdzie zostały zainstalowane:
dpkg -L gtk-4-examples
Najczęściej w :
/usr/share/doc/gtk-4-examples
Pierwszy program
[edytuj]nowe okno
[edytuj]/*
https://developer.gnome.org/gtk-tutorial/2.90/c39.html
gcc g.c `pkg-config --cflags --libs gtk+-2.0`
./a.out
*/
#include<gtk/gtk.h>
int main(int argc,char *argv[])
{
GtkWidget *window;
gtk_init(&argc,&argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);
gtk_main();
return 0;
}
wersja
[edytuj]/*
https://stackoverflow.com/questions/126141/how-do-you-find-out-which-version-of-gtk-is-installed-on-ubuntu
gcc $(pkg-config --cflags gtk4) w.c $(pkg-config --libs gtk4)
./a.out
*/
#include <gtk/gtk.h>
#include <glib/gprintf.h>
int main(int argc, char *argv[])
{
/* Initialize GTK */
gtk_init (); // gtk4 https://docs.gtk.org/gtk4/func.init.html
g_printf("%d.%d.%d\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); //
return(0);
}
Hello world
[edytuj]/* https://www.gtk.org/docs/getting-started/hello-world/ */
#include <gtk/gtk.h>
static void
print_hello (GtkWidget *widget,
gpointer data)
{
g_print ("Hello World\n");
}
static void
activate (GtkApplication *app,
gpointer user_data)
{
GtkWidget *window;
GtkWidget *button;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Window");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
button = gtk_button_new_with_label ("Hello World");
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
gtk_window_set_child (GTK_WINDOW (window), button);
gtk_window_present (GTK_WINDOW (window));
}
int
main (int argc,
char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
Kompilujemy:
gcc $(pkg-config --cflags gtk4) g.c $(pkg-config --libs gtk4)
Uruchamiamy
./a.out
Poradniki
[edytuj]- GTK+ - podręcznik wikibooks
- developer gnome guides
Źródła
[edytuj]- ↑ Setup GTK4 Development Tools On Ubuntu
- ↑ askubuntu question: how-to-know-my-gtk-version
- ↑ stackoverflow question: how-do-you-find-out-which-version-of-gtk-is-installed-on-ubuntu
- ↑ docs gtk4 : compiling
- ↑ ask ubuntu question: how-do-i-open-gtk-inspector ?
- ↑ blog.gtk : inspector
- ↑ geeksforgeeks : how-to-create-gui-in-c-programming-using-gtk-toolkit
- ↑ gnome : glade introduction