Apa yang Telah Anda Buat

Ini adalah program sederhana yang berisi elemen-elemen dasar dari aplikasi GTK+. Nantinya Anda akan mengetahui bahwa aplikasi Gnome mempunyai konsep yang sama.



Inisialisasi

Pertama GTK+ harus diawali dengan :

gtk_init(&argc,&argv);

Fungsi ini akan menghubungkan program dengan X server dan mengolah beberapa default argumen yang dikenali oleh GTK+. Argumen yang dikenali akan dihilangkan dari argv dan mengurangi nilai argc sehingga sesuai.



Widget

Berikutnya adalah elemen user interface. Dalam tradisi X, elemen ini disebut sebagai widget. Semua widget GTK+ adalah turunan dari kelas GtkWidget, jadi GtkWidget* dapat dipakai sebagai referensi.

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

button = gtk_button_new();

label = gtk_label_new("Halo Indonesia");


gtk_container_add(GTK_CONTAINER(button), label);

gtk_container_add(GTK_CONTAINER(window), button);

gtk_window_set_title(GTK_WINDOW(window),"HALO");

gtk_container_set_border_width(GTK_CONTAINER(window), 10);



Setiap widget mempunyai fungsi gtk_namawidget_new(), sepadan dengan konstruktor pada C++ dan Java. Fungsi ini mengalokasikan object baru, melakukan inisialisasi, dan mengembalikan pointer. Semua fungsi new() ini mengembalikan tipe GtkWidget* walaupun untuk kelas turunannya.

Setelah Anda mempunyai widget, Anda dapat melakukan manipulasi terhadap object tersebut dengan fungsi-fungsi yang terkait. Semua fungsi widget GTK+ berawalan dengan nama dari kelas dan argumen pertamanya adalah object dengan kelas yang sesuai. Dalam contoh di atas, gtk_container_add() menerima GtkContainer* sebagai argumen pertamanya. Makro GTK_CONTAINER mengubah tipe (cast) GtkWidget* dan melakukan pengecekan tipe pada saat program berjalan. Perubahan tipe (casting) ini diperlukan dalam C karena C tidak mengetahui hubungan antar kelas.

Dapat Anda duga, GtkButton dan GtkWindow keduanya adalah turunan dari GtkContainer. Sebuah GtkContainer dapat berisi widget lain. Kode di atas berarti membuat top level window, menempatkan tombol di dalamnya, dan menempatkan sebuah label (sebaris text) di dalam tombol. Serta menuliskan judul pada window, kemudian membuat hiasan border disekitar tombol.



Signal

Anda perlu mengatur bagaimana program dapat berinteraksi dengan pengguna. Dalam program ini dua hal yang penting dilakukan. Pertama, jika pengguna menekan (click) tombol. Kedua, jika pengguna menutup window menggunakan dekorasi window manager. Widget (sebenarnya GObject) akan mengeluarkan signal jika terjadi sesuatu. Untuk menjawab sebuah signal Anda harus menghubungkan fungsi callback ke signal tersebut. Dengan cara mendaftarkan fungsi yang akan dipanggil jika sebuah signal terjadi. Contoh kodenya seperti berikut :



g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(delete_event_cb),NULL);


g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK (button_click_cb),label);


g_signal_connect() menyatakan GObject akan dimonitor jika mengeluarkan signal dan akan memanggil fungsi callback dengan menyertakan argumen user_data yang dapat digunakan oleh callback. Makro G_CALLBACK () mengubah callback ke dalam bentuk standard function signature.

GTK+ melakukan banyak sekali pemeriksaan pada waktu program berjalan. Makro G_OBJECT, disamping sebagai casting, akan melakukan pengecekan tipe pada waktu program berjalan, kemudian g_signal_connect() akan memeriksa bahwa object tersebut benar-benar dapat mengeluarkan signal yang Anda sebutkan.


Masuk ke Main Loop

Setelah semua sudah disiapkan, dua hal lagi yang perlu dilakukan. Anda perlu menampilkannya ke layar dan menunggu masukkan dari pengguna.


gtk_widget_show_all(window);


gtk_main();

return 0;


gtk_widget_show() secara rekursif memanggil gtk_widget_show() untuk setiap kontainer dan object di dalamnya. Kode berikut mempunyai efek yang sama :


gtk_widget_show(label);

gtk_widget_show(button);

gtk_widget_show(window);


Kebalikannya adalah gtk_widget_hide(). Setiap widget pertama kali dibuat dengan status hidden yang kemudian dapat ditampilkan atau disembunyikan. Sebaiknya menampilkan widget yang didalam terdahulu sebelum widget kontainernya; jika sebaliknya yang terjadi maka yang terlihat di layar adalah kontainernya dahulu kemudian baru widget yang di dalam. Widget tidak akan terlihat dilayar kecuali jika kontainernya ditampilkan, kecuali untuk widget GtkWindow karena tidak mempunyai parent.

Setelah ditampilkan, Anda dapat menunggu interaksi pengguna. gtk_main() memasuki GTK+ main loop. Main loop adalah dimana program akan dikendalikan secara event-driven. Jika pengguna melakukan sesuatu sehingga memicu event maka umumnya akan membangkitkan signal dan kemudian fungsi callback Anda akan dipanggil. Program akan tetap berada di dalam fungsi gtk_main() sampai kondisi tertentu. Main loop akan dijelaskan lebih mendalam di bagian lain.



Kembali ke Signal dan Callback



Jika terjadi signal yang terhubung dengan program , fungsi callback yang sesuai akan dipanggil. Signal “delete_event” akan memanggil fungsi callback delete_event_cb yang akan menghentikan gtk_main() dengan dipanggilnya gtk_main_quit().Signal “clicked” akan memanggil fungsi callback button_click_cb untuk mengubah tulisan dalam label dengan membalik urutannya. Perhatikan kita meletakkan label sebagai parameter user_data dari g_signal_connect().

Kesalahan umum adalah dengan mengira semua signal menggunakan callback yang sejenis. Ini tidak benar. Setiap signal menggunakan callback dengan kelakuan dan signature yang khusus. Signal “clicked” mempunyai tipe callback yang paling umum. Callback ini menerima pointer ke widget yang mengeluarkan signal dan pointer user_data yang disediakan oleh pemrogram. Callback ini harus mengembalikan void, jika tidak akan mengakibatkan korupnya memori.

Sedangkan “delete_event” agak berbeda. Callback ini menerima tiga argumen. Yang pertama dan yang terakhir sama dengan “clicked”. Yang kedua adalah pointer ke struktur data event yang memicu signal. (Event adalah pesan dari X ke aplikasi, berisi informasi mengenai pergerakan mouse, tombol keyboard yang di tekan dan sebagainya.) Fungsi callback “delete_event” mengembalikan nilai “khusus”. Jika FALSE, GTK+ akan menutup window, jika TRUE GTK+ tidak akan melakukan tindakan apapun. Kembalikan nilai TRUE jika anda ingin melakukan sesuatu selain menutup window. Semisal, anda ingin memberikan peringatan kepada pengguna untuk menyimpan dokumen dahulu.

Berkas header dari widget adalah referensi terbaik mengenai callback signature.

<<Program 'Halo Indonesia' Dasar-dasar Gtk+
Kontainer dan Peletakan Widget>>
Hosted by www.Geocities.ws

1