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


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 -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

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]

Programy

  • Glade = graphical user interface builder for GTK ( Glade User Interface Designer)
  • GNOME Builder = integrated development environment (IDE) for the GNOME, dokumentacja

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.


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

Źródła

edytuj
  1. Setup GTK4 Development Tools On Ubuntu
  2. askubuntu question: how-to-know-my-gtk-version
  3. stackoverflow question: how-do-you-find-out-which-version-of-gtk-is-installed-on-ubuntu
  4. docs gtk4 : compiling
  5. ask ubuntu question: how-do-i-open-gtk-inspector ?
  6. blog.gtk : inspector
  7. geeksforgeeks : how-to-create-gui-in-c-programming-using-gtk-toolkit
  8. gnome : glade introduction