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