X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fqt4.cpp;h=d9ad2009d23f0e78d62f71ccee375a8aa731de39;hb=9c26b8e2a04468aa4b4a158f072d760a991932db;hp=37b5316c2b047db64323fd1c838efbb03e427777;hpb=6a66117a34f627ad9560b07cead07663b48f23b6;p=vlc diff --git a/modules/gui/qt4/qt4.cpp b/modules/gui/qt4/qt4.cpp old mode 100644 new mode 100755 index 37b5316c2b..d9ad2009d2 --- a/modules/gui/qt4/qt4.cpp +++ b/modules/gui/qt4/qt4.cpp @@ -48,6 +48,11 @@ #include "../../../share/vlc32x32-christmas.xpm" #include +#ifdef WIN32 + #include + Q_IMPORT_PLUGIN(qjpeg) +#endif + /***************************************************************************** * Local prototypes. *****************************************************************************/ @@ -57,7 +62,7 @@ static int OpenDialogs ( vlc_object_t * ); static int WindowOpen ( vlc_object_t * ); static void WindowClose ( vlc_object_t * ); static void Run ( intf_thread_t * ); -static void Init ( intf_thread_t * ); +static void *Init ( vlc_object_t * ); static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * ); /***************************************************************************** @@ -158,7 +163,7 @@ vlc_module_begin(); add_integer( "qt-display-mode", QT_NORMAL_MODE, NULL, QT_MODE_TEXT, QT_MODE_LONGTEXT, false ); - change_integer_list( i_mode_list, psz_mode_list_text, 0 ); + change_integer_list( i_mode_list, psz_mode_list_text, NULL ); add_bool( "qt-notification", true, NULL, NOTIFICATION_TEXT, NOTIFICATION_LONGTEXT, false ); @@ -174,7 +179,7 @@ vlc_module_begin(); MINIMIZED_LONGTEXT, true); add_bool( "qt-name-in-title", true, NULL, TITLE_TEXT, TITLE_LONGTEXT, false ); - add_bool( "qt-fs-controller", false, NULL, QT_FULLSCREEN_TEXT, + add_bool( "qt-fs-controller", true, NULL, QT_FULLSCREEN_TEXT, QT_FULLSCREEN_TEXT, false ); add_bool( "qt-volume-complete", false, NULL, COMPLETEVOL_TEXT, @@ -195,7 +200,7 @@ vlc_module_begin(); #ifdef UPDATE_CHECK add_bool( "qt-updates-notif", true, NULL, UPDATER_TEXT, UPDATER_LONGTEXT, false ); - add_integer( "qt-updates-days", 14, NULL, UPDATER_DAYS_TEXT, + add_integer( "qt-updates-days", 7, NULL, UPDATER_DAYS_TEXT, UPDATER_DAYS_TEXT, false ); #endif add_string( "qt-slider-colours", @@ -208,11 +213,26 @@ vlc_module_begin(); set_callbacks( OpenDialogs, Close ); +#if !defined (Q_WS_X11) || HAS_QT43 add_submodule(); set_capability( "vout window", 50 ); set_callbacks( WindowOpen, WindowClose ); +#endif vlc_module_end(); +#if defined(Q_WS_WIN) +bool WinQtApp::winEventFilter( MSG *msg, long *result ) +{ + switch( msg->message ) + { + case 0x0319: /* WM_APPCOMMAND 0x0319 */ + DefWindowProc( msg->hwnd, msg->message, msg->wParam, msg->lParam ); + break; + } + return false; +} +#endif /* Q_WS_WIN */ + /***************************************************************************** * Module callbacks *****************************************************************************/ @@ -239,9 +259,10 @@ static int Open( vlc_object_t *p_this ) memset( p_intf->p_sys, 0, sizeof( intf_sys_t ) ); p_intf->pf_run = Run; + p_intf->p_sys->p_mi = NULL; /* Access to the playlist */ - p_intf->p_sys->p_playlist = pl_Yield( p_intf ); + p_intf->p_sys->p_playlist = pl_Hold( p_intf ); /* Listen to the messages */ p_intf->p_sys->p_sub = msg_Subscribe( p_intf ); /* one settings to rule them all */ @@ -265,15 +286,14 @@ static void Close( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; - vlc_object_lock( p_intf ); - p_intf->b_dead = true; - vlc_object_unlock( p_intf ); - if( p_intf->p_sys->b_isDialogProvider ) { - DialogEvent *event = new DialogEvent( INTF_DIALOG_EXIT, 0, NULL ); - QApplication::postEvent( THEDP, static_cast(event) ); - + if( DialogsProvider::isAlive() ) + { + msg_Dbg( p_intf, "Asking the DP to quit nicely" ); + DialogEvent *event = new DialogEvent( INTF_DIALOG_EXIT, 0, NULL ); + QApplication::postEvent( THEDP, static_cast(event) ); + } vlc_thread_join( p_intf ); } @@ -294,18 +314,24 @@ static void Run( intf_thread_t *p_intf ) msg_Err( p_intf, "failed to create Qt dialogs thread" ); } else - Init( p_intf ); + { + int canc = vlc_savecancel (); + Init( VLC_OBJECT(p_intf) ); + vlc_restorecancel( canc ); + } } static QMutex windowLock; static QWaitCondition windowWait; -static void Init( intf_thread_t *p_intf ) +static void *Init( vlc_object_t *obj ) { + intf_thread_t *p_intf = (intf_thread_t *)obj; vlc_value_t val; char dummy[] = ""; char *argv[] = { dummy }; int argc = 1; + int canc = vlc_savecancel (); Q_INIT_RESOURCE( vlc ); @@ -321,7 +347,11 @@ static void Init( intf_thread_t *p_intf ) #endif /* Start the QApplication here */ +#ifdef WIN32 + WinQtApp *app = new WinQtApp( argc, argv , true ); +#else QApplication *app = new QApplication( argc, argv , true ); +#endif p_intf->p_sys->p_app = app; p_intf->p_sys->mainSettings = new QSettings( @@ -332,8 +362,7 @@ static void Init( intf_thread_t *p_intf ) #endif QSettings::UserScope, "vlc", "vlc-qt-interface" ); - /* Icon setting - FIXME: use a bigger icon ? */ + /* Icon setting */ if( QDate::currentDate().dayOfYear() >= 354 ) app->setWindowIcon( QIcon( QPixmap(vlc_christmas_xpm) ) ); else @@ -344,6 +373,22 @@ static void Init( intf_thread_t *p_intf ) QPointer *miP = NULL; +#ifdef UPDATE_CHECK + /* Checking for VLC updates */ + if( config_GetInt( p_intf, "qt-updates-notif" ) && + !config_GetInt( p_intf, "qt-privacy-ask" ) ) + { + int interval = config_GetInt( p_intf, "qt-updates-days" ); + if( QDate::currentDate() > + getSettings()->value( "updatedate" ).toDate().addDays( interval ) ) + { + /* The constructor of the update Dialog will do the 1st request */ + UpdateDialog::getInstance( p_intf ); + getSettings()->setValue( "updatedate", QDate::currentDate() ); + } + } +#endif + /* Create the normal interface in non-DP mode */ if( !p_intf->pf_show_dialog ) { @@ -369,7 +414,15 @@ static void Init( intf_thread_t *p_intf ) #ifdef ENABLE_NLS // Translation - get locale - QLocale ql = QLocale::system(); +# if defined (WIN32) || defined (__APPLE__) + char* psz_tmp = config_GetPsz( p_intf, "language" ); + QString lang = qfu( psz_tmp ); + free( psz_tmp); + if (lang == "auto") + lang = QLocale::system().name(); +# else + QString lang = QLocale::system().name(); +# endif // Translations for qt's own dialogs QTranslator qtTranslator( 0 ); // Let's find the right path for the translation file @@ -380,7 +433,7 @@ static void Init( intf_thread_t *p_intf ) "locale" + DIR_SEP + "qt4" + DIR_SEP ); #endif // files depending on locale - bool b_loaded = qtTranslator.load( path + "qt_" + ql.name()); + bool b_loaded = qtTranslator.load( path + "qt_" + lang ); if (!b_loaded) msg_Dbg( p_intf, "Error while initializing qt-specific localization" ); app->installTranslator( &qtTranslator ); @@ -391,32 +444,23 @@ static void Init( intf_thread_t *p_intf ) /* Retrieve last known path used in file browsing */ char *psz_path = config_GetPsz( p_intf, "qt-filedialog-path" ); - p_intf->p_sys->psz_filepath = EMPTY_STR( psz_path ) ? psz_path - : config_GetHomeDir(); - -#ifdef UPDATE_CHECK - /* Checking for VLC updates */ - if( config_GetInt( p_intf, "qt-updates-notif" ) ) - { - int interval = config_GetInt( p_intf, "qt-updates-days" ); - if( QDate::currentDate() > - getSettings()->value( "updatedate" ).toDate().addDays( interval ) ) - { - /* The constructor of the update Dialog will do the 1st request */ - UpdateDialog::getInstance( p_intf ); - getSettings()->setValue( "updatedate", QDate::currentDate() ); - } - } -#endif + p_intf->p_sys->psz_filepath = EMPTY_STR( psz_path ) ? config_GetHomeDir() + : psz_path; /* Launch */ app->exec(); /* And quit */ + msg_Dbg( p_intf, "Quitting the Qt4 Interface" ); if (miP) { QMutexLocker locker (&windowLock); + + /* We need to warn to detach from any vout before + * deleting miP (WindowClose will not be called after it) */ + p_intf->p_sys->p_mi->releaseVideo( NULL ); + val.p_address = NULL; var_Set (p_intf, "window_widget", val); delete miP; @@ -426,22 +470,27 @@ static void Init( intf_thread_t *p_intf ) in the MainInputManager */ delete p_intf->p_sys->p_mi; - /* Destroy then other windows, because some are connected to some slots - in the MainInputManager */ + /* Destroy all remaining windows, + because some are connected to some slots + in the MainInputManager + Settings must be destroyed after that. + */ DialogsProvider::killInstance(); + /* Delete the configuration. Application has to be deleted after that. */ + delete p_intf->p_sys->mainSettings; + /* Destroy the MainInputManager */ MainInputManager::killInstance(); - /* Delete the configuration */ - delete p_intf->p_sys->mainSettings; - /* Delete the application */ delete app; /* Save the path */ config_PutPsz( p_intf, "qt-filedialog-path", p_intf->p_sys->psz_filepath ); free( psz_path ); + vlc_restorecancel (canc); + return NULL; } /***************************************************************************** @@ -512,6 +561,10 @@ static int WindowOpen (vlc_object_t *obj) wnd->handle = (*miP)->requestVideo (wnd->vout, &wnd->pos_x, &wnd->pos_y, &wnd->width, &wnd->height); windowLock.unlock (); + + if (!wnd->handle) + return VLC_EGENERIC; + wnd->control = WindowControl; wnd->p_private = miP; return VLC_SUCCESS; @@ -534,6 +587,6 @@ static void WindowClose (vlc_object_t *obj) QMutexLocker locker (&windowLock); if (!miP->isNull ()) - (*miP)->releaseVideo( wnd->vout, wnd->handle ); + (*miP)->releaseVideo( wnd->handle ); delete miP; }