/***************************************************************************** * InterfaceWindow::UpdateInterface *****************************************************************************/ void InterfaceWindow::UpdateInterface() { if( !p_input ) { p_input = (input_thread_t *) vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); } else if( p_input->b_dead ) { vlc_object_release( p_input ); p_input = NULL; } /* Get ready to update the interface */ if( LockWithTimeout( INTERFACE_LOCKING_TIMEOUT ) != B_OK ) { return; } if( b_playlist_update ) { #if 0 if( fPlaylistWindow->Lock() ) { fPlaylistWindow->UpdatePlaylist( true ); fPlaylistWindow->Unlock(); b_playlist_update = false; } #endif p_mediaControl->SetEnabled( !playlist_IsEmpty( p_playlist ) ); } if( p_input ) { vlc_value_t val; p_mediaControl->SetEnabled( true ); bool hasTitles = !var_Get( p_input, "title", &val ); bool hasChapters = !var_Get( p_input, "chapter", &val ); p_mediaControl->SetStatus( var_GetInteger( p_input, "state" ), var_GetInteger( p_input, "rate" ) ); var_Get( p_input, "position", &val ); p_mediaControl->SetProgress( val.f_float ); _SetMenusEnabled( true, hasChapters, hasTitles ); _UpdateSpeedMenu( var_GetInteger( p_input, "rate" ) ); // enable/disable skip buttons #if 0 bool canSkipPrev; bool canSkipNext; p_wrapper->GetNavCapabilities( &canSkipPrev, &canSkipNext ); p_mediaControl->SetSkippable( canSkipPrev, canSkipNext ); #endif audio_volume_t i_volume; aout_VolumeGet( p_intf, &i_volume ); p_mediaControl->SetAudioEnabled( true ); p_mediaControl->SetMuted( i_volume ); } else { p_mediaControl->SetAudioEnabled( false ); _SetMenusEnabled( false ); if( !playlist_IsEmpty( p_playlist ) ) { p_mediaControl->SetProgress( 0 ); #if 0 // enable/disable skip buttons bool canSkipPrev; bool canSkipNext; p_wrapper->GetNavCapabilities( &canSkipPrev, &canSkipNext ); p_mediaControl->SetSkippable( canSkipPrev, canSkipNext ); #endif } else { p_mediaControl->SetEnabled( false ); } } Unlock(); fLastUpdateTime = system_time(); }
/***************************************************************************** * Run: xosd thread ***************************************************************************** * This part of the interface runs in a separate thread *****************************************************************************/ static void Run( intf_thread_t *p_intf ) { playlist_t *p_playlist; playlist_item_t *p_item = NULL; char *psz_display = NULL; int cancel = vlc_savecancel(); while( true ) { // Wait for a signal vlc_restorecancel( cancel ); vlc_mutex_lock( &p_intf->p_sys->lock ); mutex_cleanup_push( &p_intf->p_sys->lock ); while( !p_intf->p_sys->b_need_update ) vlc_cond_wait( &p_intf->p_sys->cond, &p_intf->p_sys->lock ); p_intf->p_sys->b_need_update = false; vlc_cleanup_run(); // Compute the signal cancel = vlc_savecancel(); p_playlist = pl_Hold( p_intf ); PL_LOCK; // If the playlist is empty don't do anything if( playlist_IsEmpty( p_playlist ) ) { PL_UNLOCK; pl_Release( p_intf ); continue; } free( psz_display ); int i_status = playlist_Status( p_playlist ); if( i_status == PLAYLIST_STOPPED ) { psz_display = strdup(_("Stop")); } else if( i_status == PLAYLIST_PAUSED ) { psz_display = strdup(_("Pause")); } else { p_item = playlist_CurrentPlayingItem( p_playlist ); if( !p_item ) { psz_display = NULL; PL_UNLOCK; pl_Release( p_intf ); continue; } input_item_t *p_input = p_item->p_input; mtime_t i_duration = input_item_GetDuration( p_input ); if( i_duration != -1 ) { char psz_durationstr[MSTRTIME_MAX_SIZE]; secstotimestr( psz_durationstr, i_duration / 1000000 ); if( asprintf( &psz_display, "%s (%s)", p_input->psz_name, psz_durationstr ) == -1 ) psz_display = NULL; } else psz_display = strdup( p_input->psz_name ); } PL_UNLOCK; pl_Release( p_intf ); /* Display */ xosd_display( p_intf->p_sys->p_osd, 0, /* first line */ XOSD_string, psz_display ); } }
void PopupMenu( intf_thread_t *p_intf, HWND p_parent, POINT point ) { #define MAX_POPUP_ITEMS 45 vlc_object_t *p_object, *p_input; char *ppsz_varnames[MAX_POPUP_ITEMS]; vlc_object_t * pi_objects[MAX_POPUP_ITEMS]; int i = 0, i_last_separator = 0; /* Initializations */ memset( pi_objects, 0, MAX_POPUP_ITEMS * sizeof(vlc_object_t *) ); ppsz_varnames[i] = "VLC media player"; pi_objects[i++] = 0; ppsz_varnames[i++] = NULL; /* Separator */ i_last_separator = i; /* Input menu */ p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); if( p_object != NULL ) { ppsz_varnames[i] = "bookmark"; pi_objects[i++] = p_object; ppsz_varnames[i] = "title"; pi_objects[i++] = p_object; ppsz_varnames[i] = "chapter"; pi_objects[i++] = p_object; ppsz_varnames[i] = "program"; pi_objects[i++] = p_object; ppsz_varnames[i] = "navigation"; pi_objects[i++] = p_object; ppsz_varnames[i] = "dvd_menus"; pi_objects[i++] = p_object; ppsz_varnames[i] = "video-es"; pi_objects[i++] = p_object; ppsz_varnames[i] = "audio-es"; pi_objects[i++] = p_object; ppsz_varnames[i] = "spu-es"; pi_objects[i++] = p_object; } p_input = p_object; if( !p_input ) goto interfacemenu; /* Video menu */ if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */ i_last_separator = i; p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_object != NULL ) { vlc_object_t *p_dec_obj; ppsz_varnames[i] = "fullscreen"; pi_objects[i++] = p_object; ppsz_varnames[i] = "zoom"; pi_objects[i++] = p_object; ppsz_varnames[i] = "deinterlace-mode"; pi_objects[i++] = p_object; ppsz_varnames[i] = "aspect-ratio"; pi_objects[i++] = p_object; ppsz_varnames[i] = "crop"; pi_objects[i++] = p_object; ppsz_varnames[i] = "video-on-top"; pi_objects[i++] = p_object; ppsz_varnames[i] = "directx-wallpaper"; pi_objects[i++] = p_object; ppsz_varnames[i] = "video-snapshot"; pi_objects[i++] = p_object; p_dec_obj = (vlc_object_t *)vlc_object_find( p_object, VLC_OBJECT_DECODER, FIND_PARENT ); if( p_dec_obj != NULL ) { ppsz_varnames[i] = "ffmpeg-pp-q"; pi_objects[i++] = p_dec_obj; vlc_object_release( p_dec_obj ); } vlc_object_release( p_object ); } /* Audio menu */ if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */ i_last_separator = i; p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); if( p_object != NULL ) { ppsz_varnames[i] = "audio-device"; pi_objects[i++] = p_object; ppsz_varnames[i] = "audio-channels"; pi_objects[i++] = p_object; ppsz_varnames[i] = "visual"; pi_objects[i++] = p_object; ppsz_varnames[i] = "equalizer"; pi_objects[i++] = p_object; vlc_object_release( p_object ); } interfacemenu: /* Interface menu */ if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */ i_last_separator = i; /* Build menu */ vector<MenuItemExt*> popup_menu; HMENU hmenu = CreatePopupMenu(); RefreshMenu( p_intf, &popup_menu, hmenu, i, ppsz_varnames, pi_objects, PopupMenu_Events ); MenuItemExt::ClearList( &popup_menu ); /* Add static entries */ if( p_input != NULL ) { vlc_value_t val; AppendMenu( hmenu, MF_SEPARATOR, 0, _T("") ); AppendMenu( hmenu, MF_STRING, StopStream_Event, _T("Stop") ); AppendMenu( hmenu, MF_STRING, PrevStream_Event, _T("Previous") ); AppendMenu( hmenu, MF_STRING, NextStream_Event, _T("Next") ); var_Get( p_input, "state", &val ); if( val.i_int == PAUSE_S ) AppendMenu( hmenu, MF_STRING, PlayStream_Event, _T("Play") ); else AppendMenu( hmenu, MF_STRING, PlayStream_Event, _T("Pause") ); vlc_object_release( p_input ); } else { playlist_t * p_playlist = pl_Hold( p_intf ); if( p_playlist && !playlist_IsEmpty( p_playlist ) ) { AppendMenu( hmenu, MF_SEPARATOR, 0, _T("") ); AppendMenu( hmenu, MF_STRING, PlayStream_Event, _T("Play") ); } if( p_playlist ) pl_Release( p_intf ); } AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)MiscMenu( p_intf ), _T("Miscellaneous") ); AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)OpenStreamMenu( p_intf ), _T("Open") ); TrackPopupMenu( hmenu, 0, point.x, point.y, 0, p_parent, 0 ); PostMessage( p_parent, WM_NULL, 0, 0 ); DestroyMenu( hmenu ); }