[vlc-devel] [PATCH 3/3] WIP: gui:qt: add a dialog to select the renderer to use

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Apr 21 10:50:10 CEST 2016


On 04/19/2016 05:45 PM, Thomas Guillem wrote:
> From: Steve Lhomme <robux4 at videolabs.io>
>
> limited to the first and only renderer discovery service we have for now
> ---
>   include/vlc_interface.h                       |   1 +
>   include/vlc_intf_strings.h                    |   1 +
>   modules/gui/qt/Makefile.am                    |   5 +
>   modules/gui/qt/actions_manager.cpp            |   3 +
>   modules/gui/qt/actions_manager.hpp            |   1 +
>   modules/gui/qt/components/controller.cpp      |   4 +
>   modules/gui/qt/components/controller.hpp      |  13 +-
>   modules/gui/qt/dialogs/renderer.cpp           | 241 ++++++++++++++++++++++++++
>   modules/gui/qt/dialogs/renderer.hpp           |  70 ++++++++
>   modules/gui/qt/dialogs_provider.cpp           |   8 +
>   modules/gui/qt/dialogs_provider.hpp           |   3 +
>   modules/gui/qt/menus.cpp                      |   5 +
>   modules/gui/qt/pixmaps/toolbar/chromecast.png | Bin 0 -> 286 bytes
>   modules/gui/qt/ui/renderer.ui                 |  54 ++++++
>   modules/gui/qt/vlc.qrc                        |   1 +
>   15 files changed, 407 insertions(+), 3 deletions(-)
>   create mode 100644 modules/gui/qt/dialogs/renderer.cpp
>   create mode 100644 modules/gui/qt/dialogs/renderer.hpp
>   create mode 100644 modules/gui/qt/pixmaps/toolbar/chromecast.png
>   create mode 100644 modules/gui/qt/ui/renderer.ui
>
> diff --git a/include/vlc_interface.h b/include/vlc_interface.h
> index 108384b..6368d54 100644
> --- a/include/vlc_interface.h
> +++ b/include/vlc_interface.h
> @@ -129,6 +129,7 @@ typedef enum vlc_intf_dialog {
>       INTF_DIALOG_PREFS,
>       INTF_DIALOG_BOOKMARKS,
>       INTF_DIALOG_EXTENDED,
> +    INTF_DIALOG_RENDERER,
>
>       INTF_DIALOG_POPUPMENU = 20,
>       INTF_DIALOG_AUDIOPOPUPMENU,
> diff --git a/include/vlc_intf_strings.h b/include/vlc_intf_strings.h
> index 25c57b3..02f2257 100644
> --- a/include/vlc_intf_strings.h
> +++ b/include/vlc_intf_strings.h
> @@ -58,6 +58,7 @@
>   #define I_MENU_GOTOTIME N_("Jump to Specific &Time")
>   #define I_MENU_BOOKMARK N_("Custom &Bookmarks")
>   #define I_MENU_VLM N_("&VLM Configuration")
> +#define I_MENU_RENDERER N_("&Renderer Output")
>
>   #define I_MENU_ABOUT N_("&About")
>
> diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
> index b48e4ee..2043938 100644
> --- a/modules/gui/qt/Makefile.am
> +++ b/modules/gui/qt/Makefile.am
> @@ -67,6 +67,7 @@ libqt_plugin_la_SOURCES = \
>   	dialogs/podcast_configuration.cpp dialogs/podcast_configuration.hpp \
>   	dialogs/extensions.cpp dialogs/extensions.hpp \
>   	dialogs/fingerprintdialog.cpp dialogs/fingerprintdialog.hpp \
> +	dialogs/renderer.cpp dialogs/renderer.hpp \
>   	components/extended_panels.cpp components/extended_panels.hpp \
>   	components/info_panels.cpp components/info_panels.hpp \
>   	components/info_widgets.cpp components/info_widgets.hpp \
> @@ -166,6 +167,7 @@ nodist_libqt_plugin_la_SOURCES = \
>   	dialogs/firstrun.moc.cpp \
>   	dialogs/extensions.moc.cpp \
>   	dialogs/fingerprintdialog.moc.cpp \
> +	dialogs/renderer.moc.cpp \
>   	components/extended_panels.moc.cpp \
>   	components/info_panels.moc.cpp \
>   	components/info_widgets.moc.cpp \
> @@ -223,6 +225,7 @@ nodist_libqt_plugin_la_SOURCES += \
>   	ui/about.h \
>   	ui/update.h \
>   	ui/fingerprintdialog.h \
> +	ui/renderer.h \
>   	ui/sout.h
>
>   # User interface compilation
> @@ -260,6 +263,7 @@ libqt_plugin_la_UI = \
>   	ui/streampanel.ui \
>   	ui/messages_panel.ui \
>   	ui/about.ui \
> +	ui/renderer.ui \
>   	ui/update.ui \
>   	ui/sout.ui \
>   	ui/vlm.ui \
> @@ -362,6 +366,7 @@ DEPS_res = \
>   	pixmaps/toolbar/atob.png \
>   	pixmaps/toolbar/atob_noa.png \
>   	pixmaps/toolbar/atob_nob.png \
> +	pixmaps/toolbar/chromecast.png \
>   	pixmaps/toolbar/defullscreen.png \
>   	pixmaps/toolbar/dvd_menu.png \
>   	pixmaps/toolbar/dvd_next.png \
> diff --git a/modules/gui/qt/actions_manager.cpp b/modules/gui/qt/actions_manager.cpp
> index eff40d9..89f5d22 100644
> --- a/modules/gui/qt/actions_manager.cpp
> +++ b/modules/gui/qt/actions_manager.cpp
> @@ -93,6 +93,9 @@ void ActionsManager::doAction( int id_action )
>               if( p_intf->p_sys->p_mi )
>                   p_intf->p_sys->p_mi->getFullscreenControllerWidget()->toggleFullwidth();
>               break;
> +        case RENDERER_ACTION:
> +            THEDP->rendererDialog(); break;
> +            break;
>           default:
>               msg_Warn( p_intf, "Action not supported: %i", id_action );
>               break;
> diff --git a/modules/gui/qt/actions_manager.hpp b/modules/gui/qt/actions_manager.hpp
> index 20c10e0..cb3943a 100644
> --- a/modules/gui/qt/actions_manager.hpp
> +++ b/modules/gui/qt/actions_manager.hpp
> @@ -59,6 +59,7 @@ typedef enum actionType_e
>       LOOP_ACTION,
>       INFO_ACTION,
>       OPEN_SUB_ACTION,
> +    RENDERER_ACTION,
>   } actionType_e;
>
>   class ActionsManager : public QObject, public Singleton<ActionsManager>
> diff --git a/modules/gui/qt/components/controller.cpp b/modules/gui/qt/components/controller.cpp
> index dbb15a8..198e497 100644
> --- a/modules/gui/qt/components/controller.cpp
> +++ b/modules/gui/qt/components/controller.cpp
> @@ -474,6 +474,10 @@ QWidget *AbstractController::createWidget( buttonType_e button, int options )
>           CONNECT_MAP_SET( play, PLAY_ACTION );
>           }
>           break;
> +    case RENDERER_BUTTON:{
> +        NORMAL_BUTTON( RENDERER );
> +        }
> +        break;
>       case ASPECT_RATIO_COMBOBOX:
>           widget = new AspectRatioComboBox( p_intf );
>           widget->setMinimumHeight( 26 );
> diff --git a/modules/gui/qt/components/controller.hpp b/modules/gui/qt/components/controller.hpp
> index 6ac5b14..2a39c93 100644
> --- a/modules/gui/qt/components/controller.hpp
> +++ b/modules/gui/qt/components/controller.hpp
> @@ -35,7 +35,11 @@
>   #include <QSizeGrip>
>
>   #define MAIN_TB1_DEFAULT "64;39;64;38;65"
> +#if defined(ENABLE_SOUT)
> +#define MAIN_TB2_DEFAULT "0-2;64;3;1;4;64;7;9;64;10;20;19;64-4;37;26;65;35-4"
> +#else
>   #define MAIN_TB2_DEFAULT "0-2;64;3;1;4;64;7;9;64;10;20;19;64-4;37;65;35-4"
> +#endif
>   #define ADV_TB_DEFAULT "12;11;13;14"
>   #define INPT_TB_DEFAULT "43;33-4;44"
>   #define FSC_TB_DEFAULT "0-2;64;3;1;4;64;37;64;38;64;8;65;25;35-4;34"
> @@ -81,6 +85,7 @@ typedef enum buttonType_e
>       NEXT_BUTTON,
>       OPEN_SUB_BUTTON,
>       FULLWIDTH_BUTTON,
> +    RENDERER_BUTTON,
>       BUTTON_MAX,
>
>       SPLITTER = 0x20,
> @@ -110,7 +115,7 @@ static const char* const nameL[BUTTON_MAX] = { N_("Play"), N_("Stop"), N_("Open"
>       N_("Record"), N_("A→B Loop"), N_("Frame By Frame"), N_("Trickplay Reverse"),
>       N_("Step backward" ), N_("Step forward"), N_("Quit"), N_("Random"),
>       N_("Loop / Repeat"), N_("Information"), N_("Previous"), N_("Next"),
> -    N_("Open subtitles"), N_("Dock fullscreen controller")
> +    N_("Open subtitles"), N_("Dock fullscreen controller"), N_("Renderer output")
>   };
>   static const char* const tooltipL[BUTTON_MAX] = { I_PLAY_TOOLTIP,
>       N_("Stop playback"), N_("Open a medium"),
> @@ -124,7 +129,8 @@ static const char* const tooltipL[BUTTON_MAX] = { I_PLAY_TOOLTIP,
>       N_("Random"), N_("Change the loop and repeat modes"), N_("Information"),
>       N_("Previous media in the playlist"), N_("Next media in the playlist"),
>       N_("Open subtitle file"),
> -    N_("Dock/undock fullscreen controller to/from bottom of screen")
> +    N_("Dock/undock fullscreen controller to/from bottom of screen"),
> +    N_("Select a Renderer device to output video/audio")
>   };
>   static const QString iconL[BUTTON_MAX] ={ ":/toolbar/play_b", ":/toolbar/stop_b",
>       ":/toolbar/eject", ":/toolbar/previous_b", ":/toolbar/next_b",
> @@ -134,7 +140,8 @@ static const QString iconL[BUTTON_MAX] ={ ":/toolbar/play_b", ":/toolbar/stop_b"
>       ":/toolbar/frame", ":/toolbar/reverse", ":/toolbar/skip_back",
>       ":/toolbar/skip_fw", ":/toolbar/clear", ":/buttons/playlist/shuffle_on",
>       ":/buttons/playlist/repeat_all", ":/menu/info",
> -    ":/toolbar/previous_b", ":/toolbar/next_b", ":/toolbar/eject", ":/toolbar/space"
> +    ":/toolbar/previous_b", ":/toolbar/next_b", ":/toolbar/eject", ":/toolbar/space",
> +    ":/toolbar/chromecast"
>   };
>
>   enum
> diff --git a/modules/gui/qt/dialogs/renderer.cpp b/modules/gui/qt/dialogs/renderer.cpp
> new file mode 100644
> index 0000000..84df157
> --- /dev/null
> +++ b/modules/gui/qt/dialogs/renderer.cpp
> @@ -0,0 +1,241 @@
> +/*****************************************************************************
> + * renderer.cpp : Renderer output dialog
> + ****************************************************************************
> + * Copyright (C) 2015-2016 the VideoLAN team
> + *
> + * $Id$

SVN relicate

> + *
> + * Authors: Steve Lhomme <robux4 at videolabs.io>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * ( at your option ) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include <QListWidget>
> +#include <QListWidgetItem>
> +#include <sstream>
> +
> +#include <vlc_common.h>
> +#include <vlc_access.h>
> +#include <vlc_renderer_discovery.h>
> +#include <vlc_url.h>
> +
> +#include "dialogs/renderer.hpp"
> +
> +class RendererItem : public QListWidgetItem
> +{
> +public:
> +    RendererItem(vlc_renderer_item *obj)
> +        : QListWidgetItem( vlc_renderer_item_flags(obj) & VLC_RENDERER_CAN_VIDEO ? QIcon( ":/sidebar/movie" ) : QIcon( ":/sidebar/music" ),
> +                           qfu( vlc_renderer_item_name(obj) ))
> +    {
> +        m_obj = vlc_renderer_item_hold(obj);
> +    }
> +    ~RendererItem()
> +    {
> +        vlc_renderer_item_release(m_obj);
> +    }
> +
> +protected:
> +    vlc_renderer_item* m_obj;
> +
> +    friend class RendererDialog;
> +};
> +
> +extern "C" void renderer_event_received( const vlc_event_t * p_event, void * user_data )

Is the extern "C" required?

> +{
> +    RendererDialog *p_this = reinterpret_cast<RendererDialog*>(user_data);
> +    p_this->discoveryEventReceived( p_event );
> +}
> +
> +RendererDialog::RendererDialog( intf_thread_t *_p_intf )
> +               : QVLCDialog( (QWidget*)_p_intf->p_sys->p_mi, _p_intf )
> +               , p_rd( NULL )
> +               , b_rd_started( false )
> +{
> +    setWindowTitle( qtr( "Renderer Output" ) );
> +    setWindowRole( "vlc-renderer" );
> +
> +    /* Build Ui */
> +    ui.setupUi( this );
> +
> +    CONNECT( ui.buttonBox, accepted(), this, accept() );
> +    CONNECT( ui.buttonBox, rejected(), this, onReject() );
> +    CONNECT( ui.receiversListWidget, itemDoubleClicked(QListWidgetItem*), this, accept());
> +
> +    QVLCTools::restoreWidgetPosition( p_intf, "Renderer", this, QSize( 400 , 440 ) );
> +}
> +
> +RendererDialog::~RendererDialog()
> +{
> +    if ( p_rd != NULL )
> +        vlc_rd_release( p_rd );
> +}
> +
> +void RendererDialog::onReject()
> +{
> +    setSout( NULL );
> +
> +    QVLCDialog::reject();
> +}
> +
> +void RendererDialog::close()
> +{
> +    QVLCTools::saveWidgetPosition( p_intf, "Renderer", this );
> +
> +    QVLCDialog::close();
> +}
> +
> +void RendererDialog::setVisible(bool visible)
> +{
> +    QVLCDialog::setVisible(visible);
> +
> +    if (visible)
> +    {
> +        /* SD subnodes */
> +        char **ppsz_longnames;
> +        char **ppsz_names;
> +        if( vlc_rd_get_names( THEPL, &ppsz_names, &ppsz_longnames ) != VLC_SUCCESS )
> +            return;
> +
> +        char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames;
> +        for( ; *ppsz_name; ppsz_name++, ppsz_longname++ )
> +        {
> +            /* TODO launch all discovery services for renderers */
> +            msg_Dbg( p_intf, "starting renderer discovery service %s", *ppsz_longname );
> +            if ( p_rd == NULL )
> +            {
> +                p_rd = vlc_rd_new( VLC_OBJECT(p_intf), *ppsz_name );
> +                if( !p_rd )
> +                    msg_Err( p_intf, "Could not start renderer discovery services" );
> +            }
> +            break;
> +        }
> +        free( ppsz_names );
> +        free( ppsz_longnames );
> +
> +        if ( p_rd != NULL )
> +        {
> +            int row = -1;
> +            char *psz_renderer = var_InheritString( THEPL, "sout" );
> +            if ( psz_renderer != NULL )
> +            {
> +                for ( row = 0 ; row < ui.receiversListWidget->count(); row++ )
> +                {
> +                    RendererItem *rowItem = reinterpret_cast<RendererItem*>( ui.receiversListWidget->item( row ) );
> +                    if ( isItemSout( psz_renderer, rowItem->m_obj ) )
> +                        break;
> +                }
> +                if ( row == ui.receiversListWidget->count() )
> +                    row = -1;
> +                free( psz_renderer );
> +            }
> +            ui.receiversListWidget->setCurrentRow( row );
> +
> +            if ( !b_rd_started )
> +            {
> +                vlc_event_manager_t *em = vlc_rd_event_manager( p_rd );
> +                vlc_event_attach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, this );
> +                vlc_event_attach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, this );
> +
> +                b_rd_started = vlc_rd_start( p_rd ) == VLC_SUCCESS;
> +                if ( !b_rd_started )
> +                {
> +                    vlc_event_detach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, this);
> +                    vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, this);
> +                }
> +            }
> +        }
> +    }
> +    else
> +    {
> +        if ( p_rd != NULL )
> +        {
> +            if ( b_rd_started )
> +            {
> +                vlc_event_manager_t *em = vlc_rd_event_manager( p_rd );
> +                vlc_event_detach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, this);
> +                vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, this);
> +
> +                vlc_rd_stop( p_rd );
> +                b_rd_started = false;
> +            }
> +        }
> +    }
> +}
> +
> +void RendererDialog::accept()
> +{
> +    /* get the selected one in the listview if any */
> +    QListWidgetItem *current = ui.receiversListWidget->currentItem();
> +    if (current != NULL)
> +    {
> +        RendererItem *rowItem = reinterpret_cast<RendererItem*>(current);
> +        msg_Dbg( p_intf, "selecting Renderer %s", vlc_renderer_item_name(rowItem->m_obj) );
> +
> +        setSout( rowItem->m_obj );
> +    }
> +
> +    QVLCDialog::accept();
> +}
> +
> +void RendererDialog::discoveryEventReceived( const vlc_event_t * p_event )
> +{
> +    if ( p_event->type == vlc_RendererDiscoveryItemAdded )
> +    {
> +        vlc_renderer_item *p_item =  p_event->u.renderer_discovery_item_added.p_new_item;
> +
> +        int row = 0;
> +        for ( ; row < ui.receiversListWidget->count(); row++ )
> +        {
> +            RendererItem *rowItem = reinterpret_cast<RendererItem*>( ui.receiversListWidget->item( row ) );
> +            if ( !strcmp( vlc_renderer_item_sout( p_item ), vlc_renderer_item_sout( rowItem->m_obj ) ) )

Wouldn't it be clearer to use isItemSout?

> +                return;
> +        }
> +
> +        RendererItem *newItem = new RendererItem(p_item);
> +        ui.receiversListWidget->addItem( newItem );
> +
> +        char *psz_renderer = var_InheritString( THEPL, "sout" );
> +        if ( psz_renderer != NULL )
> +        {
> +            if ( isItemSout( psz_renderer, p_item ) )
> +                ui.receiversListWidget->setCurrentItem( newItem );
> +            free( psz_renderer );
> +        }
> +    }
> +}
> +
> +void RendererDialog::setSout( const vlc_renderer_item *p_item )
> +{
> +    const char *psz_old_sout = var_GetString( THEPL, "sout" );

This is leaking

> +    if( !psz_old_sout )
> +        psz_old_sout = "";
> +    const char *psz_sout = p_item ? vlc_renderer_item_sout( p_item ) : "";
> +
> +    if ( !strcmp( psz_old_sout, psz_sout ) )
> +        return;
> +
> +    msg_Err( p_intf, "starting sout: '%s'", psz_sout );
> +    var_SetString( THEPL, "sout", psz_sout );
> +}
> +
> +bool RendererDialog::isItemSout( const char *psz_sout, const vlc_renderer_item *p_item )
> +{
> +    return strcmp( psz_sout, vlc_renderer_item_sout( p_item ) ) == 0;
> +}
> diff --git a/modules/gui/qt/dialogs/renderer.hpp b/modules/gui/qt/dialogs/renderer.hpp
> new file mode 100644
> index 0000000..f6048d1
> --- /dev/null
> +++ b/modules/gui/qt/dialogs/renderer.hpp
> @@ -0,0 +1,70 @@
> +/*****************************************************************************
> + * renderer.hpp : Renderer output dialog
> + ****************************************************************************
> + * Copyright ( C ) 2015 the VideoLAN team
> + * $Id$
> + *
> + * Authors: Steve Lhomme <robux4 at videolabs.io>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * ( at your option ) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#ifndef QVLC_RENDERER_DIALOG_H_
> +#define QVLC_RENDERER_DIALOG_H_ 1
> +
> +#include "util/qvlcframe.hpp"
> +#include "util/singleton.hpp"
> +#include "ui/renderer.h"
> +
> +#include <QMutex>
> +#include <QAtomicInt>

These 2 header don't seem required

> +
> +class QPushButton;
> +class QTreeWidget;
> +class QTreeWidgetItem;

Same for these forward declarations

> +class MsgEvent;
> +
> +class RendererDialog : public QVLCDialog, public Singleton<RendererDialog>
> +{
> +    Q_OBJECT
> +
> +public:
> +    void discoveryEventReceived( const vlc_event_t * p_event );
> +    void setVisible(bool visible);
> +
> +private:
> +    RendererDialog( intf_thread_t * );
> +    virtual ~RendererDialog();
> +
> +    Ui::rendererWidget ui;
> +    void sinkMessage( const MsgEvent * );
> +
> +private slots:
> +    void accept();
> +    void onReject();
> +    void close();
> +
> +private:
> +
> +    friend class          Singleton<RendererDialog>;
> +    vlc_renderer_discovery *p_rd;
> +    bool                  b_rd_started;
> +    void                  setSout( const vlc_renderer_item *p_item );
> +
> +    static bool           isItemSout( const char *psz_sout, const vlc_renderer_item *p_item );
> +};
> +
> +
> +#endif
> diff --git a/modules/gui/qt/dialogs_provider.cpp b/modules/gui/qt/dialogs_provider.cpp
> index 0eade63..00a8382 100644
> --- a/modules/gui/qt/dialogs_provider.cpp
> +++ b/modules/gui/qt/dialogs_provider.cpp
> @@ -57,6 +57,7 @@
>   #include "dialogs/external.hpp"
>   #include "dialogs/epg.hpp"
>   #include "dialogs/errors.hpp"
> +#include "dialogs/renderer.hpp"
>
>   #include <QEvent>
>   #include <QApplication>
> @@ -153,6 +154,8 @@ void DialogsProvider::customEvent( QEvent *event )
>              bookmarksDialog(); break;
>           case INTF_DIALOG_EXTENDED:
>              extendedDialog(); break;
> +        case INTF_DIALOG_RENDERER:
> +           rendererDialog(); break;
>           case INTF_DIALOG_SENDKEY:
>              sendKey( de->i_arg ); break;
>   #ifdef ENABLE_VLM
> @@ -234,6 +237,11 @@ void DialogsProvider::extendedDialog()
>           extDialog->hide();
>   }
>
> +void DialogsProvider::rendererDialog()
> +{
> +    RendererDialog::getInstance( p_intf )->toggleVisible();

There should be a matching killInstance call somewhere

> +}
> +
>   void DialogsProvider::synchroDialog()
>   {
>       ExtendedDialog *extDialog = ExtendedDialog::getInstance(p_intf );
> diff --git a/modules/gui/qt/dialogs_provider.hpp b/modules/gui/qt/dialogs_provider.hpp
> index 01faa11..8de4fb5 100644
> --- a/modules/gui/qt/dialogs_provider.hpp
> +++ b/modules/gui/qt/dialogs_provider.hpp
> @@ -124,6 +124,9 @@ public slots:
>       void mediaCodecDialog();
>       void prefsDialog();
>       void extendedDialog();
> +#if defined(ENABLE_SOUT)
> +    void rendererDialog();
> +#endif
>       void synchroDialog();
>       void messagesDialog();
>       void sendKey( int key );
> diff --git a/modules/gui/qt/menus.cpp b/modules/gui/qt/menus.cpp
> index 5555f0e..09a8892 100644
> --- a/modules/gui/qt/menus.cpp
> +++ b/modules/gui/qt/menus.cpp
> @@ -428,6 +428,11 @@ QMenu *VLCMenuBar::ToolsMenu( intf_thread_t *p_intf, QMenu *menu )
>           "Ctrl+Shift+W" );
>   #endif
>
> +#if defined(ENABLE_SOUT)
> +    addDPStaticEntry( menu, qtr( I_MENU_RENDERER ), "", SLOT( rendererDialog() ),
> +        "Ctrl+Shift+R" );
> +#endif
> +
>       addDPStaticEntry( menu, qtr( "Program Guide" ), "", SLOT( epgDialog() ),
>           "" );
>
> diff --git a/modules/gui/qt/pixmaps/toolbar/chromecast.png b/modules/gui/qt/pixmaps/toolbar/chromecast.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..ac2929586cdfbcaa82af6b1709579b8c75dc1830
> GIT binary patch
> literal 286
> zcmeAS at N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b
> z3=G`DAk4 at xYmNj^kiEpy*OmP~4>OmEN&bf;ia?>&o-U3d7N^f%QtW186gc|v{wcQE
> z2^*qBW<PB at n6yn+;xCW*lLJ{B^*h`S>L+aZ&A4TrZ@}c2izIALbIrbT*Z4=m14D!V
> zGaHXvuV~ocQ_3g2K+jB5%v?Z~(LQ21gNWky`~TzFGLoi?e(2`3;@He!XK-A=d&(uI
> zWflwN;x{<_i*)Fa+;{Pqdf1D^o>OygzB=ook=)O?ub`uPy1OS&l5tn_6?g9FD+MkO
> b)|Rr?w(DPiQ8J|#=xhd0S3j3^P6<r_#RX|s
>
> literal 0
> HcmV?d00001
>
> diff --git a/modules/gui/qt/ui/renderer.ui b/modules/gui/qt/ui/renderer.ui
> new file mode 100644
> index 0000000..67e7eda
> --- /dev/null
> +++ b/modules/gui/qt/ui/renderer.ui
> @@ -0,0 +1,54 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<ui version="4.0">
> + <class>rendererWidget</class>
> + <widget class="QWidget" name="rendererWidget">
> +  <property name="geometry">
> +   <rect>
> +    <x>0</x>
> +    <y>0</y>
> +    <width>570</width>
> +    <height>440</height>
> +   </rect>
> +  </property>
> +  <property name="windowTitle">
> +   <string>Renderer Output</string>
> +  </property>
> +  <layout class="QVBoxLayout" name="verticalLayout_2">
> +   <item>
> +    <widget class="QLabel" name="label">
> +     <property name="text">
> +      <string>Available Renderers</string>
> +     </property>
> +    </widget>
> +   </item>
> +   <item>
> +    <widget class="QListWidget" name="receiversListWidget">
> +     <property name="sizePolicy">
> +      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
> +       <horstretch>0</horstretch>
> +       <verstretch>1</verstretch>
> +      </sizepolicy>
> +     </property>
> +    </widget>
> +   </item>
> +   <item>
> +    <widget class="QDialogButtonBox" name="buttonBox">
> +     <property name="sizePolicy">
> +      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
> +       <horstretch>0</horstretch>
> +       <verstretch>0</verstretch>
> +      </sizepolicy>
> +     </property>
> +     <property name="orientation">
> +      <enum>Qt::Horizontal</enum>
> +     </property>
> +     <property name="standardButtons">
> +      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
> +     </property>
> +    </widget>
> +   </item>
> +  </layout>
> + </widget>
> + <resources/>
> + <connections/>
> +</ui>
> diff --git a/modules/gui/qt/vlc.qrc b/modules/gui/qt/vlc.qrc
> index 20954cd..25dd853 100644
> --- a/modules/gui/qt/vlc.qrc
> +++ b/modules/gui/qt/vlc.qrc
> @@ -42,6 +42,7 @@
>           <file alias="previous_b">pixmaps/previous.png</file>
>           <file alias="eject">pixmaps/eject.png</file>
>           <file alias="fullscreen">pixmaps/toolbar/fullscreen.png</file>
> +        <file alias="chromecast">pixmaps/toolbar/chromecast.png</file>
>           <file alias="defullscreen">pixmaps/toolbar/defullscreen.png</file>
>           <file alias="extended">pixmaps/toolbar/extended_16px.png</file>
>           <file alias="playlist">pixmaps/playlist/playlist.png</file>
>



More information about the vlc-devel mailing list