gtk_main.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:7k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * gtk_main.c : Gtk+ wrapper for gtk_main
  3.  *****************************************************************************
  4.  * Copyright (C) 2002 VideoLAN
  5.  * $Id: gtk_main.c 6961 2004-03-05 17:34:23Z sam $
  6.  *
  7.  * Authors: Samuel Hocevar <sam@zoy.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <vlc/vlc.h>
  27. #include <stdlib.h>                                              /* atexit() */
  28. #include <gtk/gtk.h>
  29. #if defined(MODULE_NAME_IS_gtk2_main)
  30. #   include <glib.h>
  31. #endif
  32. #if defined(MODULE_NAME_IS_gnome_main) || defined(MODULE_NAME_IS_gnome2_main)
  33. #   include <gnome.h>
  34. #endif
  35. /*****************************************************************************
  36.  * Local prototypes.
  37.  *****************************************************************************/
  38. static int  Open    ( vlc_object_t * );
  39. static void Close   ( vlc_object_t * );
  40. static void GtkMain ( vlc_object_t * );
  41. /*****************************************************************************
  42.  * Local variables (mutex-protected).
  43.  *****************************************************************************/
  44. static int            i_refcount = 0;
  45. static vlc_object_t * p_gtk_main = NULL;
  46. /*****************************************************************************
  47.  * Module descriptor
  48.  *****************************************************************************/
  49. vlc_module_begin();
  50.     int i_cap;
  51.     set_description( _("Gtk+ GUI helper") );
  52. #if defined(MODULE_NAME_IS_gtk_main)
  53.     i_cap = 90;
  54.     add_shortcut( "gtk" );
  55. #elif defined(MODULE_NAME_IS_gnome_main)
  56.     i_cap = 100;
  57.     add_shortcut( "gtk" );
  58.     add_shortcut( "gnome" );
  59. #elif defined(MODULE_NAME_IS_gtk2_main)
  60.     i_cap = 95;
  61.     add_shortcut( "gtk2" );
  62. #elif defined(MODULE_NAME_IS_gnome2_main)
  63.     i_cap = 105;
  64.     add_shortcut( "gtk2" );
  65.     add_shortcut( "gnome2" );
  66. #endif
  67.     set_capability( "gui-helper", i_cap );
  68.     set_callbacks( Open, Close );
  69.     linked_with_a_crap_library_which_uses_atexit();
  70. vlc_module_end();
  71. /*****************************************************************************
  72.  * Open: initialize and create window
  73.  *****************************************************************************/
  74. static int Open( vlc_object_t *p_this )
  75. {
  76.     vlc_value_t lockval;
  77.     /* FIXME: put this in the module (de)initialization ASAP */
  78.     var_Create( p_this->p_libvlc, "gtk", VLC_VAR_MUTEX );
  79.     var_Get( p_this->p_libvlc, "gtk", &lockval );
  80.     vlc_mutex_lock( lockval.p_address );
  81.     if( i_refcount > 0 )
  82.     {
  83.         i_refcount++;
  84.         vlc_mutex_unlock( lockval.p_address );
  85.         return VLC_SUCCESS;
  86.     }
  87.     p_gtk_main = vlc_object_create( p_this, VLC_OBJECT_GENERIC );
  88.     /* Only initialize gthreads if it's the first time we do it */
  89.     if( !g_thread_supported() )
  90.     {
  91.         g_thread_init( NULL );
  92.     }
  93.     /* Launch the gtk_main() thread. It will not return until it has
  94.      * called gdk_threads_enter(), which ensures us thread safety. */
  95.     if( vlc_thread_create( p_gtk_main, "gtk_main", GtkMain,
  96.                            VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) )
  97.     {
  98.         vlc_object_destroy( p_gtk_main );
  99.         i_refcount--;
  100.         vlc_mutex_unlock( lockval.p_address );
  101.         var_Destroy( p_this->p_libvlc, "gtk" );
  102.         return VLC_ETHREAD;
  103.     }
  104.     i_refcount++;
  105.     vlc_mutex_unlock( lockval.p_address );
  106.     return VLC_SUCCESS;
  107. }
  108. /*****************************************************************************
  109.  * Close: destroy interface window
  110.  *****************************************************************************/
  111. static void Close( vlc_object_t *p_this )
  112. {
  113.     vlc_value_t lockval;
  114.     var_Get( p_this->p_libvlc, "gtk", &lockval );
  115.     vlc_mutex_lock( lockval.p_address );
  116.     i_refcount--;
  117.     if( i_refcount > 0 )
  118.     {
  119.         vlc_mutex_unlock( lockval.p_address );
  120.         var_Destroy( p_this->p_libvlc, "gtk" );
  121.         return;
  122.     }
  123.     gtk_main_quit();
  124.     vlc_thread_join( p_gtk_main );
  125.     vlc_object_destroy( p_gtk_main );
  126.     p_gtk_main = NULL;
  127.     vlc_mutex_unlock( lockval.p_address );
  128.     var_Destroy( p_this->p_libvlc, "gtk" );
  129. }
  130. static gint foo( gpointer bar ) { return TRUE; }
  131. /*****************************************************************************
  132.  * GtkMain: Gtk+ thread
  133.  *****************************************************************************
  134.  * this part of the interface is in a separate thread so that we can call
  135.  * gtk_main() from within it without annoying the rest of the program.
  136.  *****************************************************************************/
  137. static void GtkMain( vlc_object_t *p_this )
  138. {
  139.     /* gtk_init needs to know the command line. We don't care, so we
  140.      * give it an empty one */
  141.     static char  *p_args[] = { "", NULL };
  142. #if defined(MODULE_NAME_IS_gtk_main) || defined(MODULE_NAME_IS_gtk2_main)
  143.     static char **pp_args  = p_args;
  144. #endif
  145.     static int    i_args   = 1;
  146.     /* FIXME: deprecated ? */
  147. #if defined(MODULE_NAME_IS_gtk2_main) || defined(MODULE_NAME_IS_gnome2_main)
  148.     gdk_threads_init();
  149. #endif
  150. #if defined(MODULE_NAME_IS_gnome_main)
  151.     gnome_init( p_this->p_vlc->psz_object_name, VERSION, i_args, p_args );
  152. #elif defined(MODULE_NAME_IS_gnome2_main)
  153.     gnome_program_init( PACKAGE, VERSION, LIBGNOMEUI_MODULE,
  154.                         i_args, p_args,
  155.                         GNOME_PARAM_APP_DATADIR, "",//PACKAGE_DATA_DIR,
  156.                         NULL );
  157. #else
  158.     gtk_set_locale();
  159.     gtk_init( &i_args, &pp_args );
  160. #endif
  161.     gdk_threads_enter();
  162.     vlc_thread_ready( p_this );
  163.     /* If we don't add this simple timeout, gtk_main remains stuck if
  164.      * we try to close the window without having sent any gtk event. */
  165.     gtk_timeout_add( INTF_IDLE_SLEEP / 1000, foo, p_this );
  166.     /* Enter Gtk mode */
  167.     gtk_main();
  168.     gdk_threads_leave();
  169. }