diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 3e666d0ae1..d21cca070c 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -437,11 +437,6 @@ void MainInterface::handleMainUi( QSettings *settings ) { videoWidget = new VideoWidget( p_intf ); mainLayout->insertWidget( 0, videoWidget, 10 ); - - var_Create( p_intf, "window_widget", VLC_VAR_ADDRESS ); - vlc_value_t val; - val.p_address = this; - var_Set( p_intf, "window_widget", val ); } /* Finish the sizing */ @@ -659,8 +654,6 @@ private: * Thou shall not call/resize/hide widgets from on another thread. * This is wrong, and this is TEH reason to emit signals on those Video Functions **/ -/* function called from ::DoRequest in order to show a nice VideoWidget - at the good size */ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, int *pi_y, unsigned int *pi_width, unsigned int *pi_height ) @@ -700,8 +693,6 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, return ret; } -/* function called from ::DoRequest in order to show a nice VideoWidget - at the good size */ void MainInterface::requestNotEmbeddedVideo( vout_thread_t *p_nvout ) { fullscreenControls->regFullscreenCallback( p_nvout ); diff --git a/modules/gui/qt4/qt4.cpp b/modules/gui/qt4/qt4.cpp index a425f1b351..d07002487c 100644 --- a/modules/gui/qt4/qt4.cpp +++ b/modules/gui/qt4/qt4.cpp @@ -29,6 +29,10 @@ #include #include #include +#include +#include +#include +#include #include "qt4.hpp" #include "dialogs_provider.hpp" @@ -241,6 +245,7 @@ static int Open( vlc_object_t *p_this ) /* Listen to the messages */ p_intf->p_sys->p_sub = msg_Subscribe( p_intf ); + var_Create( p_this, "window_widget", VLC_VAR_ADDRESS ); return VLC_SUCCESS; } @@ -291,8 +296,12 @@ static void Run( intf_thread_t *p_intf ) Init( p_intf ); } +static QMutex windowLock; +static QWaitCondition windowWait; + static void Init( intf_thread_t *p_intf ) { + vlc_value_t val; char dummy[] = ""; char *argv[] = { dummy }; int argc = 1; @@ -324,6 +333,8 @@ static void Init( intf_thread_t *p_intf ) /* Initialize timers and the Dialog Provider */ DialogsProvider::getInstance( p_intf ); + QPointer *miP = NULL; + /* Create the normal interface in non-DP mode */ if( !p_intf->pf_show_dialog ) { @@ -331,6 +342,12 @@ static void Init( intf_thread_t *p_intf ) /* We don't show it because it is done in the MainInterface constructor p_mi->show(); */ p_intf->p_sys->b_isDialogProvider = false; + + miP = new QPointer (p_intf->p_sys->p_mi); + val.p_address = miP; + QMutexLocker locker (&windowLock); + var_Set (p_intf, "window_widget", val); + windowWait.wakeAll (); } else { @@ -389,6 +406,14 @@ static void Init( intf_thread_t *p_intf ) /* And quit */ + if (miP) + { + QMutexLocker locker (&windowLock); + val.p_address = NULL; + var_Set (p_intf, "window_widget", val); + delete miP; + } + /* Destroy first the main interface because it is connected to some slots in the MainInputManager */ delete p_intf->p_sys->p_mi; @@ -442,54 +467,65 @@ static int OpenWindow (vlc_object_t *obj) { vout_window_t *wnd = (vout_window_t *)obj; - /* TODO: should probably be in the libvlc core instead: */ - if (!config_GetInt (obj, "embedded-video")) - return VLC_EGENERIC; - intf_thread_t *intf = (intf_thread_t *) vlc_object_find_name (obj, "qt4", FIND_ANYWHERE); if (intf == NULL) return VLC_EGENERIC; /* Qt4 not in use */ assert (intf->i_object_type == VLC_OBJECT_INTF); - var_Create (intf, "window_mutex", VLC_VAR_MUTEX); var_Create (intf, "window_widget", VLC_VAR_ADDRESS); - vlc_value_t lockval, ptrval; - var_Get (intf, "window_mutex", &lockval); + vlc_value_t ptrval; - vlc_mutex_lock ((vlc_mutex_t *)lockval.p_address); + windowLock.lock (); msg_Dbg (obj, "waiting for interface..."); - do + for (;;) { var_Get (intf, "window_widget", &ptrval); - /* FIXME A condition variable would be way more appropriate. */ - msleep (INTF_IDLE_SLEEP); - } while (ptrval.p_address == NULL); + if (ptrval.p_address != NULL) + break; + windowWait.wait (&windowLock); + } + + msg_Dbg (obj, "requesting window..."); + QPointer *miP = (QPointer *)ptrval.p_address; + miP = new QPointer (*miP); /* create our own copy */ + vlc_object_release (intf); + + if (miP->isNull ()) + return VLC_EGENERIC; - msg_Dbg (obj, "requestiong window..."); - MainInterface *mi = (MainInterface *)ptrval.p_address; + if (config_GetInt (obj, "embedded-video") <= 0) + { + (*miP)->requestNotEmbeddedVideo (wnd->vout); + return VLC_EGENERIC; + } - wnd->handle = mi->requestVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y, - &wnd->width, &wnd->height); - vlc_mutex_unlock ((vlc_mutex_t *)lockval.p_address); + wnd->handle = (*miP)->requestVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y, + &wnd->width, &wnd->height); + windowLock.unlock (); wnd->control = ControlWindow; - wnd->p_private = intf; + wnd->p_private = miP; return VLC_SUCCESS; } static int ControlWindow (vout_window_t *wnd, int query, va_list args) { - intf_thread_t *intf = (intf_thread_t *)wnd->p_private; - intf->p_sys->p_mi->controlVideo (wnd->handle, query, args); + QPointer *miP = (QPointer *)wnd->p_private; + QMutexLocker locker (&windowLock); + + if (miP->isNull ()) + return VLC_EGENERIC; + return (*miP)->controlVideo (wnd->handle, query, args); } static void CloseWindow (vlc_object_t *obj) { vout_window_t *wnd = (vout_window_t *)obj; - intf_thread_t *intf = (intf_thread_t *)obj->p_private; + QPointer *miP = (QPointer *)wnd->p_private; + QMutexLocker locker (&windowLock); - intf->p_sys->p_mi->releaseVideo (wnd->handle); - vlc_object_release (intf); + if (!miP->isNull ()) + (*miP)->releaseVideo (wnd->handle); + delete miP; } - diff --git a/src/libvlc-module.c b/src/libvlc-module.c index 3eaacbd07c..3f5f458135 100644 --- a/src/libvlc-module.c +++ b/src/libvlc-module.c @@ -1477,13 +1477,8 @@ vlc_module_begin(); add_bool( "fullscreen", 0, NULL, FULLSCREEN_TEXT, FULLSCREEN_LONGTEXT, false ); change_short('f'); -#ifndef __APPLE__ - add_bool( "embedded-video", false, NULL, EMBEDDED_TEXT, EMBEDDED_LONGTEXT, - true ); -#else - add_bool( "embedded-video", true, NULL, EMBEDDED_TEXT, EMBEDDED_LONGTEXT, + add_bool( "embedded-video", 1, NULL, EMBEDDED_TEXT, EMBEDDED_LONGTEXT, true ); -#endif #ifdef __APPLE__ add_deprecated_alias( "macosx-embedded" ); /*deprecated since 0.9.0 */ #endif