gtk_main.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * gtk_main.c : Gtk+ wrapper for gtk_main
  3.  *****************************************************************************
  4.  * Copyright (C) 2002 the VideoLAN team
  5.  * $Id: b127e5a8f69c0e08adefb645f867b7c7a42bdc14 $
  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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #ifdef HAVE_CONFIG_H
  27. # include "config.h"
  28. #endif
  29. #include <vlc_common.h>
  30. #include <vlc_plugin.h>
  31. #include <gtk/gtk.h>
  32. #if defined(MODULE_NAME_IS_gtk2_main)
  33. #   include <glib.h>
  34. #endif
  35. #if defined(MODULE_NAME_IS_gnome_main) || defined(MODULE_NAME_IS_gnome2_main)
  36. #   include <gnome.h>
  37. #endif
  38. /*****************************************************************************
  39.  * Local prototypes.
  40.  *****************************************************************************/
  41. static int  Open    ( vlc_object_t * );
  42. static void Close   ( vlc_object_t * );
  43. static void* GtkMain ( vlc_object_t * );
  44. /*****************************************************************************
  45.  * Local variables (mutex-protected).
  46.  *****************************************************************************/
  47. static int            i_refcount = 0;
  48. static vlc_object_t * p_gtk_main = NULL;
  49. /*****************************************************************************
  50.  * Module descriptor
  51.  *****************************************************************************/
  52. vlc_module_begin ()
  53.     int i_cap;
  54.     set_description( N_("Gtk+ GUI helper") )
  55. #if defined(MODULE_NAME_IS_gtk_main)
  56.     i_cap = 90;
  57.     add_shortcut( "gtk" )
  58. #elif defined(MODULE_NAME_IS_gnome_main)
  59.     i_cap = 100;
  60.     add_shortcut( "gtk" )
  61.     add_shortcut( "gnome" )
  62. #elif defined(MODULE_NAME_IS_gtk2_main)
  63.     i_cap = 95;
  64.     add_shortcut( "gtk2" )
  65. #elif defined(MODULE_NAME_IS_gnome2_main)
  66.     i_cap = 105;
  67.     add_shortcut( "gtk2" )
  68.     add_shortcut( "gnome2" )
  69. #endif
  70.     set_capability( "gui-helper", i_cap )
  71.     set_callbacks( Open, Close )
  72.     linked_with_a_crap_library_which_uses_atexit ()
  73. vlc_module_end ()
  74. static vlc_mutex_t gtk_lock = VLC_STATIC_MUTEX;
  75. /*****************************************************************************
  76.  * Open: initialize and create window
  77.  *****************************************************************************/
  78. static int Open( vlc_object_t *p_this )
  79. {
  80.     vlc_mutex_lock( &gtk_lock );
  81.     if( i_refcount > 0 )
  82.     {
  83.         i_refcount++;
  84.         vlc_mutex_unlock( &gtk_lock );
  85.         return VLC_SUCCESS;
  86.     }
  87.     p_gtk_main = vlc_object_create( p_this, sizeof( vlc_object_t ) );
  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 ) )
  97.     {
  98.         vlc_object_release( p_gtk_main );
  99.         i_refcount--;
  100.         vlc_mutex_unlock( &gtk_lock );
  101.         return VLC_ETHREAD;
  102.     }
  103.     i_refcount++;
  104.     vlc_mutex_unlock( &gtk_lock );
  105.     return VLC_SUCCESS;
  106. }
  107. /*****************************************************************************
  108.  * Close: destroy interface window
  109.  *****************************************************************************/
  110. static void Close( vlc_object_t *p_this )
  111. {
  112.     vlc_mutex_lock( &gtk_lock );
  113.     i_refcount--;
  114.     if( --i_refcount == 0 )
  115.     {
  116.         gtk_main_quit();
  117.         vlc_thread_join( p_gtk_main );
  118.         vlc_object_release( p_gtk_main );
  119.         p_gtk_main = NULL;
  120.     }
  121.     vlc_mutex_unlock( &gtk_lock );
  122. }
  123. static gint foo( gpointer bar ) { return TRUE; }
  124. /*****************************************************************************
  125.  * GtkMain: Gtk+ thread
  126.  *****************************************************************************
  127.  * this part of the interface is in a separate thread so that we can call
  128.  * gtk_main() from within it without annoying the rest of the program.
  129.  *****************************************************************************/
  130. static void* GtkMain( vlc_object_t *p_this )
  131. {
  132.     /* gtk_init needs to know the command line. We don't care, so we
  133.      * give it an empty one */
  134.     static char  *p_args[] = { "", NULL };
  135. #if defined(MODULE_NAME_IS_gtk_main) || defined(MODULE_NAME_IS_gtk2_main)
  136.     static char **pp_args  = p_args;
  137. #endif
  138.     static int    i_args   = 1;
  139.     int canc = vlc_savecancel ();
  140.     /* FIXME: deprecated ? */
  141. #if defined(MODULE_NAME_IS_gtk2_main) || defined(MODULE_NAME_IS_gnome2_main)
  142.     gdk_threads_init();
  143. #endif
  144. #if defined(MODULE_NAME_IS_gnome_main)
  145.     gnome_init( p_this->p_libvlc->psz_object_name, VERSION, i_args, p_args );
  146. #elif defined(MODULE_NAME_IS_gnome2_main)
  147.     gnome_program_init( PACKAGE, VERSION, LIBGNOMEUI_MODULE,
  148.                         i_args, p_args,
  149.                         GNOME_PARAM_APP_DATADIR, "",//PACKAGE_DATA_DIR,
  150.                         NULL );
  151. #else
  152.     gtk_set_locale();
  153.     gtk_init( &i_args, &pp_args );
  154. #endif
  155.     gdk_threads_enter();
  156.     vlc_thread_ready( p_this );
  157.     /* If we don't add this simple timeout, gtk_main remains stuck if
  158.      * we try to close the window without having sent any gtk event. */
  159.     gtk_timeout_add( INTF_IDLE_SLEEP / 1000, foo, p_this );
  160.     /* Enter Gtk mode */
  161.     gtk_main();
  162.     gdk_threads_leave();
  163.     vlc_restorecancel (canc);
  164.     return NULL;
  165. }