diff options
author | P. F. Chimento <philip.chimento@gmail.com> | 2013-09-30 16:16:08 -0700 |
---|---|---|
committer | P. F. Chimento <philip.chimento@gmail.com> | 2013-09-30 16:16:08 -0700 |
commit | 406f72024666260471bef2a3abc91bcc44e254b9 (patch) | |
tree | a770a467de5b2020b4cd77376a802c7c6b405ab4 | |
parent | 87fe0c3a988e78575852911fd20a0dca507d42e2 (diff) | |
parent | 4aedf0e09caa61de0aca14b165f65ac84d996095 (diff) |
Merge pull request #320 from endlessm/window-close
Window close
-rw-r--r-- | endless/eoswindow.c | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/endless/eoswindow.c b/endless/eoswindow.c index 1e963f4..5364b49 100644 --- a/endless/eoswindow.c +++ b/endless/eoswindow.c @@ -540,7 +540,6 @@ eos_window_class_init (EosWindowClass *klass) widget_class->unmap = eos_window_unmap; widget_class->show = eos_window_show; container_class->forall = eos_window_forall; - widget_class->delete_event = eos_window_default_delete; /** * EosWindow:application: @@ -569,27 +568,50 @@ eos_window_class_init (EosWindowClass *klass) g_object_class_install_properties (object_class, NPROPS, eos_window_props); } +#if GTK_CHECK_VERSION (3, 10, 0) +#define our_window_close(w) gtk_window_close (w) +#else +static gboolean +queue_close (gpointer user_data) +{ + GtkWidget *window = user_data; + + GdkEvent *event = gdk_event_new (GDK_DELETE); + + event->any.window = gtk_widget_get_window (window); + event->any.send_event = TRUE; + + gtk_main_do_event (event); + + gdk_event_free (event); + + return G_SOURCE_REMOVE; +} + static void -on_minimize_clicked_cb (GtkWidget* top_bar, - gpointer user_data) +our_window_close (GtkWindow *window) { - if (user_data != NULL) - { - gtk_window_iconify (GTK_WINDOW (user_data)); - } + if (!gtk_widget_get_realized (GTK_WIDGET (window))) + return; + + gdk_threads_add_idle (queue_close, window); } +#endif /* GTK_CHECK_VERSION (3, 10, 0) */ static void -on_close_clicked_cb (GtkWidget* top_bar, - gpointer user_data) +on_minimize_clicked_cb (GtkWidget* top_bar) { - if (user_data != NULL) - { - // We don't actually care about the return value, the default "delete-event" handler - // will take care of closing windows for us - gboolean dummy = FALSE; - g_signal_emit_by_name (G_OBJECT (user_data), "delete-event", NULL, &dummy); - } + GtkWidget *window = gtk_widget_get_toplevel (top_bar); + + gtk_window_iconify (GTK_WINDOW (window)); +} + +static void +on_close_clicked_cb (GtkWidget* top_bar) +{ + GtkWidget *window = gtk_widget_get_toplevel (top_bar); + + our_window_close (GTK_WINDOW (window)); } /* Make sure that the edge finishing does not catch input events */ @@ -680,9 +702,9 @@ eos_window_init (EosWindow *self) gtk_window_maximize (GTK_WINDOW (self)); g_signal_connect (self->priv->top_bar, "minimize-clicked", - G_CALLBACK (on_minimize_clicked_cb), self); + G_CALLBACK (on_minimize_clicked_cb), NULL); g_signal_connect (self->priv->top_bar, "close-clicked", - G_CALLBACK (on_close_clicked_cb), self); + G_CALLBACK (on_close_clicked_cb), NULL); eos_window_set_page_manager (self, EOS_PAGE_MANAGER (eos_page_manager_new ())); |