diff options
author | waker <wakeroid@gmail.com> | 2009-08-13 22:38:35 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2009-08-13 22:38:35 +0200 |
commit | 06c9fe1c21c7de0c9985dff30891d6cf64ed46b8 (patch) | |
tree | 078cd367e67f22e97d276466120d058049dfb839 | |
parent | 2ee926470f70b6d5cf3566683aae8376b5aa7010 (diff) |
proper exiting without crashing
-rw-r--r-- | callbacks.c | 11 | ||||
-rw-r--r-- | callbacks.h | 9 | ||||
-rw-r--r-- | deadbeef.glade | 2 | ||||
-rw-r--r-- | interface.c | 6 | ||||
-rw-r--r-- | main.c | 19 | ||||
-rw-r--r-- | messages.h | 1 |
6 files changed, 33 insertions, 15 deletions
diff --git a/callbacks.c b/callbacks.c index 405f02ce..a543daf5 100644 --- a/callbacks.c +++ b/callbacks.c @@ -23,6 +23,7 @@ #include <math.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include "callbacks.h" #include "interface.h" @@ -1047,3 +1048,13 @@ on_volumebar_button_release_event (GtkWidget *widget, return FALSE; } + +gboolean +on_mainwin_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + messagepump_push (M_TERMINATE, 0, 0, 0); + return TRUE; +} + diff --git a/callbacks.h b/callbacks.h index 441d6cd5..244d6c5e 100644 --- a/callbacks.h +++ b/callbacks.h @@ -453,3 +453,12 @@ gboolean on_volumebar_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data); + +void +on_main_quit (GtkObject *object, + gpointer user_data); + +gboolean +on_mainwin_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); diff --git a/deadbeef.glade b/deadbeef.glade index 7c723f24..df53f013 100644 --- a/deadbeef.glade +++ b/deadbeef.glade @@ -22,8 +22,8 @@ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> <property name="focus_on_map">True</property> <property name="urgency_hint">False</property> - <signal name="destroy" handler="gtk_main_quit" last_modification_time="Fri, 03 Jul 2009 23:48:26 GMT"/> <signal name="key_press_event" handler="on_mainwin_key_press_event" last_modification_time="Thu, 30 Jul 2009 21:14:26 GMT"/> + <signal name="delete_event" handler="on_mainwin_delete_event" last_modification_time="Thu, 13 Aug 2009 20:35:55 GMT"/> <child> <widget class="GtkVBox" id="vbox1"> diff --git a/interface.c b/interface.c index afad4404..27792da8 100644 --- a/interface.c +++ b/interface.c @@ -366,12 +366,12 @@ create_mainwin (void) gtk_widget_show (statusbar); gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0); - g_signal_connect ((gpointer) mainwin, "destroy", - G_CALLBACK (gtk_main_quit), - NULL); g_signal_connect ((gpointer) mainwin, "key_press_event", G_CALLBACK (on_mainwin_key_press_event), NULL); + g_signal_connect ((gpointer) mainwin, "delete_event", + G_CALLBACK (on_mainwin_delete_event), + NULL); g_signal_connect ((gpointer) open, "activate", G_CALLBACK (on_open_activate), NULL); @@ -39,8 +39,6 @@ GtkWidget *searchwin; gtkplaylist_t main_playlist; gtkplaylist_t search_playlist; -int psdl_terminate = 0; - // update status bar and window title static int sb_context_id = -1; static char sb_text[512]; @@ -48,9 +46,6 @@ static float last_songpos = -1; void update_songinfo (void) { - if (!mainwin) { - return; - } char sbtext_new[512] = "-"; float songpos = last_songpos; if (p_ispaused ()) { @@ -107,15 +102,19 @@ update_songinfo (void) { } void -psdl_thread (uintptr_t ctx) { - p_play (); - while (!psdl_terminate) { +player_thread (uintptr_t ctx) { + for (;;) { uint32_t msg; uintptr_t ctx; uint32_t p1; uint32_t p2; while (messagepump_pop(&msg, &ctx, &p1, &p2) != -1) { switch (msg) { + case M_TERMINATE: + GDK_THREADS_ENTER(); + gtk_main_quit (); + GDK_THREADS_LEAVE(); + return; case M_SONGCHANGED: GDK_THREADS_ENTER(); // update window title @@ -222,7 +221,7 @@ main (int argc, char *argv[]) { codec_init_locking (); streamer_init (); p_init (); - thread_start (psdl_thread, 0); + thread_start (player_thread, 0); g_thread_init (NULL); add_pixmap_directory ("/usr/share/deadbeef/images"); @@ -241,10 +240,8 @@ main (int argc, char *argv[]) { search_playlist_init (lookup_widget (searchwin, "searchlist")); gtk_widget_show (mainwin); gtk_main (); - mainwin = NULL; gdk_threads_leave (); messagepump_free (); - psdl_terminate = 1; p_free (); streamer_free (); codec_free_locking (); @@ -31,6 +31,7 @@ enum { M_ADDDIR, // ctx = pointer to string, which must be freed by f_free M_ADDFILES, // ctx = GSList pointer, must be freed with g_slist_free M_FMDRAGDROP, // ctx = char* ptr, must be freed with standard free, p1 is length of data, p2 is drop_y + M_TERMINATE, // must be sent to player thread to terminate }; #endif // __MESSAGES_H |