Minggu, 15 Maret 2015

GTK Programming : Yang Terlewat, gtk_main_quit()


Setelah sekian banyak tulisan tentang GTK saya posting, ada satu hal yang sengaja saya tunda waktu postingnya. Hal itu saya maksudkan untuk mengurangi kerumitan kode program saat penjelasan.

Setiap program GTK, selalu memanggil fungsi gtk_main() setelah menyiapkan dan menampilkan semua widgetnya. Apa anda penasaran apa yang ada di gtk_main()?

Fungsi gtk_main() sebenarnya adalah fungsi untuk menunggu event. Saat event diterima, gtk_main() memanggil fungsi callback yang telah didaftarkan dengan g_signal_connect().  Banyak programmer GTK awalnya mengira, saat window ditutup program akan berhenti dengan sendirinya. Tapi saat mereka menjalankan program melalui terminal, mereka tahu, bahwa program ternyata masih tetap berjalan. Saat tombol tutup di pojok window kita klik, itu hanya menutup window saja. Saat itu gtk_main() akan terus berjalan menunggu event.

Untuk menghentikan gtk_main(), kita hanya bisa melakukannya dengan fungsi gtk_main_quit(). Darimana kita mengeksekusi fungsi tersebut? Program kan terus membaca event?
Sebenarnya saat window ditutup, ia mengeluarkan signal “destroy”, tepat setelah window menghilang dari desktop. Bagian inilah yang dapat kita manfaatkan untuk membelokkan gtk_main() ke fungsi callback untuk menangani event “destroy” tadi. Dalam fungsi callback kita sisipkan saja kode gtk_main_quit(), dan selesailah sudah.

Jika kita sebelumnya mengalokasikan memory atau resource, semua sebaiknya kita bebaskan dari fungsi callback ini.

Source code 


#include<gtk/gtk.h>
#include<malloc.h>

void window_destroy (GtkWidget *object, gpointer user_data)
{
    g_print("Event destroy diterima :) \n");
    gtk_main_quit();
}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    gtk_init(&argc, &argv);
    //window baru
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"GtkWindow");
    //hubungkan signal
    g_signal_connect (window, "destroy", G_CALLBACK (window_destroy),NULL);
    //tampilkan widget
    gtk_widget_show_all(window);
    gtk_main();
    //Setelah gtk_main_quit() dipanggil...
    g_print("Hey, gtk_main_quit() sudah dipanggil :) \n");
    return 0;
}


Hasil
Load disqus comments

0 comments