summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--callbacks.c11
-rw-r--r--callbacks.h9
-rw-r--r--deadbeef.glade2
-rw-r--r--interface.c6
-rw-r--r--main.c19
-rw-r--r--messages.h1
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);
diff --git a/main.c b/main.c
index b96099b1..13479019 100644
--- a/main.c
+++ b/main.c
@@ -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 ();
diff --git a/messages.h b/messages.h
index 6fb78341..5a8cecc0 100644
--- a/messages.h
+++ b/messages.h
@@ -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