GTK+ C Programlama Kod Örnekleri

Başlatan sem, 10 Ocak 2011 - 18:27:19

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

sem

Öyle kuru kuru anlatıp geçmek istemedim... Çünkü bu tarz şeyler pratik şekilde daha iyi anlaşılıyor... Yalnız şu konuyu da belirtmek isterim bu başlık öğretmekten çok, aradığı bazı şeyleri bulamayacak arkadaşlar için kod örneği olması amaçlıdır.

Başlıkta şu şekilde gideceğiz minicik bir program yazacağız, ondan sonra çeşitli kontroller ile aynı programı geliştireceğiz. Sonuçta yine minicik bir progamımız olacak ama aşama aşama olduğu için eklenen kodların takibini daha rahat yapabileceğiz. Kodlar içerisinde şu bölümler ile alakalı kod örnekleri bulabilirsiniz.

1.) Dinamik Girişler
2.) İkon Gösterimi
3.) Kısayol oluşturucu programının ikon tanıması
4.) Programa kendi ikonunu ekleme
5.) Kontrol kutucuğu kullanma
6.) Kullanıcı ile iletişim, uyarı, hata bildirim ve teyit alma
7.) Düğme kullanımına örnek
8.) Düğmeler üzerinde tam hakimiyet
9.) Sağ tık ile menü oluşturmak
10.) Eklediğimiz bir birimi silmek

Dinamik Girişleri Nasıl Yapacağız?

Dinamik giriş ile anlatmaya çalıştığım: Bir GtkEntry türümüz olsun. Yani programda kullanıcıdan gir giriş istiyoruz diyelim. Kullanıcının girdiği her harfi o anda alarak dinamik bir girdi oluşturabiliriz.

Bunun anlamı şu oluyor; kişi her tuşa bastığında bunu yakalayacağız. Kişi girişleri GtkEntry birimine girecek. Demek ki GtkEntry'nin tuş olayını kontrol edeceğiz...

Böyle bir durum için işimize yarayacak olan "key_release_event" sinyali... Bu sinyal ilgili birimde tuşa basıldığını anlamamızı yarayacak olan sinyal.

O zaman yapmamız gereken; bir GtkEnrty oluşturacağız ve key_release_event olayını takip edeceğiz. Kişididen girdiyi alacağımız birimin adı "Giris" olsun;

...
GtkWidget * Giris;
...
...
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);
...
...




Giris adında bir GtkEntry oluşturduk. Daha sonra da bir tuşa basıldığında key_release_event sinyalini yaymasını istedik. Bu sinyal yayıldığında ise yaziyi_al fonksiyonunu çağırmasını söyledik... Artık alınan girdiyi ne yapacağımız tamamen yaziyi_al fonksiyonunda yazacağımız kodlara göre, istediğimiz şekilde belirlenebilecek.


Kişinin yazığı yazdığı yazıyı aynı anda pencereye yazan bir program yazalım;


#include <gtk/gtk.h>

GtkWidget *Pencere, *DikeyKutu, *Label, *Giris;

static void destroy( GtkWidget *widget, gpointer   data )
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));
gtk_label_set_text(GTK_LABEL(Label), yazi);

return FALSE;
}

int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "destroy",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);

gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
        gtk_main();

        return 0;
}




Bir pencere, bir giriş, bir de label tanımladık... Bir de Dikey kutu tanımladık. Dikey kutumuzu pencereye, diğer değişkenlerimizi ise dikey kutumuza yerleştirdik... Yani GtkEntry ve GtkLabel alt alta konumlacak (çünkü dikey kutu).

key_release_event olayını da yakaladık ve yaziyi_al fonksiyonumuzu yazdık. Bu fonksiyon içerisinde girilen yazıyı label'a yazmasını söylüyoruz... Bu kadar...


İkon gösterimi?

İkonları göstermek için öncelikle GTK+ da tanımlı yeni bir birim öğrenmemiz gerekiyor. GtkImage...

Oluşturmak için kullanabileceğimiz fonksiyonlardan ikisi;

GtkWidget*    gtk_image_new_from_file   (const gchar *filename);

Bu fonksiyon ile ikonumuzun diskteki yerini belirtiyoruz.

GtkWidget*    gtk_image_new_from_icon_name  (const gchar *icon_name,  GtkIconSize size);

Bu fonskiyon ile de kullanmış olduğumuz tema içerisindeki isminden bir ikonu buluyoruz. İkinci parametre ile de ikonun boyutunu belirtiyoruz. Alabileceği değerler;

  GTK_ICON_SIZE_INVALID,
  GTK_ICON_SIZE_MENU,
  GTK_ICON_SIZE_SMALL_TOOLBAR,
  GTK_ICON_SIZE_LARGE_TOOLBAR,
  GTK_ICON_SIZE_BUTTON,
  GTK_ICON_SIZE_DND,
  GTK_ICON_SIZE_DIALOG



Bunlar ayrı bir tür değil #define ile tanımlanmış birimlerdir. Yani bunlar yerine tam sayı da kullanabilirsiniz... Tabii değerlerini biliyorsanız... Yanlış bilmiyorsam 0'dan 6'ya kadar boyutu artarak gidiyor...


Ben GtkImage ile ilgili iki fonksiyon daha göstereceğim fakat bu tür  ile ilgili bayağı fonksiyon vardır. İlgilenen arkadaşlar BU adresinden fonksiyonları inceleyebilirler.

void   gtk_image_set_from_file(GtkImage *image,   const gchar *filename);

Bu fonksiyon ile önceden yaratmış olduğumuz bir GtkImage değişkeninin resmini değiştiriyoruz. İlk parametre ikonunu değiştireceğimiz GtkImage türünden tanımladığımız değişken. İkinci parametre ise yeni resmimizin diskteki adresi...

void   gtk_image_set_from_icon_name(GtkImage *image,  const gchar *icon_name,  GtkIconSize size);

İlk fonksiyon ile aynı işlemi yapar. Birinci parametresi ilk fonksiyon ile aynıdır. İkinci parametresi kullanılan temadaki ikon adı, son parametresi ise ikonun boyutudur...


Gördüğünüz gibi kullandığımız bütün birimleri oluşturma fonksiyonları ve üzerinde değişiklikler ve işlemler yapma foksiyonları hemen hemen aynı...  O nedenle bundan sonra kullandığım yeni birimler olursa ayrıyetten tanımlamayacağım... Şu ana kadar verdiğim bağlantılar GTK+'nın kendi sitesi... İstediğiniz bütün değişkenlere bu siteden bir arama sonucunda ulaşabilirsiniz... Bütün  birimlerin fonksiyonları ve değişkenin yapısı dahil bütün bilgiler mevcut...

Kısayol Oluşturucu programının ikon tanımlaması?

Bahsettiğim programa şu bağlantıdan ulaşabilirsiniz. Üzerinde durduğumuz özelliği ise; yenibir kısayol eklerken ikonu kendi kendine tanıma özelliği...

Aslında yukarda yaptığımız kullanıcının girdiği yazıyı dinamik olarak algılayan programdan çok bir farkı yok... Sadece bir GtkImage eklenmiş hali de diyebiliriz.

Mantığı şu şekilde;

* Kullanıcının girdiği yazının diskte bir dosya olarak mevcut olup olmadığı kontrol et.
  - Eğer mevcut ise bunu resim olarak GtkImage üzerinde göster...
  - Eğer mevcut değilse tema ismi olarak girileni ayarla...

Sanırım bu şekilde bir program yazabilmek için bilmemiz gereken herşeyi biliyoruz.

Hemen yazalım o zaman =)

Zaten yukarıdaki program ile bir çoğunu yazmış bulunuyoruz...


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


GtkWidget *Pencere, *DikeyKutu, *Label, *Giris, *Ikon;

static void destroy( GtkWidget *widget, gpointer   data )
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));
gtk_label_set_text(GTK_LABEL(Label), yazi);

if(access(yazi, 0))
gtk_image_set_from_icon_name(GTK_IMAGE(Ikon),yazi, 6);
else
gtk_image_set_from_file(GTK_IMAGE(Ikon), yazi);

return FALSE;
}

int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "destroy",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Ikon = gtk_image_new_from_file("");
Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);


gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Ikon, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
    gtk_main();

    return 0;
}



Programda sadece  ana penceremize GtkImage türünden bir ikon gösterici ekledik. Ve key_release_event olayını işlediğimiz fonksiyonda

Alıntı Yap* Kullanıcının girdiği yazının diskte bir dosya olarak mevcut olup olmadığı kontrol et.
  - Eğer mevcut ise bunu resim olarak GtkImage üzerinde göster...
  - Eğer mevcut değilse tema ismi olarak girileni ayarla...

Bu dediklerimizi ekledik o kadar...


Programımıza ikon nasıl ekleyeceğiz?

Bir üstteki ile alakası olan bir durum değil... Burada bahsettiğimiz programımızın kendi ikonu.

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


GtkWidget *Pencere, *DikeyKutu, *Label, *Giris, *Ikon;

static void destroy( GtkWidget *widget, gpointer   data )
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));
gtk_label_set_text(GTK_LABEL(Label), yazi);

if(access(yazi, 0))
gtk_image_set_from_icon_name(GTK_IMAGE(Ikon),yazi, 6);
else
gtk_image_set_from_file(GTK_IMAGE(Ikon), yazi);

return FALSE;
}

int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);
gchar * LOGO = "/usr/share/pixmaps/apple-green.png";

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "destroy",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

    /// Program logosu oluşturuluyor
GdkPixbuf *Logo;
GError *Hata = NULL;
Logo = gdk_pixbuf_new_from_file(LOGO, &Hata);

if(!Logo)
   fprintf(stdout, "Program Logosu Yüklenemedi\n");
else
{
   fprintf(stdout, "Program Logosu bulundu\n");
       gtk_window_set_icon(GTK_WINDOW(Pencere), GDK_PIXBUF(Logo));
}

//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Ikon = gtk_image_new_from_file("");
Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);


gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Ikon, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
    gtk_main();

    return 0;
}



Programa eklediğimiz ek kod;

    /// Program logosu oluşturuluyor
GdkPixbuf *Logo;
GError *Hata = NULL;
Logo = gdk_pixbuf_new_from_file(LOGO, &Hata);

if(!Logo)
   fprintf(stdout, "Program Logosu Yüklenemedi\n");
else
{
   fprintf(stdout, "Program Logosu bulundu\n");
       gtk_window_set_icon(GTK_WINDOW(Pencere), GDK_PIXBUF(Logo));
}


Kısmıdır...


Kontrol kutucuklarını nasıl kullanacağız?

Kontrol kutucuklarını bazı denetimleri elimizde tutmak için kullanacağız. Basit örneğimize yeni ve basit bir ekleme yapacak olursak; şu anda kişiden aldığımız yazıları ekrana basıyor. Bu kontrolü elimize bir kontrol kutucuğu ile alabiliriz... Kodlayalım;

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


GtkWidget *Pencere, *DikeyKutu, *Label, *Giris, *Ikon, *Kontrol;

static void destroy( GtkWidget *widget, gpointer   data )
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}

void yazi_kontrol(GtkWidget *widget, gpointer data)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

    if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    gtk_label_set_text(GTK_LABEL(Label), yazi);
    else
    gtk_label_set_text(GTK_LABEL(Label), "");

}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    gtk_label_set_text(GTK_LABEL(Label), yazi);


if(access(yazi, 0))
gtk_image_set_from_icon_name(GTK_IMAGE(Ikon),yazi, 6);
else
gtk_image_set_from_file(GTK_IMAGE(Ikon), yazi);

return FALSE;
}

int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);
gchar * LOGO = "/usr/share/pixmaps/apple-green.png";

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "destroy",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

    /// Program logosu oluşturuluyor
GdkPixbuf *Logo;
GError *Hata = NULL;
Logo = gdk_pixbuf_new_from_file(LOGO, &Hata);

if(!Logo)
   fprintf(stdout, "Program Logosu Yüklenemedi\n");
else
{
   fprintf(stdout, "Program Logosu bulundu\n");
       gtk_window_set_icon(GTK_WINDOW(Pencere), GDK_PIXBUF(Logo));
}

//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Ikon = gtk_image_new_from_file("");
Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);
Kontrol = gtk_check_button_new_with_label("Yazılanı gösterme");
g_signal_connect(Kontrol, "toggled", G_CALLBACK(yazi_kontrol), NULL);

gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Ikon, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Kontrol, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
    gtk_main();

    return 0;
}



Programızıma Kontrol adı ile bir kontrol kutucuğu ekledik. Yazılan yazıyı "dinlediğimiz" yani key_release_event olayında çalıştırdığımız  fonksiyona şöyle bir ekleme yaptık;

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    gtk_label_set_text(GTK_LABEL(Label), yazi);


Böylece pencereye yazma işlemi kutucuğun işaretine göre ayarlanmış oluyor. Ayrıca yazi_kontrol fonksiyonu ekledik. Bu fonksiyon ise kontrol kutucuğunun işaretini değiştirdiğimizde çalışacak. Kontrol kutucuğunun işaretinin değişmesi olarak "toggle" sinyalini kullandığıza dikkat edin lütfen...

Böyle bir ekleme yapmamızın sebebi; örneğin yazılan yazıyı penceremizde gösteriyoruz diyelim; eğer pencerede yazı varken, "Yazıları Gösterme" kutucuğunu işaretlersek önceden kalmış olan yazılar öylece duracak. Bu fonksiyon önceden yazılmış varsa bunları pencereden temizlemek için kullanılacak.

Biraz daha kontrollü bir programımız olmuş oldu.


Kullanıcı ile iletişim

Normal bir C programında kullanıcıyı herhangi bir konuda uyarmak gayet basit. fprintf, printf, puts gibi bir çok alternatif ile ekrana geçeceğimiz bir yazı dizisi ile kullanıcıya uyarı ya da bilgi verme işlemini yapmış oluyoruz. GTK+'da da bu gayet basit. Sadece bir kaç satır fazla yazmış olacağız o kadar.

Yine basit programımızda kişiye örneğin kutucuğun işaretiğini değiştirdiğinde bilgilendirme verebiliriz. Çok gereksiz olsa da örnek açısından bir sorun yok bence =)



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


GtkWidget *Pencere, *DikeyKutu, *Label, *Giris, *Ikon, *Kontrol;

static void destroy( GtkWidget *widget, gpointer   data )
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}

void yazi_kontrol(GtkWidget *widget, gpointer data)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

    if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede de gösterilecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);


    gtk_label_set_text(GTK_LABEL(Label), yazi);
    }
    else
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede gösterilmeyecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), "");
    }

}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    gtk_label_set_text(GTK_LABEL(Label), yazi);


if(access(yazi, 0))
gtk_image_set_from_icon_name(GTK_IMAGE(Ikon),yazi, 6);
else
gtk_image_set_from_file(GTK_IMAGE(Ikon), yazi);

return FALSE;
}

int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);
gchar * LOGO = "/usr/share/pixmaps/apple-green.png";

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "destroy",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

    /// Program logosu oluşturuluyor
GdkPixbuf *Logo;
GError *Hata = NULL;
Logo = gdk_pixbuf_new_from_file(LOGO, &Hata);

if(!Logo)
   fprintf(stdout, "Program Logosu Yüklenemedi\n");
else
{
   fprintf(stdout, "Program Logosu bulundu\n");
       gtk_window_set_icon(GTK_WINDOW(Pencere), GDK_PIXBUF(Logo));
}

//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Ikon = gtk_image_new_from_file("");
Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);
Kontrol = gtk_check_button_new_with_label("Yazılanı gösterme");
g_signal_connect(Kontrol, "toggled", G_CALLBACK(yazi_kontrol), NULL);

gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Ikon, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Kontrol, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
    gtk_main();

    return 0;
}



Programa eklenen iki kısım var ikisi de aynı... Şu kısım;


GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede gösterilmeyecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);



Dialogları kullanarak sadece uyarı ya da hata gibi bildirim işlemerini değil, kullanıcıdan teyit alma gibi işlemleri de gerçekleştirebiliyoruz. Çok bir fark olmayacak aslında yukarıdaki kullanım ile... Sadece bir iki parametrede değişiklik yapacağız ve kullanıcının cevabını takip edeceğiz.


Programımızda teyit almak isteyeceğimiz yer programın kapanması olabilir. Kodlayalım;

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


GtkWidget *Pencere, *DikeyKutu, *Label, *Giris, *Ikon, *Kontrol;

static void destroy( GtkWidget *widget, gpointer   data )
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_QUESTION,
            GTK_BUTTONS_YES_NO,
            "Programı kapatmak istediğinize emin misiniz?");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_YES)
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}
gtk_widget_destroy(dialog);
}

void yazi_kontrol(GtkWidget *widget, gpointer data)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

    if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede de gösterilecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), yazi);
    }
    else
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede gösterilmeyecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), "");
    }

}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    gtk_label_set_text(GTK_LABEL(Label), yazi);


if(access(yazi, 0))
gtk_image_set_from_icon_name(GTK_IMAGE(Ikon),yazi, 6);
else
gtk_image_set_from_file(GTK_IMAGE(Ikon), yazi);

return FALSE;
}

int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);
gchar * LOGO = "/usr/share/pixmaps/apple-green.png";

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "delete-event",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

    /// Program logosu oluşturuluyor
GdkPixbuf *Logo;
GError *Hata = NULL;
Logo = gdk_pixbuf_new_from_file(LOGO, &Hata);

if(!Logo)
   fprintf(stdout, "Program Logosu Yüklenemedi\n");
else
{
   fprintf(stdout, "Program Logosu bulundu\n");
       gtk_window_set_icon(GTK_WINDOW(Pencere), GDK_PIXBUF(Logo));
}

//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Ikon = gtk_image_new_from_file("");
Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);
Kontrol = gtk_check_button_new_with_label("Yazılanı gösterme");
g_signal_connect(Kontrol, "toggled", G_CALLBACK(yazi_kontrol), NULL);

gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Ikon, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Kontrol, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
    gtk_main();

    return 0;
}




Kodumuzda iki değişiklik oldu; birincisi destroy fonksiyonuna aşağıdaki bloğu ekledik;

   GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_QUESTION,
            GTK_BUTTONS_YES_NO,
            "Programı kapatmak istediğinize emin misiniz?");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_YES)
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}



Gördüğüz gibi diğer uyarılardan farklı olarak; GTK_MESSAGE_WARNING kısmını GTK_MESSAGE_QUESTION olarak değiştirdik... Bu dialoğumuzun gösterdiği resmi değiştirdi. Bir de GTK_BUTTONS_OK kısmını GTK_BUTTONS_YES_NO olarak değiştirdik... Bu kısım ile de Tamam (OK) tuşu yerine Evet, Hayır tuşlarını (YES - NO) tuşlarını koymuş olduk.

if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_YES)

Bu kısımda ise gelen cevabın evet olup olmadığına göre kontrolümüzü yapıyoruz. GTK_RESPONSE_YES evet GTK_RESPONSE_NO ise hayır demek oluyor...

Pencereyi kapattığımızda ise destroy değil delete-event sinyalini oluşturduğumuza dikkat edin... Bu kısım da çok önemli... Eğer destroy sinyali oluştursaydık evet - hayır'a bakılmaksızın penceremiz kapanacaktı ama program bizim göremediğimiz bir yerlerde çalışıyor olacaktı.

Dialoglar ile ilgili ufak bir araştırma ile çok daha fazla alternatif ile karşılacaksınız. Benim dialoglar ile ilgili yapacağım örnekler bu kadar.


Düğme kullanım örneği


Düğmeyi kullanmak için kolay bir şey yapalım... Mesela bir kontrol kutucuğuna bir düğme ile müdahale edelim. Kodumuz şöyle olmalı;

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


GtkWidget *Pencere, *DikeyKutu, *Label, *Giris, *Ikon, *Kontrol, *Dugme;

static void destroy( GtkWidget *widget, gpointer   data )
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_QUESTION,
            GTK_BUTTONS_YES_NO,
            "Programı kapatmak istediğinize emin misiniz?");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_YES)
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}
gtk_widget_destroy(dialog);
}

void yazi_kontrol(GtkWidget *widget, gpointer data)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

    if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede de gösterilecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), yazi);
    }
    else
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede gösterilmeyecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), "");
    }

}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    gtk_label_set_text(GTK_LABEL(Label), yazi);


if(access(yazi, 0))
gtk_image_set_from_icon_name(GTK_IMAGE(Ikon),yazi, 6);
else
gtk_image_set_from_file(GTK_IMAGE(Ikon), yazi);

return FALSE;
}

static void kutuyu_denetle(GtkWidget *widget, gpointer data)
{

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (Kontrol), TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (Kontrol), FALSE);

}

int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);
gchar * LOGO = "/usr/share/pixmaps/apple-green.png";

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "delete-event",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

    /// Program logosu oluşturuluyor
GdkPixbuf *Logo;
GError *Hata = NULL;
Logo = gdk_pixbuf_new_from_file(LOGO, &Hata);

if(!Logo)
   fprintf(stdout, "Program Logosu Yüklenemedi\n");
else
{
   fprintf(stdout, "Program Logosu bulundu\n");
       gtk_window_set_icon(GTK_WINDOW(Pencere), GDK_PIXBUF(Logo));
}


//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Dugme = gtk_button_new_with_label("Değiştir");
g_signal_connect(Dugme, "clicked", G_CALLBACK(kutuyu_denetle), NULL);
Ikon = gtk_image_new_from_file("");
Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);
Kontrol = gtk_check_button_new_with_label("Yazılanı gösterme");
g_signal_connect(Kontrol, "toggled", G_CALLBACK(yazi_kontrol), NULL);

gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Ikon, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Kontrol, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Dugme, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
    gtk_main();

    return 0;
}



Düğmeler üzerinde tam hakimiyet

Başlık afilli oldu biraz... Aslında o kadar afilli bir işlem yapmayacağız. Tek yapacağımız bir düğmeye fare ile sağ tık mı, orta tık mı sol tık mı yapıldığını ayırt etmek o kadar. Yeni bir düğme ekleyeceğiz ve basılan tuşu uyarı olarak ekranda söyleyeceğiz. Tek yapmanız iki düğme arasındaki farklardan; hangi sinyali ne şekilde kullandığımıza bakmak. Kodlama da şu şekilde olacak;

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


GtkWidget *Pencere, *DikeyKutu, *Label, *Giris, *Ikon, *Kontrol, *Dugme, *Dugme2;

static void destroy( GtkWidget *widget, gpointer   data )
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_QUESTION,
            GTK_BUTTONS_YES_NO,
            "Programı kapatmak istediğinize emin misiniz?");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_YES)
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}
gtk_widget_destroy(dialog);
}

void yazi_kontrol(GtkWidget *widget, gpointer data)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

    if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede de gösterilecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), yazi);
    }
    else
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede gösterilmeyecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), "");
    }

}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    gtk_label_set_text(GTK_LABEL(Label), yazi);


if(access(yazi, 0))
gtk_image_set_from_icon_name(GTK_IMAGE(Ikon),yazi, 6);
else
gtk_image_set_from_file(GTK_IMAGE(Ikon), yazi);

return FALSE;
}

static void kutuyu_denetle(GtkWidget *widget, gpointer data)
{

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (Kontrol), TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (Kontrol), FALSE);

}

static gboolean hangi_tus(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
if (event->type == GDK_BUTTON_RELEASE  &&  (event->button == 1))
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Sol tık! Güzel seçim...");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
if (event->type == GDK_BUTTON_RELEASE  &&  (event->button == 2))
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "UUUUU!! Orta tık");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
if (event->type == GDK_BUTTON_RELEASE  &&  (event->button == 3))
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Kuru kuruya sağ tık da gitmez şimdi ona bir menü yapmak lazım=)");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
}
int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);
gchar * LOGO = "/usr/share/pixmaps/apple-green.png";

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "delete-event",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

    /// Program logosu oluşturuluyor
GdkPixbuf *Logo;
GError *Hata = NULL;
Logo = gdk_pixbuf_new_from_file(LOGO, &Hata);

if(!Logo)
   fprintf(stdout, "Program Logosu Yüklenemedi\n");
else
{
   fprintf(stdout, "Program Logosu bulundu\n");
       gtk_window_set_icon(GTK_WINDOW(Pencere), GDK_PIXBUF(Logo));
}


//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Dugme = gtk_button_new_with_label("Değiştir");
g_signal_connect(Dugme, "clicked", G_CALLBACK(kutuyu_denetle), NULL);
Dugme2 = gtk_button_new_with_label("Tıkla Beni");
g_signal_connect(Dugme2, "button_release_event", G_CALLBACK(hangi_tus), NULL);
Ikon = gtk_image_new_from_file("");
Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);
Kontrol = gtk_check_button_new_with_label("Yazılanı gösterme");
g_signal_connect(Kontrol, "toggled", G_CALLBACK(yazi_kontrol), NULL);

gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Ikon, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Kontrol, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Dugme, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Dugme2, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
    gtk_main();

    return 0;
}




Sağ tık ile menü oluşturmak

Bir önceki programı denediyseniz zaten bu başlığı tahmin etmişsinizdir sanıyorum... Doğrudan konuya giriyorum yani kodları veriyorum;


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


GtkWidget *Pencere, *DikeyKutu, *Label, *Giris, *Ikon, *Kontrol, *Dugme, *Dugme2;

static void destroy( GtkWidget *widget, gpointer   data )
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_QUESTION,
            GTK_BUTTONS_YES_NO,
            "Programı kapatmak istediğinize emin misiniz?");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_YES)
{
    g_print("Kapatılıyor...\n");
    gtk_main_quit ();
}
gtk_widget_destroy(dialog);
}

void yazi_kontrol(GtkWidget *widget, gpointer data)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

    if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede de gösterilecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), yazi);
    }
    else
    {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Yazılan yazılar ana pencerede gösterilmeyecek!");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);

    gtk_label_set_text(GTK_LABEL(Label), "");
    }

}

gboolean yaziyi_al(GtkWidget*widget, GdkEventKey *event)
{
gchar * yazi = NULL;

    yazi = (gchar *) gtk_entry_get_text(GTK_ENTRY(Giris));

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
    gtk_label_set_text(GTK_LABEL(Label), yazi);


if(access(yazi, 0))
gtk_image_set_from_icon_name(GTK_IMAGE(Ikon),yazi, 6);
else
gtk_image_set_from_file(GTK_IMAGE(Ikon), yazi);

return FALSE;
}

static void kutuyu_denetle(GtkWidget *widget, gpointer data)
{

if(!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (Kontrol)))
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (Kontrol), TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (Kontrol), FALSE);

}
static void bos_uyari(GtkMenuItem *item, gpointer window)
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Bu menü elemanının bir işleyi yoktur sadece gösterim olsun diye böyle boş bir uyarı verir");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}

static void tusu_sil(GtkMenuItem *item, gpointer window)
{
gtk_container_remove(GTK_CONTAINER(DikeyKutu), Dugme2);
}

static gboolean hangi_tus(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
if (event->type == GDK_BUTTON_RELEASE  &&  (event->button == 1))
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "Sol tık! Güzel seçim...");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
if (event->type == GDK_BUTTON_RELEASE  &&  (event->button == 2))
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(Pencere),
            GTK_DIALOG_DESTROY_WITH_PARENT,
            GTK_MESSAGE_WARNING,
            GTK_BUTTONS_OK,
            "UUUUU!! Orta tık");

gtk_window_set_title(GTK_WINDOW(dialog), "Uyarı");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
if (event->type == GDK_BUTTON_RELEASE  &&  (event->button == 3))
{
       GtkWidget *menu, *menuSil, *menuBos, *menuSep;
       menu = gtk_menu_new();
       menuBos = gtk_menu_item_new_with_label ("Bos Uyarı");
       menuSil = gtk_menu_item_new_with_label ("Tuşu Sil");
       menuSep = gtk_separator_menu_item_new();
       g_signal_connect (menuBos, "activate", G_CALLBACK (bos_uyari), NULL );
       g_signal_connect (menuSil, "activate", G_CALLBACK (tusu_sil), NULL);

       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuBos);
       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuSep);
       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuSil);
       gtk_widget_show_all (menu);
       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3,  gtk_get_current_event_time());
}

return FALSE;
}
int main(int argc, char * argv[])
{
gtk_init(&argc, &argv);
gchar * LOGO = "/usr/share/pixmaps/apple-green.png";

///Penceremiz oluşturup özelliklerini ayarlıyoruz
Pencere = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//GTK_WINDOW() kullandığımıza dikkat edin
gtk_window_set_title(GTK_WINDOW(Pencere), "Dinamik Girişler");
gtk_window_set_position(GTK_WINDOW(Pencere), GTK_WIN_POS_CENTER); //Ekranın ortasında açıl
g_signal_connect (Pencere, "delete-event",  G_CALLBACK (destroy), NULL); // Kapanırken çağırdığımız sinyal

    /// Program logosu oluşturuluyor
GdkPixbuf *Logo;
GError *Hata = NULL;
Logo = gdk_pixbuf_new_from_file(LOGO, &Hata);

if(!Logo)
   fprintf(stdout, "Program Logosu Yüklenemedi\n");
else
{
   fprintf(stdout, "Program Logosu bulundu\n");
       gtk_window_set_icon(GTK_WINDOW(Pencere), GDK_PIXBUF(Logo));
}


//Dikey kutumuzu oluşturup penceremize ekliyoruz
DikeyKutu = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(Pencere), DikeyKutu);

Dugme = gtk_button_new_with_label("Değiştir");
g_signal_connect(Dugme, "clicked", G_CALLBACK(kutuyu_denetle), NULL);
Dugme2 = gtk_button_new_with_label("Tıkla Beni");
g_signal_connect(Dugme2, "button_release_event", G_CALLBACK(hangi_tus), NULL);
Ikon = gtk_image_new_from_file("");
Label = gtk_label_new("");
Giris = gtk_entry_new();
g_signal_connect (Giris, "key_release_event", G_CALLBACK (yaziyi_al), NULL);
Kontrol = gtk_check_button_new_with_label("Yazılanı gösterme");
g_signal_connect(Kontrol, "toggled", G_CALLBACK(yazi_kontrol), NULL);

gtk_box_pack_start(GTK_BOX(DikeyKutu), Giris, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Ikon, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Kontrol, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Dugme, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(DikeyKutu), Dugme2, FALSE, FALSE, 0);

gtk_widget_show_all(Pencere);
    gtk_main();

    return 0;
}



Kodda bir önceki koddan değişik olarak sadece sağ tık menüsü eklenmiştir. Yani incelemeniz gereken yer sağ tıkı algılayan yerdir. Program kodlarını incelerseniz bir birimi silme ile alakalı fonksiyon da göreceksiniz...

Burada dikkat etmemiz gereken nokta ki araştırırsanız göreceksiniz bu programdaki sağ tık menüsünü (pop-up menü) sadece sağ tık için değildir. Uygun gördüğünüz her yerde kullanabilirsiniz. Örneğin programı sistem tepsisine yerleştirip buraya da ayrı bir menü yazabilirsiniz.... Ben şimdilik bırakıyorum zamanım oldukça eklemeler yapmaya çalışacağım...


Not: Daha ayrıntılı incelemek istediğiniz her birimi şu ana kadar vermiş olduğum ve diğer başlıkta da çokça verdiğim GTK+ sitesinden arayarak bulabilirsiniz.
İpucu; örneğin gtk_button_new(); gibi ya da benzeri bir fonksiyon ile oluşturulan bir birimi aramak için ilk iki kelimeyi birleştirin; "GtkButton"... Bu şekilde yapacağınız arama daha yararlı olacaktır.

Not2: Birimlerde hangi işlem için hangi sinyalin kullanıldığına ayrıca dikkat ederseniz sizin için yararlı olacaktır. Ayrıca her sinyalin call back dediğimiz  yani sinyal oluştuğunda çağırılacak olan fonksiyonunun prototipi aynı değildir. Bu nedenle gerekli durumlarda prototipi inceleyiniz.

Not3: Kullanacağınız fonksiyonların da prototipini incelemenizde fayda var. GTK+ bazı fonksiyonları statik bir alana geri dönüş yapıyor. Eğer bunu göz ardı ederseniz alanı sisteme iade etmeye çalışırsanız stack hataları ile karşılaşırsınız.

Not4: Program sadece gösterim ve ufak kodların kullanımı amaçlı olduğu için özen gösterilmemiştir. Siz bellek yönetiminde daha dikkatli olabilirsiniz...

Hatalıysam lütfen ara
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

microanaliz

İyi de okudum mantığını anladım çat pat grafik oluşturuyorumda yazdığım    C dili ile programı nasıl bağlantı kuracağım bu arayüz ile.Öğretirsen sevinirim.
MicroAnaliz

rutku

Sinyal özelliğini kullanarak kodlarını adapte edebilirsin. Zaten sem0900 örnekte göstermiş.

Anlatım güzel :) teşekkürler sem0900

Alıntı yapılan: sem0900 - 10 Ocak 2011 - 18:27:19
Giris adında bir GtkEntry oluşturduk. Daha sonra da bir tuşa basıldığında key_release_event sinyalini yaymasını istedik. Bu sinyal yayıldığında ise yaziyi_al fonksiyonunu çağırmasını söyledik... Artık alınan girdiyi ne yapacağımız tamamen yaziyi_al fonksiyonunda yazacağımız kodlara göre, istediğimiz şekilde belirlenebilecek.
Hayallerini kodla ...

uKiriş
Mezgeldek

microanaliz

Çalışma güzel hakkını vermek ve sayın sem0900'i tebrik etmek lazım.Biraz benim dikkatsiliğim yada insan haşırneşir oldukca anlıyor diyelim sağol arkadaş...
MicroAnaliz

hitokiri


sem

Teşekkür ederim =)


@microanaliz; aynen dediğiniz gibi insanın biraz aşinalık kazanması gerekiyor. Ben ilk baktığım zamanlar sudan çıkmış balığa dönmüştüm... Gerçi hala çok biliyorum diyemem, istediğimi az çok kodlayabiliyorum fakat ne kadar profesyonel ya da olması gerektiği gibi oluyor orasını bilemiyorum...

Yani biraz aşina olunca daha rahat gelecektir... kolay gelsin... Dediğim gibi fazla bilgim yok ama biraz aşinalığım var... Yardım edebileceğim bir şey olursa başlık altından sorabilirsiniz...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

microanaliz

İlginize teşekkurler Sayın sem0900
MicroAnaliz