X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Fgtk_main.c;h=c5b0d98069411954353fa0500ad4620ed59ffc70;hb=b751665aa8f78719eb3e4fe30545fffd5c423948;hp=a2132641f3b8ce3ac63fcdfd531083c3860af382;hpb=a5a565cb0b6d5b361d680928446b7a3c3dd0b26a;p=vlc diff --git a/modules/misc/gtk_main.c b/modules/misc/gtk_main.c index a2132641f3..c5b0d98069 100644 --- a/modules/misc/gtk_main.c +++ b/modules/misc/gtk_main.c @@ -1,8 +1,8 @@ /***************************************************************************** * gtk_main.c : Gtk+ wrapper for gtk_main ***************************************************************************** - * Copyright (C) 2002 VideoLAN - * $Id: gtk_main.c,v 1.3 2002/08/21 15:55:15 sam Exp $ + * Copyright (C) 2002 the VideoLAN team + * $Id$ * * Authors: Samuel Hocevar * @@ -10,7 +10,7 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -18,19 +18,27 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include -#include /* atexit() */ #include -#ifdef HAVE_GNOME_H +#if defined(MODULE_NAME_IS_gtk2_main) +# include +#endif + +#if defined(MODULE_NAME_IS_gnome_main) || defined(MODULE_NAME_IS_gnome2_main) # include #endif @@ -42,104 +50,56 @@ static void Close ( vlc_object_t * ); static void GtkMain ( vlc_object_t * ); -/***************************************************************************** - * The gtk_main_t object. - *****************************************************************************/ -#define MAX_ATEXIT 10 - -typedef struct gtk_main_t -{ - VLC_COMMON_MEMBERS - - /* XXX: Ugly kludge, see g_atexit */ - void ( *pf_callback[MAX_ATEXIT] ) ( void ); - -} gtk_main_t; - /***************************************************************************** * Local variables (mutex-protected). *****************************************************************************/ -static void ** pp_global_data = NULL; -static int i_refcount = 0; -static gtk_main_t * p_gtk_main = NULL; +static int i_refcount = 0; +static vlc_object_t * p_gtk_main = NULL; /***************************************************************************** * Module descriptor *****************************************************************************/ vlc_module_begin(); - pp_global_data = p_module->p_vlc->pp_global_data; - set_description( _("Gtk+ helper module") ); - set_capability( "gtk_main", 100 ); + int i_cap; + set_description( N_("Gtk+ GUI helper") ); +#if defined(MODULE_NAME_IS_gtk_main) + i_cap = 90; + add_shortcut( "gtk" ); +#elif defined(MODULE_NAME_IS_gnome_main) + i_cap = 100; add_shortcut( "gtk" ); -#ifdef HAVE_GNOME_H add_shortcut( "gnome" ); +#elif defined(MODULE_NAME_IS_gtk2_main) + i_cap = 95; + add_shortcut( "gtk2" ); +#elif defined(MODULE_NAME_IS_gnome2_main) + i_cap = 105; + add_shortcut( "gtk2" ); + add_shortcut( "gnome2" ); #endif + set_capability( "gui-helper", i_cap ); set_callbacks( Open, Close ); + linked_with_a_crap_library_which_uses_atexit(); vlc_module_end(); -/***************************************************************************** - * g_atexit: kludge to avoid the Gtk+ thread to segfault at exit - ***************************************************************************** - * gtk_init() makes several calls to g_atexit() which calls atexit() to - * register tidying callbacks to be called at program exit. Since the Gtk+ - * plugin is likely to be unloaded at program exit, we have to export this - * symbol to intercept the g_atexit() calls. Talk about crude hack. - *****************************************************************************/ -void g_atexit( GVoidFunc func ) -{ - gtk_main_t *p_this; - - int i_dummy; - - if( pp_global_data == NULL ) - { - atexit( func ); - return; - } - - p_this = (gtk_main_t *)*pp_global_data; - if( p_this == NULL ) - { - /* Looks like this atexit() call wasn't for us. */ - return; - } - - for( i_dummy = 0; - i_dummy < MAX_ATEXIT && p_this->pf_callback[i_dummy] != NULL; - i_dummy++ ) - { - ; - } - - if( i_dummy >= MAX_ATEXIT - 1 ) - { - msg_Err( p_this, "too many atexit() callbacks to register" ); - return; - } - - p_this->pf_callback[i_dummy] = func; - p_this->pf_callback[i_dummy + 1] = NULL; -} - /***************************************************************************** * Open: initialize and create window *****************************************************************************/ static int Open( vlc_object_t *p_this ) { - /* Initialize Gtk+ */ + vlc_mutex_t *lock; - vlc_mutex_lock( p_this->p_vlc->p_global_lock ); + lock = var_AcquireMutex( "gtk" ); if( i_refcount > 0 ) { i_refcount++; - vlc_mutex_unlock( p_this->p_vlc->p_global_lock ); + vlc_mutex_unlock( lock ); return VLC_SUCCESS; } - p_gtk_main = vlc_object_create( p_this, sizeof(gtk_main_t) ); - p_gtk_main->pf_callback[0] = NULL; + p_gtk_main = vlc_object_create( p_this, sizeof( vlc_object_t ) ); /* Only initialize gthreads if it's the first time we do it */ if( !g_thread_supported() ) @@ -149,16 +109,17 @@ static int Open( vlc_object_t *p_this ) /* Launch the gtk_main() thread. It will not return until it has * called gdk_threads_enter(), which ensures us thread safety. */ - if( vlc_thread_create( p_gtk_main, "gtk_main", GtkMain, VLC_TRUE ) ) + if( vlc_thread_create( p_gtk_main, "gtk_main", GtkMain, + VLC_THREAD_PRIORITY_LOW, true ) ) { - vlc_object_destroy( p_gtk_main ); + vlc_object_release( p_gtk_main ); i_refcount--; - vlc_mutex_unlock( p_this->p_vlc->p_global_lock ); + vlc_mutex_unlock( lock ); return VLC_ETHREAD; } i_refcount++; - vlc_mutex_unlock( p_this->p_vlc->p_global_lock ); + vlc_mutex_unlock( lock ); return VLC_SUCCESS; } @@ -168,39 +129,28 @@ static int Open( vlc_object_t *p_this ) *****************************************************************************/ static void Close( vlc_object_t *p_this ) { - int i_dummy; + vlc_mutex_t *lock; - vlc_mutex_lock( p_this->p_vlc->p_global_lock ); + lock = var_AcquireMutex( "gtk" ); i_refcount--; if( i_refcount > 0 ) { - vlc_mutex_unlock( p_this->p_vlc->p_global_lock ); + vlc_mutex_unlock( lock ); return; } gtk_main_quit(); vlc_thread_join( p_gtk_main ); - /* Launch stored callbacks */ - for( i_dummy = 0; - i_dummy < MAX_ATEXIT && p_gtk_main->pf_callback[i_dummy] != NULL; - i_dummy++ ) - { - p_gtk_main->pf_callback[i_dummy](); - } - - vlc_object_destroy( p_gtk_main ); + vlc_object_release( p_gtk_main ); p_gtk_main = NULL; - vlc_mutex_unlock( p_this->p_vlc->p_global_lock ); + vlc_mutex_unlock( lock ); } -static gint foo(gpointer foo) -{ - return TRUE; -} +static gint foo( gpointer bar ) { return TRUE; } /***************************************************************************** * GtkMain: Gtk+ thread @@ -212,21 +162,24 @@ static void GtkMain( vlc_object_t *p_this ) { /* gtk_init needs to know the command line. We don't care, so we * give it an empty one */ - static char *p_args[] = { "" }; -#ifndef HAVE_GNOME_H + static char *p_args[] = { "", NULL }; +#if defined(MODULE_NAME_IS_gtk_main) || defined(MODULE_NAME_IS_gtk2_main) static char **pp_args = p_args; #endif static int i_args = 1; - /* gtk_init will register stuff with g_atexit, so we need to have - * the global lock if we want to be able to intercept the calls */ - *p_this->p_vlc->pp_global_data = p_gtk_main; - /* FIXME: deprecated ? */ - /* gdk_threads_init(); */ +#if defined(MODULE_NAME_IS_gtk2_main) || defined(MODULE_NAME_IS_gnome2_main) + gdk_threads_init(); +#endif -#ifdef HAVE_GNOME_H - gnome_init( p_this->p_vlc->psz_object_name, VERSION, i_args, p_args ); +#if defined(MODULE_NAME_IS_gnome_main) + gnome_init( p_this->p_libvlc->psz_object_name, VERSION, i_args, p_args ); +#elif defined(MODULE_NAME_IS_gnome2_main) + gnome_program_init( PACKAGE, VERSION, LIBGNOMEUI_MODULE, + i_args, p_args, + GNOME_PARAM_APP_DATADIR, "",//PACKAGE_DATA_DIR, + NULL ); #else gtk_set_locale(); gtk_init( &i_args, &pp_args ); @@ -236,7 +189,8 @@ static void GtkMain( vlc_object_t *p_this ) vlc_thread_ready( p_this ); - /* If we don't add this simple timeout, gtk_main remains stuck ... */ + /* If we don't add this simple timeout, gtk_main remains stuck if + * we try to close the window without having sent any gtk event. */ gtk_timeout_add( INTF_IDLE_SLEEP / 1000, foo, p_this ); /* Enter Gtk mode */ @@ -244,4 +198,3 @@ static void GtkMain( vlc_object_t *p_this ) gdk_threads_leave(); } -