+/*****************************************************************************
+ * GnomeTitleMenu: sets menus for titles and chapters selection
+ *****************************************************************************
+ * Generates two types of menus:
+ * -simple list of titles
+ * -cascaded lists of chapters for each title
+ *****************************************************************************/
+static gint GnomeTitleMenu( gpointer p_data,
+ GtkWidget * p_navigation,
+ void(*pf_toggle )( GtkCheckMenuItem *, gpointer ) )
+{
+ intf_thread_t * p_intf;
+ char psz_name[10];
+ GtkWidget * p_title_menu;
+ GtkWidget * p_title_item;
+ GtkWidget * p_chapter_menu;
+ GtkWidget * p_item;
+ GSList * p_title_group;
+ GSList * p_chapter_group;
+ gint i_title;
+ gint i_chapter;
+ gint b_active;
+
+ /* cast */
+ p_intf = (intf_thread_t*)p_data;
+
+ p_title_menu = gtk_menu_new();
+ p_title_group = NULL;
+ p_chapter_group = NULL;
+
+ /* loop on titles */
+ for( i_title = 1 ;
+ i_title < p_intf->p_input->stream.i_area_nb ;
+ i_title++ )
+ {
+ b_active = ( p_intf->p_input->stream.pp_areas[i_title] ==
+ p_intf->p_input->stream.p_selected_area ) ? 1 : 0;
+ sprintf( psz_name, "Title %d", i_title );
+
+ p_title_item = gtk_radio_menu_item_new_with_label( p_title_group,
+ psz_name );
+ p_title_group =
+ gtk_radio_menu_item_group( GTK_RADIO_MENU_ITEM( p_title_item ) );
+ gtk_menu_append( GTK_MENU( p_title_menu ), p_title_item );
+ gtk_widget_show( p_title_item );
+
+
+
+ if( pf_toggle == on_menubar_title_toggle )
+ {
+
+ gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( p_title_item ),
+ b_active );
+ /* setup signal hanling */
+ gtk_signal_connect( GTK_OBJECT( p_title_item ),
+ "toggled",
+ GTK_SIGNAL_FUNC( pf_toggle ),
+ (gpointer)(p_intf->p_input->stream.pp_areas[i_title]) );
+ }
+ else
+ {
+ p_chapter_menu = gtk_menu_new();
+
+ for( i_chapter = 0;
+ i_chapter <
+ p_intf->p_input->stream.pp_areas[i_title]->i_part_nb ;
+ i_chapter++ )
+ {
+ b_active = ( p_intf->p_input->stream.pp_areas[i_title]->i_part
+ == i_chapter + 1 ) ? 1 : 0;
+
+ sprintf( psz_name, "Chapter %d", i_chapter + 1 );
+
+ p_item = gtk_radio_menu_item_new_with_label(
+ p_chapter_group, psz_name );
+ p_chapter_group = gtk_radio_menu_item_group(
+ GTK_RADIO_MENU_ITEM( p_item ) );
+ gtk_menu_append( GTK_MENU( p_chapter_menu ), p_item );
+ gtk_widget_show( p_item );
+ gtk_check_menu_item_set_active(
+ GTK_CHECK_MENU_ITEM( p_item ), b_active );
+
+ /* setup signal hanling */
+ gtk_signal_connect( GTK_OBJECT( p_item ),
+ "toggled",
+ GTK_SIGNAL_FUNC( pf_toggle ),
+ (gpointer)( ( i_title * 100 ) + ( i_chapter + 1) ) );
+ }
+
+ /* link the new menu to the title menu item */
+ gtk_menu_item_set_submenu( GTK_MENU_ITEM( p_title_item ),
+ p_chapter_menu );
+ }
+
+ /* be sure that chapter menu is sensitive */
+ gtk_widget_set_sensitive( p_title_menu, TRUE );
+
+ }
+
+ /* link the new menu to the menubar item */
+ gtk_menu_item_set_submenu( GTK_MENU_ITEM( p_navigation ), p_title_menu );
+
+ /* be sure that menu is sensitive */
+ gtk_widget_set_sensitive( p_navigation, TRUE );
+
+
+ return TRUE;
+}
+
+/*****************************************************************************
+ * GnomeSetupMenu: function that generates title/chapter/audio/subpic
+ * menus with help from preceding functions
+ *****************************************************************************/
+static gint GnomeSetupMenu( intf_thread_t * p_intf )
+{
+ es_descriptor_t * p_audio_es;
+ es_descriptor_t * p_spu_es;
+ GtkWidget * p_menubar_menu;
+ GtkWidget * p_popup_menu;
+ gint i;
+
+ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
+ p_intf->p_sys->p_window ), "menubar_title" ) );
+
+ GnomeTitleMenu( p_intf, p_menubar_menu, on_menubar_title_toggle );
+
+ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
+ p_intf->p_sys->p_window ), "menubar_chapter" ) );
+
+ GnomeChapterMenu( p_intf, p_menubar_menu, on_menubar_chapter_toggle );
+
+ p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
+ p_intf->p_sys->p_popup ), "popup_navigation" ) );
+
+ GnomeTitleMenu( p_intf, p_popup_menu, on_popup_navigation_toggle );
+
+ /* look for selected ES */
+ p_audio_es = NULL;
+ p_spu_es = NULL;
+
+ for( i = 0 ; i < p_intf->p_input->stream.i_selected_es_number ; i++ )
+ {
+ if( p_intf->p_input->stream.pp_es[i]->b_audio )
+ {
+ p_audio_es = p_intf->p_input->stream.pp_es[i];
+ }
+
+ if( p_intf->p_input->stream.pp_es[i]->b_spu )
+ {
+ p_spu_es = p_intf->p_input->stream.pp_es[i];
+ }
+ }
+
+ /* audio menus */
+
+ /* find audio root menu */
+ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
+ p_intf->p_sys->p_window ), "menubar_audio" ) );
+
+ p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
+ p_intf->p_sys->p_popup ), "popup_audio" ) );
+
+ GnomeLanguageMenus( p_intf, p_menubar_menu, p_audio_es, 1,
+ on_menubar_audio_toggle );
+ GnomeLanguageMenus( p_intf, p_popup_menu, p_audio_es, 1,
+ on_popup_audio_toggle );
+
+ /* sub picture menus */
+
+ /* find spu root menu */
+ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
+ p_intf->p_sys->p_window ), "menubar_subtitle" ) );
+
+ p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
+ p_intf->p_sys->p_popup ), "popup_subtitle" ) );
+
+ GnomeLanguageMenus( p_intf, p_menubar_menu, p_spu_es, 2,
+ on_menubar_subtitle_toggle );
+ GnomeLanguageMenus( p_intf, p_popup_menu, p_spu_es, 2,
+ on_popup_subtitle_toggle );
+
+ /* everything is ready */
+ p_intf->p_sys->b_menus_update = 0;
+
+ return TRUE;
+}
+
+/*****************************************************************************
+ * GnomeDisplayDate: display stream date
+ *****************************************************************************
+ * This function displays the current date related to the position in
+ * the stream. It is called whenever the slider changes its value.
+ *****************************************************************************/
+void GnomeDisplayDate( GtkAdjustment *p_adj )
+{
+ intf_thread_t *p_intf;
+
+ p_intf = gtk_object_get_data( GTK_OBJECT( p_adj ), "p_intf" );
+
+ if( p_intf->p_input != NULL )
+ {
+#define p_area p_intf->p_input->stream.p_selected_area
+ char psz_time[ OFFSETTOTIME_MAX_SIZE ];
+
+ vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
+
+ gtk_label_set_text( p_intf->p_sys->p_label_date,
+ input_OffsetToTime( p_intf->p_input, psz_time,
+ ( p_area->i_size * p_adj->value ) / 100 ) );
+
+ vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
+#undef p_area
+ }
+}
+
+