diff --git a/gtk/main.c b/gtk/main.c index 95ce91d5b..08a37ea73 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -65,7 +65,6 @@ static gboolean iconified=FALSE; static gchar *workingdir=NULL; static char *progpath=NULL; gchar *linphone_logfile=NULL; -static gboolean app_terminated=FALSE; static GOptionEntry linphone_options[]={ { @@ -1383,11 +1382,25 @@ static void linphone_gtk_check_soundcards(){ } } +static void linphone_gtk_quit(void){ + gdk_threads_leave(); + linphone_gtk_destroy_log_window(); + linphone_core_destroy(the_core); + linphone_gtk_log_uninit(); +} + #ifdef HAVE_GTK_OSX +/* +This is not the correct way to implement block termination. +The good way would be to call gtk_main_quit(), and return TRUE. +Unfortunately this does not work, because if we return TRUE the NSApplication sometimes calls the CFRunLoop recursively, which prevents gtk_main() to exit. +As a result the program cannot exit at all. +As a workaround we do all the cleanup (unregistration and config save) within the handler. +*/ static gboolean on_block_termination(void){ gtk_main_quit(); - g_message("Block termination returning %i",!app_terminated); - return !app_terminated; + linphone_gtk_quit(); + return FALSE; } #endif @@ -1514,11 +1527,7 @@ int main(int argc, char *argv[]){ linphone_gtk_check_for_new_version(); gtk_main(); - gdk_threads_leave(); - linphone_gtk_destroy_log_window(); - linphone_core_destroy(the_core); - linphone_gtk_log_uninit(); - app_terminated=TRUE; + linphone_gtk_quit(); #ifndef HAVE_GTK_OSX /*workaround a bug on win32 that makes status icon still present in the systray even after program exit.*/ gtk_status_icon_set_visible(icon,FALSE); diff --git a/mediastreamer2 b/mediastreamer2 index 7c091db48..433c12a9e 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 7c091db48e2ac5b785ced3964a386ec51f695a60 +Subproject commit 433c12a9e32a9f0d9e510a85b978ea65dd9bb408