Jeżeli mam kod
main.c

#include "funkcje.c"

int main (int argc, char *argv[])
{
    int i= 0, j = 0, z = 0;

    GtkWidget *kolumny;

    gtk_init(&argc, &argv);
    ZerujTablice();

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Kolko i krzyzyk");
    gtk_window_set_default_size(GTK_WINDOW(window), 150, 150);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    frame = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window), frame);

    kolumny = gtk_label_new("A");
    gtk_widget_set_size_request(kolumny, 50, 15);
    gtk_fixed_put(GTK_FIXED(frame), kolumny, 020, 0);
    kolumny = gtk_label_new("B");
    gtk_widget_set_size_request(kolumny, 50, 15);
    gtk_fixed_put(GTK_FIXED(frame), kolumny, 70, 0);
    kolumny = gtk_label_new("C");
    gtk_widget_set_size_request(kolumny, 50, 15);
    gtk_fixed_put(GTK_FIXED(frame), kolumny, 120, 0);
    kolumny = gtk_label_new("1");
    gtk_widget_set_size_request(kolumny, 20, 50);
    gtk_fixed_put(GTK_FIXED(frame), kolumny, 0, 15);
    kolumny = gtk_label_new("2");
    gtk_widget_set_size_request(kolumny, 20, 50);
    gtk_fixed_put(GTK_FIXED(frame), kolumny, 0, 65);
    kolumny = gtk_label_new("3");
    gtk_widget_set_size_request(kolumny, 20, 50);
    gtk_fixed_put(GTK_FIXED(frame), kolumny, 0, 115);

    // Rysowanie pola
    for (i=0;i<F_SIZE*F_SIZE;i++)
    {
        // Namalowanie kwadratow
        field_[i] = gtk_button_new_with_label("");
        gtk_widget_set_size_request(field_[i], 50, 50);
        gtk_fixed_put(GTK_FIXED(frame), field_[i], 20+50*z, 15+50*j);

        // Wypelnienie ich domyslnie...niczym
        field_label[i] = gtk_label_new("");
        gtk_fixed_put(GTK_FIXED(frame), field_label[i], 40+(50*z), 35+(50*j));
        if ((i+1)%3 == 0)
        {
            j++;
        }
        if (z == 2) z = 0;
        else z++;
    }

    // Pobieranie ruchów od gracza
    for(i=0;i<F_SIZE*F_SIZE;i++)
    {
        g_signal_connect(field_[i], "clicked", G_CALLBACK(RysujPole), field_label[i]);
        g_signal_connect(field_[i], "clicked", G_CALLBACK(WykonajRuch), (gpointer) i);
    }

    gtk_widget_show_all(window);

    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    gtk_main();

    return 0;
}

funkcje.h

#include <gtk/gtk.h>

#define F_SIZE 3

GtkWidget *field_label[F_SIZE*F_SIZE];
GtkWidget *field_[F_SIZE*F_SIZE];
GtkWidget *frame;
GtkWidget *window;
int pole[F_SIZE*F_SIZE];
int ruchy = 0;
int ruch = 1, poprzedni = 2;

void ZerujTablice();
void WykonajRuch(GtkWidget *widget, gpointer label);
void RysujPole(GtkWidget *widget, gpointer label);
int CzyPoprawny(int id);
int CzyWygral();
void Komunikat();

funkcje.c

#include "funkcje.h"

// Zerowanie tablicy na wszelki wypadek
void ZerujTablice()
{
    int i = 0;
    for (i = 0;i<F_SIZE*F_SIZE;i++)
    {
        pole[i] = 0;
    }

}

// Funkcja blokujaca nadpisywanie ruchow
int CzyPoprawny(int id)
{
    if(pole[id] != 0)
        return 0;

    pole[id] = ruch;
    return 1;
}

void Komunikat(GtkWidget *widget, gpointer window)
{

    GtkWidget *dialog;
    if (ruch == 1)
    {
        dialog = gtk_message_dialog_new(window,
                GTK_DIALOG_DESTROY_WITH_PARENT,
                GTK_MESSAGE_INFO,
                GTK_BUTTONS_OK,
                "Wygral gracz: X", "title");
    }
    else
    {
        dialog = gtk_message_dialog_new(window,
                GTK_DIALOG_DESTROY_WITH_PARENT,
                GTK_MESSAGE_INFO,
                GTK_BUTTONS_OK,
                "Wygral gracz: O", "title");
    }
    gtk_window_set_title(GTK_WINDOW(dialog), "Informacja");
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
    gtk_main_quit();
}

// Funkcja wpisujaca ruch do tablicy i uruchamiajaca sprawdzanie wygranej
void WykonajRuch(GtkWidget *widget, gpointer label)
{
    int id = (int) label;
    int wynik = 0;

    printf("Gracz %d wykonuje ruch na pole %d\n", ruch, id);
    if (CzyPoprawny(id) == 1)
    {
        wynik = CzyWygral();
        if (wynik)
        {
            printf("Stan: ");
            switch (wynik)
            {
                case 1:
                    printf("Wygral X");
                    gtk_signal_connect(GTK_OBJECT(widget), "clicked", G_CALLBACK(Komunikat), (gpointer) window);
                    //gtk_main_quit();
                    break;
                case 2:
                    printf("Wygral O");
                    //gtk_main_quit();
                    break;
                default:
                    printf("Gra w toku...");
                    break;
            }
            printf("\n");
        }
        ruchy++;
        poprzedni = ruch;
        ruch = (ruch==1 ? 2 : 1);
    }
    else
        return;
}

// Funkcja wpisująca X lub O w dane pole
void RysujPole(GtkWidget *widget, gpointer label)
{
    if (ruchy < F_SIZE*F_SIZE)
    {
        gtk_label_set_text( (GtkLabel*) label, (ruch == 1? "X":"O") );
    }
}

// Funkcja sprawdzajaca czy gracz wygral
int CzyWygral()
{
    int i = 0, j = 0, suma = 0, z = 0;
    //Sprawdzanie przekatnych
    if (pole[0])
    {
        suma = 0;
        // Lewa przekatna
        for(i = 0;i<F_SIZE*F_SIZE;i++)
        {
            if (i%4 == 0)
            {
                if(pole[i] != pole[0])
                    break;
                else
                    suma++;
            }

            if (suma == F_SIZE)
                return pole[0];
        }
    }
    if (pole[F_SIZE-1])
    {
        suma = 0;
        // Prawa przekatna
        for (i = F_SIZE-1;i<=F_SIZE*2;i++)
        {
            if (i%2 == 0)
            {
                if(pole[i] != pole[F_SIZE-1])
                    break;
                else
                    suma++;
            }

            if (suma == F_SIZE)
               return pole[F_SIZE-1];
        }
    }
    // Sprawdzanie linii poziomych
    for (i = 0;i<F_SIZE;i++)
    {
        suma = 0;
        for (j = 0;j<F_SIZE;j++)
        {
            if (pole[(F_SIZE*i)])
            {
                if (pole[j+(3*i)] != pole[(F_SIZE*i)])
                    break;
                else
                    suma++;
            }

            if (suma == F_SIZE)
                 return pole[j+(3*i)];
        }
    }

    // Sprawdzanie linii pionowych
    for (j = 0;j<F_SIZE;j++)
    {
        suma = 0;
        for (i = 0;i<F_SIZE;i++)
        {
            if (pole[j])
            {
                z = j + (F_SIZE*i);
                if (pole[z] != pole[j])
                    break;
                else
                    suma++;

                if (suma == F_SIZE)
                    return pole[j];
            }
        }
    }

    return 0;
}

To dlaczego nie chce mi wyskoczyć okienko po wygraniu? :|