Minggu, 13 April 2014

GTK Programming : Penanganan Sinyal dari Widget



Agar pembuatan widget dapat menghasilkan luaran, kita harus tahu saat pengguna memberikan input pada widget yang telah tampil. Misalnya kita mempunyai sebuah aplikasi yang akan menampilkan MessageBox ketika widget GtkButton diklik oleh pengguna. Bagaimana kita bisa tahu saat pengguna mengklik GtkButton?

Setiap widget yang kita tampilkan secara otomatis dibuatkan struktur GtkWidget oleh sistem GTK. Dalam struktur ini terdapat pointer-pointer menuju fungsi callback yang akan dijalankan ketika widget mendapatkan input/sinyal dari pengguna, baik itu input mouse, ataupun keyboard.

Setelah sebelumnya kita membahas tentang cara pembuatan Hello World Window dengan GTK, kali ini kita akan melanjutkan percobaan kita dalam membuat GtkButton dan menerima sinyal "clicked". Sinyal ini adalah signal yang umumnya dihasilkan oleh setiap widget setelah menerima input klik, termasuk GtkButton.

Let's Start
Compile source code dibawah ini dengan cara yang pernah saya jelaskan sebelumnya.
#include<gtk/gtk.h>

void ButtonClick(GtkButton *button, gpointer userdata)
{
g_print("Di klik!\n");
}

int main(int argc, char *argv[])
{
    GtkWidget *window, *button;
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Hello world");
    button = gtk_button_new_with_label("Klik");
    gtk_container_add(GTK_CONTAINER(window), button);
    g_signal_connect(button, "clicked", (GCallback)ButtonClick, NULL);
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

Kode diatas hanya merupakan pengembangan dari kode yang pernah saya berikan pada postingan sebelumnya. Beberapa kode dan cara instalasi telah saya jelaskan, jadi khusus tulisan ini saya hanya menjelaskan bagian baru yang belum dijelaskan pada postingan sebelumnya.

void ButtonClick(GtkButton *button, gpointer userdata)
{
g_print("Di klik!\n");
}
Bagian diatas merupakan fungsi callback yang akan dipanggil setelah tombol mendapatkan klik. Tipe data dan parameter sudah merupakan standar dari GTK, jadi kita tidak bisa menggunakan yang lain. Yang boleh kita ubah hanya nama fungsinya saja.

g_print("Di klik!\n");
 g_print adalah fungsi built-int yang disediakan GTK dari bagian GLib. Penggunaannya sama persis dengan fungsi printf() yang biasanya kita pakai dalam membuat program konsol.

button = gtk_button_new_with_label("Klik");
Baris diatas digunakan untuk membuat widget button baru dengan menyertakan caption/label. Adapun prototype fungsinya adalah :
GtkWidget *gtk_button_new_with_label(const gchar *label);

 Setelah button dibuat, kita harus menentukan dimana kita harus meletakkannya.  Dalam hal ini kita menggunakan fungsi gtk_container_add()
gtk_container_add(GTK_CONTAINER(window), button);
Prototypenya:
void gtk_container_add(GtkContainer *container, GtkWidget *widget);

Container merupakan widget yang dapat digunakan untuk meletakkan widget lainnya. Dalam GTK, container dapat berupa window(GtkWindow), grid(GtkGrid), tab/notebook(GtkNotebook), dll. Khusus tutorial kali ini, kita hanya menggunakan GtkWindow sebagai container.

Setelah penempatan sudah oke, saatnya menghubungkan sinyal pada widget yang kita inginkan. Widget 'button' adalah widget yang akan kita coba. Tadi kita sudah membuat fungsi "ButtonClick" dan sekarang kita akan mengaturnya agar fungsi tersebut dijalankan ketika widget 'button' kita klik.
Caranya adalah dengan fungsi g_signal_connect(). Prototypenya adalah seperti berikut:
g_signal_connect(instance, detailed_signal, c_handler, data)
  • instance adalah nama widget yang ingin kita hubungkan.
  • detailed_signal adalah nama sinyal yang akan memanggil fungsi callback. karena kita ingin fungsi ini dipanggil saat terjadi klik, kita menggunakan "clicked"
  • c_handler adalah nama fungsi yang akan di panggil berdasarkan jenis sinyal yang kita daftarkan.
  • data adalah data yang ingin kita berikan kepada fungsi callback(opsional)
Sehingga bentuk fungsi koneksi widget 'button' akan seperti berikut:
g_signal_connect(button, "clicked", (GCallback)ButtonClick, NULL);

Jika sudah siap, saatnya menunjukkan semua widget :)
gtk_widget_show_all(window);
Fungsi diatas sengaja dipanggil setelah menghubungkan sinyal agar widget sudah siap menerima sinyal saat telah muncul di desktop.

Hasil

Yups, cukup mudah bukan? :)
Tahap ini masih alam tingkatan dasar, jadi tetap semangat ya...
Pada tutorial selanjutnya, kita akan membahas yang lebih advanced, dan lebih keren lagi pastinya :D

Load disqus comments

0 comments