- vlc_object_yield( p_input );
- InputAutoMenuBuilder( VLC_OBJECT(p_input), objects, varnames );
-
- /* Video menu */
- PUSH_SEPARATOR;
- varnames.push_back( "video-es" );
- objects.push_back( p_input->i_object_id );
- varnames.push_back( "spu-es" );
- objects.push_back( p_input->i_object_id );
- vlc_object_t *p_vout = (vlc_object_t *)vlc_object_find( p_input,
- VLC_OBJECT_VOUT, FIND_CHILD );
- if( p_vout )
- {
- VideoAutoMenuBuilder( p_vout, objects, varnames );
- vlc_object_release( p_vout );
- }
- /* Audio menu */
- PUSH_SEPARATOR
- varnames.push_back( "audio-es" );
- objects.push_back( p_input->i_object_id );
- vlc_object_t *p_aout = (vlc_object_t *)vlc_object_find( p_input,
- VLC_OBJECT_AOUT, FIND_ANYWHERE );
- if( p_aout )
- {
- AudioAutoMenuBuilder( p_aout, objects, varnames );
- vlc_object_release( p_aout );
- }
+ // create a popup if there is none
+ if( ! p_intf->p_sys->p_popup_menu )
+ {
+ POPUP_BOILERPLATE;
+ if( p_input )
+ {
+ vlc_object_yield( p_input );
+ InputAutoMenuBuilder( VLC_OBJECT(p_input), objects, varnames );
+
+ /* Video menu */
+ PUSH_SEPARATOR;
+ varnames.push_back( "video-es" );
+ objects.push_back( p_input->i_object_id );
+ varnames.push_back( "spu-es" );
+ objects.push_back( p_input->i_object_id );
+ vlc_object_t *p_vout = (vlc_object_t *)vlc_object_find( p_input,
+ VLC_OBJECT_VOUT, FIND_CHILD );
+ if( p_vout )
+ {
+ VideoAutoMenuBuilder( p_vout, objects, varnames );
+ vlc_object_release( p_vout );
+ }
+ /* Audio menu */
+ PUSH_SEPARATOR
+ varnames.push_back( "audio-es" );
+ objects.push_back( p_input->i_object_id );
+ vlc_object_t *p_aout = (vlc_object_t *)vlc_object_find( p_input,
+ VLC_OBJECT_AOUT, FIND_ANYWHERE );
+ if( p_aout )
+ {
+ AudioAutoMenuBuilder( p_aout, objects, varnames );
+ vlc_object_release( p_aout );
+ }
+ }
+
+ QMenu *menu = new QMenu();
+ Populate( p_intf, menu, varnames, objects );
+ menu->addSeparator();
+ POPUP_STATIC_ENTRIES;
+
+ p_intf->p_sys->p_popup_menu = menu;
+ }
+ p_intf->p_sys->p_popup_menu->popup( QCursor::pos() );
+ }
+ else
+ {
+ // destroy popup if there is one
+ delete p_intf->p_sys->p_popup_menu;
+ p_intf->p_sys->p_popup_menu = NULL;