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

多媒体

开发平台:

MultiPlatform

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