====== Gtk4 ====== [[https://www.gtk.org/|Gtk]] ([[https://gitlab.gnome.org/GNOME/gtk/|source]]) is a GUI cross-platform toolkit. ===== Build from source ===== * Official build instructions: [[https://docs.gtk.org/gtk4/building.html]] * Source code downloads: [[https://download.gnome.org/sources/]] # Install sudo apt install ninja-build sudo apt install meson # or `pip install meson` if too old # You might find along the way you need some other dependencies sudo apt install libgstreamer-plugins-bad1.0-dev # Need to build Glib first: # https://download.gnome.org/sources/glib/2.71/glib-2.71.2.tar.xz # In glib2 source dir: meson setup builddir meson compile -c builddir meson install -c builddir # Need to build Glib-networking to get TLS # https://download.gnome.org/sources/glib-networking/2.70/ # sudo apt install gsettings-desktop-schemas-dev # sudo apt install libproxy-dev # sudo apt install cmake # In the glib-networking dir: meson setup builddir cd builddir ninja ninja install # For GTK4, in Gtk4 source dir # Get build options: meson configure # To build with `gtk_doc=true` option pip install gi-docgen sudo apt install gir1.2-graphene-1.0 libgraphene-1.0-dev # Omit prefix to let it install to install to system `/usr/local/` meson setup -Dgtk_doc=true --prefix $HOME/gtk4 builddir # Might need to install some deps like libjpeg, or sudo apt install libgstreamer1.0-dev cd builddir ninja # Documentation will now be in docs/ # For example: gtk-4.6.1/docs/reference/gtk/gtk4/index.html # There are examples in source under examples/ directory # Install to prefix (use `sudo` if doing system install) ninja install ===== Documentation ===== **Offline** There is example code in the ''examples/'' directory of the source. If you built from source and included the docs with the build, there will also be nice HTML pages in the ''docs/'' directory. * API documentation - ''index.html'' - e.g. ''gtk-4.6.1/docs/reference/gtk/gtk4/index.html'' * Widget gallery: ''visual_index.html'' - e.g. ''gtk-4.6.1/docs/reference/gtk/gtk4/visual_index.html'' * Example code: ''examples/'' directory - e.g. ''gtk-4.6.1/examples/'' **Online** * API documentation: [[https://docs.gtk.org/gtk4/index.html]] * Widget gallery: [[https://docs.gtk.org/gtk4/visual_index.html]] * Example code: [[https://gitlab.gnome.org/GNOME/gtk/-/tree/main/examples]] ===== Hello world ===== Example ''Makefile'': all: main main: main.c gcc `pkg-config --cflags gtk4` main.c `pkg-config --libs gtk4` clean: rm a.out // From https://www.gtk.org/ #include static void on_activate (GtkApplication *app) { // Create a new window GtkWidget *window = gtk_application_window_new (app); // Create a new button GtkWidget *button = gtk_button_new_with_label ("Hello, World!"); // When the button is clicked, close the window passed as an argument g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_window_close), window); gtk_window_set_child (GTK_WINDOW (window), button); gtk_window_present (GTK_WINDOW (window)); } int main (int argc, char *argv[]) { // Create a new application GtkApplication *app = gtk_application_new ("com.example.GtkApplication", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK (on_activate), NULL); return g_application_run (G_APPLICATION (app), argc, argv); } ===== gtkmm (C++) ===== You can use [[http://www.gtkmm.org/en/|gtkmm]] to write C++ code instead of C. On their wiki they have [[https://developer-old.gnome.org/gtkmm-tutorial/stable/|tutorials]] and [[https://developer-old.gnome.org/gtkmm-tutorial/stable/sec-install-unix-and-linux.html.en|build instructions]] for the [[https://download.gnome.org/sources/gtkmm/|source code]]. You might need some other dependencies like: * sigc++-3.0 * gtk4 * glibmm-2.68 * cairomm-1.16 * pangomm-2.48 To build from source: # Install mm-common sudo apt install mm-common # Build and install libsigc++3 # https://github.com/libsigcplusplus/libsigcplusplus wget https://github.com/libsigcplusplus/libsigcplusplus/releases/download/3.2.0/libsigc++-3.2.0.tar.xz tar xzf libsigc++-3.2.0 cd libsigc++-3.2.0 cmake . ./autogen.sh --prefix=/usr/local --enable-static make sudo make install # glibmm # https://gitlab.gnome.org/GNOME/glibmm wget https://gitlab.gnome.org/GNOME/glibmm/-/archive/2.70.0/glibmm-2.70.0.tar.gz tar xzf glibmm-2.70.0.tar.gz cd glibmm-2.70.0 ./autogen.sh --prefix=/usr/local --enable-static make sudo make install # cairomm # https://www.cairographics.org/releases/ wget https://www.cairographics.org/releases/cairomm-1.16.1.tar.xz tar xBf cairomm-1.16.1.tar.xz cd cairomm-1.16.1 ./autogen.sh --prefix=/usr/local --enable-static make sudo make install # pangomm # https://gitlab.gnome.org/GNOME/pangomm wget https://gitlab.gnome.org/GNOME/pangomm/-/archive/2.50.0/pangomm-2.50.0.tar.gz tar xzf pangomm-2.50.0.tar.gz cd pangomm-2.50.0 ./autogen.sh --prefix=/usr/local --enable-static make sudo make install # gtkmm wget https://download.gnome.org/sources/gtkmm/4.6/gtkmm-4.6.0.tar.xz tar xBf gtkmm-4.6.0.tar.xz cd gtkmm-4.6.0 ./autogen.sh --prefix=/usr/local --enable-static make sudo make install When compiling, use ''-std=c++20'' flag. When running, you may need to set LD_LIBRARY_PATH if you installed to a special prefix. Maybe able to add ''-static'' if you built all libs with ''--enable-static' configuration and a ''.a'' file is in the lib dir. # Compile app with gtk4 g++ main.cpp `pkg-config gtkmm-4.0 --cflags --libs` -std=c++20 # Set path for shared library when running LD_LIBRARY_PATH=/usr/local/lib ./a.out Here is a gtkmm hello world: // gtkmm4 example // Compile with: // g++ main.cpp `pkg-config gtkmm-4.0 --cflags --libs` -std=c++20 // Run with // LD_LIBRARY_PATH=/usr/local/lib ./a.out #include class MyWindow : public Gtk::Window { public: MyWindow(); }; MyWindow::MyWindow() { set_title("Basic application"); set_default_size(200, 200); } int main(int argc, char* argv[]) { auto app = Gtk::Application::create("org.gtkmm.examples.base"); return app->make_window_and_run(argc, argv); }