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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * gnome2.c : GNOME 2 plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: gnome2.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 <stdlib.h>                                      /* malloc(), free() */
  27. #include <errno.h>                                                 /* ENOMEM */
  28. #include <string.h>                                            /* strerror() */
  29. #include <stdio.h>
  30. #include <vlc/vlc.h>
  31. #include <vlc/intf.h>
  32. #include <gnome.h>
  33. #include "gnome2_interface.h"
  34. #include "gnome2_support.h"
  35. /*****************************************************************************
  36.  * Local prototypes.
  37.  *****************************************************************************/
  38. static int  Open         ( vlc_object_t * );
  39. static void Close        ( vlc_object_t * );
  40. static void Run          ( intf_thread_t * );
  41. static int  Manage       ( intf_thread_t * );
  42. /*****************************************************************************
  43.  * Module descriptor
  44.  *****************************************************************************/
  45. vlc_module_begin();
  46.     int i = getenv( "DISPLAY" ) == NULL ? 15 : 95;
  47.     set_description( _("Gtk2 interface") );
  48.     set_capability( "interface", i );
  49.     set_callbacks( Open, Close );
  50.     set_program( "gvlc" );
  51. vlc_module_end();
  52. /*****************************************************************************
  53.  * intf_sys_t
  54.  *****************************************************************************/
  55. struct intf_sys_t
  56. {
  57.     module_t *p_gui_helper;
  58.     GtkWidget *p_app;
  59. };
  60. /*****************************************************************************
  61.  * Open: initialize and create window
  62.  *****************************************************************************/
  63. static int Open( vlc_object_t *p_this )
  64. {
  65.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  66.     /* Allocate instance and initialize some members */
  67.     p_intf->p_sys = malloc( sizeof( intf_sys_t ) );
  68.     if( p_intf->p_sys == NULL )
  69.     {
  70.         msg_Err( p_intf, "out of memory" );
  71.         return VLC_ENOMEM;
  72.     }
  73. #ifdef NEED_GTK2_MAIN
  74.     p_intf->p_sys->p_gui_helper =
  75.         module_Need( p_this, "gui-helper", "gnome2", VLC_TRUE );
  76.     if( p_intf->p_sys->p_gui_helper == NULL )
  77.     {
  78.         free( p_intf->p_sys );
  79.         return VLC_ENOMOD;
  80.     }
  81. #endif
  82.     p_intf->pf_run = Run;
  83.     return VLC_SUCCESS;
  84. }
  85. /*****************************************************************************
  86.  * Close: destroy interface window
  87.  *****************************************************************************/
  88. static void Close( vlc_object_t *p_this )
  89. {
  90.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  91. #ifdef NEED_GTK2_MAIN
  92.     module_Unneed( p_intf, p_intf->p_sys->p_gui_helper );
  93. #endif
  94.     /* Destroy structure */
  95.     free( p_intf->p_sys );
  96. }
  97. /*****************************************************************************
  98.  * Run: Gtk+ thread
  99.  *****************************************************************************
  100.  * this part of the interface is in a separate thread so that we can call
  101.  * gtk_main() from within it without annoying the rest of the program.
  102.  *****************************************************************************/
  103. static void Run( intf_thread_t *p_intf )
  104. {
  105. #ifdef NEED_GTK2_MAIN
  106.     gdk_threads_enter();
  107. #else
  108.     /* gnome_program_init needs to know the command line. We don't care, so
  109.      * we give it an empty one */
  110.     char  *p_args[] = { "", NULL };
  111.     int    i_args   = 1;
  112.     int    i_dummy;
  113.     gtk_set_locale();
  114.     gnome_program_init( PACKAGE, VERSION, LIBGNOMEUI_MODULE,
  115.                         i_args, p_args,
  116.                         GNOME_PARAM_APP_DATADIR, "",//PACKAGE_DATA_DIR,
  117.                         NULL );
  118. #endif
  119.     /* Create some useful widgets that will certainly be used */
  120.     p_intf->p_sys->p_app = create_app1();
  121.     /* Set the title of the main window */
  122.     //gtk_window_set_title( GTK_WINDOW(p_intf->p_sys->p_app),
  123.     //                      VOUT_TITLE " (Gtk+ interface)" );
  124.     /* Show the control window */
  125.     gtk_widget_show( p_intf->p_sys->p_app );
  126. #ifdef NEED_GTK2_MAIN
  127.     while( !p_intf->b_die )
  128.     {
  129.         Manage( p_intf );
  130.         /* Sleep to avoid using all CPU - since some interfaces need to
  131.          * access keyboard events, a 100ms delay is a good compromise */
  132.         gdk_threads_leave();
  133.         msleep( INTF_IDLE_SLEEP );
  134.         gdk_threads_enter();
  135.     }
  136. #else
  137.     /* Sleep to avoid using all CPU - since some interfaces needs to access
  138.      * keyboard events, a 100ms delay is a good compromise */
  139.     i_dummy = gtk_timeout_add( INTF_IDLE_SLEEP / 1000, (GtkFunction)Manage,
  140.                                p_intf );
  141.     /* Enter Gtk mode */
  142.     gtk_main();
  143.     /* Remove the timeout */
  144.     gtk_timeout_remove( i_dummy );
  145. #endif
  146.     gtk_object_destroy( GTK_OBJECT(p_intf->p_sys->p_app) );
  147. #ifdef NEED_GTK2_MAIN
  148.     gdk_threads_leave();
  149. #endif
  150. }
  151. /* following functions are local */
  152. /*****************************************************************************
  153.  * Manage: manage main thread messages
  154.  *****************************************************************************
  155.  * In this function, called approx. 10 times a second, we check what the
  156.  * main program wanted to tell us.
  157.  *****************************************************************************/
  158. static int Manage( intf_thread_t *p_intf )
  159. {
  160. #ifndef NEED_GTK2_MAIN
  161.     if( p_intf->b_die )
  162.     {
  163.         gtk_main_quit();
  164.         return FALSE;
  165.     }
  166. #endif
  167.     return TRUE;
  168. }