+ var_SetInteger( p_input, "spu-es", list.p_list->p_values[i].i_int );
+ var_SetInteger( p_input, "spu-choice", list.p_list->p_values[i].i_int );
+ DisplayMessage( p_vout, _("Subtitle track: %s"),
+ list2.p_list->p_values[i].psz_string );
+ var_FreeList( &list, &list2 );
+ }
+ break;
+ case ACTIONID_SUBTITLE_TOGGLE:
+ if( p_input )
+ {
+ vlc_value_t list, list2;
+ int i_count, i_sel_index, i_sel_id, i_old_id, i_new_index;
+ i_old_id = var_GetInteger( p_input, "spu-es" );
+ i_sel_id = var_GetInteger( p_input, "spu-choice" );
+
+ var_Change( p_input, "spu-es", VLC_VAR_GETCHOICES,
+ &list, &list2 );
+ i_count = list.p_list->i_count;
+ if( i_count <= 1 )
+ {
+ DisplayMessage( p_vout, _("Subtitle track: %s"),
+ _("N/A") );
+ var_FreeList( &list, &list2 );
+ break;
+ }
+ for( i_sel_index = 0; i_sel_index < i_count; i_sel_index++ )
+ {
+ if( i_sel_id == list.p_list->p_values[i_sel_index].i_int )
+ {
+ break;
+ }
+ }
+ /* if there is nothing to toggle choose the first track */
+ if( !i_sel_index ) {
+ i_sel_index = 1;
+ i_sel_id = list.p_list->p_values[1].i_int;
+ var_SetInteger( p_input, "spu-choice", i_sel_id );
+ }
+
+ i_new_index = 0;
+ if( i_old_id != i_sel_id )
+ {
+ if( i_sel_index >= i_count )
+ {
+ var_SetInteger( p_input, "spu-choice", list.p_list->p_values[0].i_int );
+ }
+ else
+ {
+ i_new_index = i_sel_index;
+ }
+ }
+ var_SetInteger( p_input, "spu-es", list.p_list->p_values[i_new_index].i_int );
+ DisplayMessage( p_vout, _("Subtitle track: %s"),
+ list2.p_list->p_values[i_new_index].psz_string );
+ var_FreeList( &list, &list2 );
+ }
+ break;
+ case ACTIONID_PROGRAM_SID_NEXT:
+ case ACTIONID_PROGRAM_SID_PREV:
+ if( p_input )
+ {
+ vlc_value_t val, list, list2;
+ int i_count, i;
+ var_Get( p_input, "program", &val );
+
+ var_Change( p_input, "program", VLC_VAR_GETCHOICES,
+ &list, &list2 );
+ i_count = list.p_list->i_count;
+ if( i_count <= 1 )
+ {
+ DisplayMessage( p_vout, _("Program Service ID: %s"),
+ _("N/A") );
+ var_FreeList( &list, &list2 );
+ break;
+ }
+ for( i = 0; i < i_count; i++ )
+ {
+ if( val.i_int == list.p_list->p_values[i].i_int )
+ {
+ break;
+ }
+ }
+ /* value of program sid was not in choices list */
+ if( i == i_count )
+ {
+ msg_Warn( p_input,
+ "invalid current program SID, selecting 0" );
+ i = 0;
+ }
+ else if( i_action == ACTIONID_PROGRAM_SID_NEXT ) {
+ if( i == i_count - 1 )
+ i = 0;
+ else
+ i++;
+ }
+ else { /* ACTIONID_PROGRAM_SID_PREV */
+ if( i == 0 )
+ i = i_count - 1;
+ else
+ i--;
+ }
+ var_Set( p_input, "program", list.p_list->p_values[i] );
+ DisplayMessage( p_vout, _("Program Service ID: %s"),
+ list2.p_list->p_values[i].psz_string );
+ var_FreeList( &list, &list2 );
+ }
+ break;
+
+ case ACTIONID_JUMP_BACKWARD_EXTRASHORT:
+ case ACTIONID_JUMP_FORWARD_EXTRASHORT:
+ case ACTIONID_JUMP_BACKWARD_SHORT:
+ case ACTIONID_JUMP_FORWARD_SHORT:
+ case ACTIONID_JUMP_BACKWARD_MEDIUM:
+ case ACTIONID_JUMP_FORWARD_MEDIUM:
+ case ACTIONID_JUMP_BACKWARD_LONG:
+ case ACTIONID_JUMP_FORWARD_LONG:
+ {
+ if( p_input == NULL || !var_GetBool( p_input, "can-seek" ) )
+ break;
+
+ const char *varname;
+ int sign = +1;
+ switch( i_action )
+ {
+ case ACTIONID_JUMP_BACKWARD_EXTRASHORT:
+ sign = -1;
+ case ACTIONID_JUMP_FORWARD_EXTRASHORT:
+ varname = "extrashort-jump-size";
+ break;
+ case ACTIONID_JUMP_BACKWARD_SHORT:
+ sign = -1;
+ case ACTIONID_JUMP_FORWARD_SHORT:
+ varname = "short-jump-size";
+ break;
+ case ACTIONID_JUMP_BACKWARD_MEDIUM:
+ sign = -1;
+ case ACTIONID_JUMP_FORWARD_MEDIUM:
+ varname = "medium-jump-size";
+ break;
+ case ACTIONID_JUMP_BACKWARD_LONG:
+ sign = -1;
+ case ACTIONID_JUMP_FORWARD_LONG:
+ varname = "long-jump-size";
+ break;
+ }
+
+ mtime_t it = var_InheritInteger( p_input, varname );
+ if( it < 0 )
+ break;
+ var_SetTime( p_input, "time-offset", it * sign * CLOCK_FREQ );
+ DisplayPosition( p_intf, p_vout, p_input );
+ break;
+ }
+
+ /* Input navigation */
+ case ACTIONID_TITLE_PREV:
+ if( p_input )
+ var_TriggerCallback( p_input, "prev-title" );
+ break;
+ case ACTIONID_TITLE_NEXT:
+ if( p_input )
+ var_TriggerCallback( p_input, "next-title" );
+ break;
+ case ACTIONID_CHAPTER_PREV:
+ if( p_input )
+ var_TriggerCallback( p_input, "prev-chapter" );
+ break;
+ case ACTIONID_CHAPTER_NEXT:
+ if( p_input )
+ var_TriggerCallback( p_input, "next-chapter" );
+ break;
+ case ACTIONID_DISC_MENU:
+ if( p_input )
+ var_SetInteger( p_input, "title 0", 2 );
+ break;
+ case ACTIONID_NAV_ACTIVATE:
+ case ACTIONID_NAV_UP:
+ case ACTIONID_NAV_DOWN:
+ case ACTIONID_NAV_LEFT:
+ case ACTIONID_NAV_RIGHT:
+ if( p_input )
+ input_Control( p_input, i_action - ACTIONID_NAV_ACTIVATE
+ + INPUT_NAV_ACTIVATE, NULL );
+ break;
+
+ /* Video Output actions */
+ case ACTIONID_SNAPSHOT:
+ if( p_vout )
+ var_TriggerCallback( p_vout, "video-snapshot" );
+ break;
+
+ case ACTIONID_TOGGLE_FULLSCREEN:
+ {
+ if( p_vout )
+ {
+ bool fs = var_ToggleBool( p_vout, "fullscreen" );
+ var_SetBool( p_playlist, "fullscreen", fs );