Commit 84e0f97a authored by Jean-Baptiste Kempf's avatar Jean-Baptiste Kempf

Merge branch 'master' of git@git.videolan.org:vlc

parents 2f53d499 12b18830
...@@ -437,11 +437,6 @@ void MainInterface::handleMainUi( QSettings *settings ) ...@@ -437,11 +437,6 @@ void MainInterface::handleMainUi( QSettings *settings )
{ {
videoWidget = new VideoWidget( p_intf ); videoWidget = new VideoWidget( p_intf );
mainLayout->insertWidget( 0, videoWidget, 10 ); 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 */ /* Finish the sizing */
...@@ -659,8 +654,6 @@ private: ...@@ -659,8 +654,6 @@ private:
* Thou shall not call/resize/hide widgets from on another thread. * 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 * 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, void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x,
int *pi_y, unsigned int *pi_width, int *pi_y, unsigned int *pi_width,
unsigned int *pi_height ) unsigned int *pi_height )
...@@ -700,8 +693,6 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, ...@@ -700,8 +693,6 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x,
return ret; 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 ) void MainInterface::requestNotEmbeddedVideo( vout_thread_t *p_nvout )
{ {
fullscreenControls->regFullscreenCallback( p_nvout ); fullscreenControls->regFullscreenCallback( p_nvout );
......
...@@ -29,6 +29,10 @@ ...@@ -29,6 +29,10 @@
#include <QLocale> #include <QLocale>
#include <QTranslator> #include <QTranslator>
#include <QDate> #include <QDate>
#include <QMutex>
#include <QMutexLocker>
#include <QWaitCondition>
#include <QPointer>
#include "qt4.hpp" #include "qt4.hpp"
#include "dialogs_provider.hpp" #include "dialogs_provider.hpp"
...@@ -241,6 +245,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -241,6 +245,7 @@ static int Open( vlc_object_t *p_this )
/* Listen to the messages */ /* Listen to the messages */
p_intf->p_sys->p_sub = msg_Subscribe( p_intf ); p_intf->p_sys->p_sub = msg_Subscribe( p_intf );
var_Create( p_this, "window_widget", VLC_VAR_ADDRESS );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -291,8 +296,12 @@ static void Run( intf_thread_t *p_intf ) ...@@ -291,8 +296,12 @@ static void Run( intf_thread_t *p_intf )
Init( p_intf ); Init( p_intf );
} }
static QMutex windowLock;
static QWaitCondition windowWait;
static void Init( intf_thread_t *p_intf ) static void Init( intf_thread_t *p_intf )
{ {
vlc_value_t val;
char dummy[] = ""; char dummy[] = "";
char *argv[] = { dummy }; char *argv[] = { dummy };
int argc = 1; int argc = 1;
...@@ -324,6 +333,8 @@ static void Init( intf_thread_t *p_intf ) ...@@ -324,6 +333,8 @@ static void Init( intf_thread_t *p_intf )
/* Initialize timers and the Dialog Provider */ /* Initialize timers and the Dialog Provider */
DialogsProvider::getInstance( p_intf ); DialogsProvider::getInstance( p_intf );
QPointer<MainInterface> *miP = NULL;
/* Create the normal interface in non-DP mode */ /* Create the normal interface in non-DP mode */
if( !p_intf->pf_show_dialog ) if( !p_intf->pf_show_dialog )
{ {
...@@ -331,6 +342,12 @@ static void Init( intf_thread_t *p_intf ) ...@@ -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 /* We don't show it because it is done in the MainInterface constructor
p_mi->show(); */ p_mi->show(); */
p_intf->p_sys->b_isDialogProvider = false; p_intf->p_sys->b_isDialogProvider = false;
miP = new QPointer<MainInterface> (p_intf->p_sys->p_mi);
val.p_address = miP;
QMutexLocker locker (&windowLock);
var_Set (p_intf, "window_widget", val);
windowWait.wakeAll ();
} }
else else
{ {
...@@ -389,6 +406,14 @@ static void Init( intf_thread_t *p_intf ) ...@@ -389,6 +406,14 @@ static void Init( intf_thread_t *p_intf )
/* And quit */ /* 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 /* Destroy first the main interface because it is connected to some slots
in the MainInputManager */ in the MainInputManager */
delete p_intf->p_sys->p_mi; delete p_intf->p_sys->p_mi;
...@@ -442,54 +467,65 @@ static int OpenWindow (vlc_object_t *obj) ...@@ -442,54 +467,65 @@ static int OpenWindow (vlc_object_t *obj)
{ {
vout_window_t *wnd = (vout_window_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 *) intf_thread_t *intf = (intf_thread_t *)
vlc_object_find_name (obj, "qt4", FIND_ANYWHERE); vlc_object_find_name (obj, "qt4", FIND_ANYWHERE);
if (intf == NULL) if (intf == NULL)
return VLC_EGENERIC; /* Qt4 not in use */ return VLC_EGENERIC; /* Qt4 not in use */
assert (intf->i_object_type == VLC_OBJECT_INTF); assert (intf->i_object_type == VLC_OBJECT_INTF);
var_Create (intf, "window_mutex", VLC_VAR_MUTEX);
var_Create (intf, "window_widget", VLC_VAR_ADDRESS); var_Create (intf, "window_widget", VLC_VAR_ADDRESS);
vlc_value_t lockval, ptrval; vlc_value_t ptrval;
var_Get (intf, "window_mutex", &lockval);
vlc_mutex_lock ((vlc_mutex_t *)lockval.p_address); windowLock.lock ();
msg_Dbg (obj, "waiting for interface..."); msg_Dbg (obj, "waiting for interface...");
do for (;;)
{ {
var_Get (intf, "window_widget", &ptrval); var_Get (intf, "window_widget", &ptrval);
/* FIXME A condition variable would be way more appropriate. */ if (ptrval.p_address != NULL)
msleep (INTF_IDLE_SLEEP); break;
} while (ptrval.p_address == NULL); windowWait.wait (&windowLock);
}
msg_Dbg (obj, "requesting window...");
QPointer<MainInterface> *miP = (QPointer<MainInterface> *)ptrval.p_address;
miP = new QPointer<MainInterface> (*miP); /* create our own copy */
vlc_object_release (intf);
if (miP->isNull ())
return VLC_EGENERIC;
msg_Dbg (obj, "requestiong window..."); if (config_GetInt (obj, "embedded-video") <= 0)
MainInterface *mi = (MainInterface *)ptrval.p_address; {
(*miP)->requestNotEmbeddedVideo (wnd->vout);
return VLC_EGENERIC;
}
wnd->handle = mi->requestVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y, wnd->handle = (*miP)->requestVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y,
&wnd->width, &wnd->height); &wnd->width, &wnd->height);
vlc_mutex_unlock ((vlc_mutex_t *)lockval.p_address); windowLock.unlock ();
wnd->control = ControlWindow; wnd->control = ControlWindow;
wnd->p_private = intf; wnd->p_private = miP;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
static int ControlWindow (vout_window_t *wnd, int query, va_list args) static int ControlWindow (vout_window_t *wnd, int query, va_list args)
{ {
intf_thread_t *intf = (intf_thread_t *)wnd->p_private; QPointer<MainInterface> *miP = (QPointer<MainInterface> *)wnd->p_private;
intf->p_sys->p_mi->controlVideo (wnd->handle, query, args); QMutexLocker locker (&windowLock);
if (miP->isNull ())
return VLC_EGENERIC;
return (*miP)->controlVideo (wnd->handle, query, args);
} }
static void CloseWindow (vlc_object_t *obj) static void CloseWindow (vlc_object_t *obj)
{ {
vout_window_t *wnd = (vout_window_t *)obj; vout_window_t *wnd = (vout_window_t *)obj;
intf_thread_t *intf = (intf_thread_t *)obj->p_private; QPointer<MainInterface> *miP = (QPointer<MainInterface> *)wnd->p_private;
QMutexLocker locker (&windowLock);
intf->p_sys->p_mi->releaseVideo (wnd->handle); if (!miP->isNull ())
vlc_object_release (intf); (*miP)->releaseVideo (wnd->handle);
delete miP;
} }
...@@ -1477,13 +1477,8 @@ vlc_module_begin(); ...@@ -1477,13 +1477,8 @@ vlc_module_begin();
add_bool( "fullscreen", 0, NULL, FULLSCREEN_TEXT, add_bool( "fullscreen", 0, NULL, FULLSCREEN_TEXT,
FULLSCREEN_LONGTEXT, false ); FULLSCREEN_LONGTEXT, false );
change_short('f'); change_short('f');
#ifndef __APPLE__ add_bool( "embedded-video", 1, NULL, EMBEDDED_TEXT, EMBEDDED_LONGTEXT,
add_bool( "embedded-video", false, NULL, EMBEDDED_TEXT, EMBEDDED_LONGTEXT,
true );
#else
add_bool( "embedded-video", true, NULL, EMBEDDED_TEXT, EMBEDDED_LONGTEXT,
true ); true );
#endif
#ifdef __APPLE__ #ifdef __APPLE__
add_deprecated_alias( "macosx-embedded" ); /*deprecated since 0.9.0 */ add_deprecated_alias( "macosx-embedded" ); /*deprecated since 0.9.0 */
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment