Vala

Siehe auch

Die 2006 erschienene, objektorientierte Programmiersprache Vala kann zum Bau von Anwendungen verwendet werden, die direkt auf den GNOME Runtime Libraries laufen (im speziellen GLib und GObject). Der Vala-Compiler übersetzt alle Vala-Konstrukte und -Typen nach C und compiliert den entstandenen C-Code. Vala-Programme sind daher funktional C ebenbürtig, schnell und durch die modernen Programmierkonzepte einfacher zu schreiben und zu warten. Mit Vala lassen sich Programme entwickeln, die unter der Kommandozeile und unter GNOME laufen (wobei Vala nicht an GNOME gebunden ist - es lässt sich zur plattformunabhängigen Entwicklung verwenden, solange man die GLib nutzt).

Der E-Mail-Client Geary, die Fotoverwaltung Shotwell und der Zeitmanagement-Timer Pomodoro sind prominente Beispiele für in Vala geschriebene Programme (die ersten beiden Programme sind von Yorba entwickelt worden).

Mehr zu Vala findet sich im GNOME-Wiki unter Projects/Vala.

Installation:

yum -y install vala glib2-devel gtk3-devel
Links:

Hello World

helloworld.vala
1void main () {
2    print ("Hello World.\n");
3}

Compilierung:

valac helloworld.vala

Start und Test der eigenen GNOME-Applikation:

./helloworld

Einfache TUI-Anwendung

Hier ein Beispiel für eine TUI-Anwendung in Vala, die auf ncurses basiert.

mytui.vala
 1using Curses;
 2
 3int main (string[] args) {
 4
 5    /* Initialize Curses */
 6    initscr ();
 7
 8    /* Initialize color mode and define a color pair */
 9    start_color ();
10    init_pair (1, Color.GREEN, Color.RED);
11
12    /* Create a window (height/lines, width/columns, y, x) */
13    var win = new Window (LINES - 8, COLS - 8, 4, 4);
14    win.bkgdset (COLOR_PAIR (1) | Attribute.BOLD);  // set background
15    win.addstr ("Hello world!");   // write string
16    win.clrtobot ();               // clear to bottom (does not move cursor)
17    win.getch ();                  // read a character
18
19    /* Reset the terminal mode */
20    endwin ();
21
22    return 0;
23}
yum -y install ncurses-devel
valac --pkg curses -X -lncurses mytui.vala
./mytui

Einfache GUI-Anwendung mit Gtk (direkt)

Ein Beispiel für eine einfache GNOME-/GTK+-Anwendung:

mygui.vala
 1using Gtk;
 2
 3int main (string[] args) {
 4
 5    Gtk.init (ref args);
 6
 7    var window = new Window();
 8    window.title = "Window Title";
 9    window.border_width = 10;
10    window.window_position = WindowPosition.CENTER;
11    window.set_default_size(350, 70);
12    window.destroy.connect(Gtk.main_quit);
13
14    var button = new Button.with_label ("Click me!");
15    button.clicked.connect (() => {
16        button.label = "Thank you";
17    });
18
19    window.add (button);
20    window.show_all();
21
22    Gtk.main();
23    return 0;
24}

Compilierung:

valac --pkg gtk+-3.0 mygui.vala

Start und Test der eigenen GNOME-Applikation:

./mygui

Einfache GUI-Anwendung mit Gtk und XML-Definition

Folgende Gtk-Definition (XML-Datei) ist mit Glade erzeugt und definiert ein Applikationsfenster mit einem „Click Me!“-Button. Die XML-Datei lässt sich mit Glade jederzeit wieder visualisieren und nachbearbeiten.

glade.glade
 1<?xml version="1.0" encoding="UTF-8"?>
 2<interface>
 3    <!-- interface-requires gtk+ 3.0 -->
 4    <object class="GtkWindow" id="window1">
 5        <property name="can_focus">False</property>
 6        <property name="border_width">10</property>
 7        <property name="title" translatable="yes">My first GUI program</property>
 8        <property name="window_position">center-always</property>
 9        <property name="default_width">400</property>
10        <property name="default_height">100</property>
11        <signal name="destroy" handler="on_window1_destroy" swapped="no"/>
12        <child>
13            <object class="GtkButton" id="button1">
14                <property name="label" translatable="yes">Click me!</property>
15                <property name="use_action_appearance">False</property>
16                <property name="visible">True</property>
17                <property name="can_focus">False</property>
18                <property name="receives_default">False</property>
19                <property name="use_action_appearance">False</property>
20                <signal name="clicked" handler="on_button1_clicked" swapped="no"/>
21            </object>
22        </child>
23    </object>
24</interface>

So wird die XML-Definition in einem Vala-Programm dynamisch geladen:

glade.vala
 1using Gtk;
 2
 3int i;
 4
 5public void on_button1_clicked (Button button) {
 6i += 1;
 7    button.label = "Hello, World!\nClick count = %i".printf(i);
 8}
 9
10public void on_window1_destroy (Window window) {
11    Gtk.main_quit ();
12}
13
14int main (string[] args) {
15    Gtk.init (ref args);
16    i = 0;
17    try {
18        var builder = new Builder ();
19        builder.add_from_file ("glade.glade");
20        builder.connect_signals (null);
21        var window = builder.get_object ("window1") as Window;
22        window.show_all ();
23    } catch (Error e) {
24        stderr.printf ("Could not load UI: %s\n", e.message);
25        return 1;
26    }
27    Gtk.main ();
28    return 0;
29}

Compilierung und Aufruf:

valac -X -rdynamic --pkg gtk+-3.0 glade.vala
./glade

Der „Click Me!“-Button ändert bei jedem Klick sein Label und gibt dabei aus, wie oft er angeklickt wurde.

Built on 2022-06-03