Re: destroy signal in a class derived from gtkwindow



On Wed, Aug 18, 2004 at 07:49:12PM +0200, Stefan Kost wrote:
I derived my main-window classs from GtkWindow (a top-level window).
I have connected a signal-handler to the "delete-event" for the window to show a
"are you sure" dialog.
When I return FALSE from the handler, the destroy signal was sent to my window
before I was deriving the winodw class.

Now I don't get the destoy signal. Do I need to emit the "destroy" signal myself
(to the parent object)?

Do I need to forward signal in general?

I'm not sure if I understand what you are doing... whether
you override delete event method in the class implementation,
or connect to it in application code... but if you don't
have something else connected to "delete_event", the
"destroy" signal should be sent normally.  See the attached
code and compare...

Two notes:
- the test does not do gtk_main_quit() on window close to
  avoid any suspicion of interference
- The destroy() method is actually called twice ... who
  knows why

Yeti


--
Do not use tab characters. Their effect is not predictable.




/* interface ****************************************************************/
#include <gtk/gtk.h>

#define MY_TYPE_WINDOW            (my_window_get_type())
#define MY_WINDOW(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), MY_TYPE_WINDOW, MyWindow))
#define MY_WINDOW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), MY_TYPE_WINDOW, MyWindowClass))
#define IS_MY_WINDOW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), MY_TYPE_WINDOW))
#define IS_MY_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), MY_TYPE_WINDOW))
#define MY_WINDOW_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), MY_TYPE_WINDOW, MyWindowClass))

typedef struct _MyWindow      MyWindow;
typedef struct _MyWindowClass MyWindowClass;

struct _MyWindow {
    GtkWindow parent_instance;
};

struct _MyWindowClass {
    GtkWindowClass parent_class;
};

GtkWidget*    my_window_new                  (void);
GType         my_window_get_type             (void) G_GNUC_CONST;


/* implementation ************************************************************/
#define MY_WINDOW_TYPE_NAME "MyWindow"

static void my_window_class_init (MyWindowClass *klass);
static void my_window_init       (MyWindow *mywindow);
static void my_window_destroy    (GtkObject *object);

static GtkWindowClass *parent_class = NULL;

GType
my_window_get_type(void)
{
    static GType my_window_type = 0;

    if (!my_window_type) {
        static const GTypeInfo my_window_info = {
            sizeof(MyWindowClass),
            NULL,
            NULL,
            (GClassInitFunc)my_window_class_init,
            NULL,
            NULL,
            sizeof(MyWindow),
            0,
            (GInstanceInitFunc)my_window_init,
            NULL,
        };
        my_window_type = g_type_register_static(GTK_TYPE_WINDOW,
                                                MY_WINDOW_TYPE_NAME,
                                                &my_window_info,
                                                0);
    }

    return my_window_type;
}

static void
my_window_class_init(MyWindowClass *klass)
{
    GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
    GtkObjectClass *object_class;
    GtkWidgetClass *widget_class;

    object_class = (GtkObjectClass*)klass;
    widget_class = (GtkWidgetClass*)klass;
    parent_class = g_type_class_peek_parent(klass);

    object_class->destroy = my_window_destroy;
}

static void
my_window_init(MyWindow *mywindow)
{
}

GtkWidget*
my_window_new(void)
{
    MyWindow *mywindow;

    mywindow = (MyWindow*)g_object_new(MY_TYPE_WINDOW, NULL);
    return GTK_WIDGET(mywindow);
}

static void
my_window_destroy(GtkObject *object)
{
    g_printerr("Aargh! I'm finished.\n");

    GTK_OBJECT_CLASS(parent_class)->destroy(object);
}

/* test **********************************************************************/
static gboolean
delete_event_handler(GtkWidget *window)
{
    GtkWidget *dialog;
    gboolean res;

    dialog = gtk_message_dialog_new(GTK_WINDOW(window), 0,
                                    GTK_MESSAGE_QUESTION,
                                    GTK_BUTTONS_YES_NO,
                                    "Really close?");
    gtk_window_present(GTK_WINDOW(dialog));
    res = gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_YES;
    gtk_widget_destroy(dialog);

    return res;
}

int
main(int argc, char *argv[])
{
    GtkWidget *window;

    gtk_init(&argc, &argv);
    window = my_window_new();
    gtk_container_add(GTK_CONTAINER(window),
                      gtk_label_new("Mirror, mirror on the wall,\n"
                                    "tell me if I am the most HIG 2.0\n"
                                    "compliant of all..."));
    g_signal_connect(window, "delete_event",
                     G_CALLBACK(delete_event_handler), NULL);
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]