X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fqt4.cpp;h=2492dd579ee3b62bec32a6cca5449178d06a960d;hb=78e989efff5ecf472985fa607e939bb1530cd4be;hp=980ba3472dbe9d3ba1a17151655676495749bdd2;hpb=ef171f46fc6d68d9ddfed23afbe852b63406103f;p=vlc diff --git a/modules/gui/qt4/qt4.cpp b/modules/gui/qt4/qt4.cpp index 980ba3472d..2492dd579e 100644 --- a/modules/gui/qt4/qt4.cpp +++ b/modules/gui/qt4/qt4.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * qt4.cpp : QT4 interface + * qt4.cpp : Qt interface **************************************************************************** * Copyright © 2006-2009 the VideoLAN team * $Id$ @@ -32,23 +32,23 @@ #include "qt4.hpp" -#include "input_manager.hpp" /* THEMIM creation */ +#include "input_manager.hpp" /* THEMIM destruction */ #include "dialogs_provider.hpp" /* THEDP creation */ #include "main_interface.hpp" /* MainInterface creation */ +#include "extensions_manager.hpp" /* Extensions manager */ #include "dialogs/help.hpp" /* Launch Update */ #include "recents.hpp" /* Recents Item destruction */ #include "util/qvlcapp.hpp" /* QVLCApplication definition */ +#include "components/playlist/playlist_model.hpp" /* for ~PLModel() */ #ifdef Q_WS_X11 #include #endif -#include "../../../share/icons/32x32/vlc.xpm" -#include "../../../share/icons/32x32/vlc-xmas.xpm" #include #include -#ifdef WIN32 /* For static builds */ +#ifdef _WIN32 /* For static builds */ #include Q_IMPORT_PLUGIN(qjpeg) Q_IMPORT_PLUGIN(qtaccessiblewidgets) @@ -91,17 +91,13 @@ static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * ); #define TITLE_TEXT N_( "Show playing item name in window title" ) #define TITLE_LONGTEXT N_( "Show the name of the song or video in the " \ - "controler window title." ) + "controller window title." ) #define NOTIFICATION_TEXT N_( "Show notification popup on track change" ) #define NOTIFICATION_LONGTEXT N_( \ "Show a notification popup with the artist and track name when " \ "the current playlist item changes, when VLC is minimized or hidden." ) -#define ADVANCED_OPTIONS_TEXT N_( "Advanced options" ) -#define ADVANCED_OPTIONS_LONGTEXT N_( "Show all the advanced options " \ - "in the dialogs." ) - #define OPACITY_TEXT N_( "Windows opacity between 0.1 and 1" ) #define OPACITY_LONGTEXT N_( "Sets the windows opacity between 0.1 and 1 " \ "for main interface, playlist and extended panel."\ @@ -123,15 +119,6 @@ static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * ); "two weeks." ) #define UPDATER_DAYS_TEXT N_("Number of days between two update checks") -#define COMPLETEVOL_TEXT N_( "Allow the volume to be set to 400%" ) -#define COMPLETEVOL_LONGTEXT N_( "Allow the volume to have range from 0% to " \ - "400%, instead of 0% to 200%. This option " \ - "can distort the audio, since it uses " \ - "software amplification." ) - -#define SAVEVOL_TEXT N_( "Automatically save the volume on exit" ) -#define STARTVOL_TEXT N_( "Default start volume" ) - #define PRIVACY_TEXT N_( "Ask for network policy at start" ) #define RECENTPLAY_TEXT N_( "Save the recently played items in the menu" ) @@ -157,7 +144,7 @@ static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * ); #define QT_NATIVEOPEN_TEXT N_( "Embed the file browser in open dialog" ) #define FULLSCREEN_NUMBER_TEXT N_( "Define which screen fullscreen goes" ) -#define FULLSCREEN_NUMBER_LONGTEXT N_( "Screennumber of fullscreen, instead of" \ +#define FULLSCREEN_NUMBER_LONGTEXT N_( "Screennumber of fullscreen, instead of " \ "same screen where interface is" ) #define QT_AUTOLOAD_EXTENSIONS_TEXT N_( "Load extensions on startup" ) @@ -168,7 +155,7 @@ static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * ); #define QT_BGCONE_TEXT N_( "Display background cone or art" ) #define QT_BGCONE_LONGTEXT N_( "Display background cone or current album art " \ - "when not playing." \ + "when not playing. " \ "Can be disabled to prevent burning screen." ) #define QT_BGCONE_EXPANDS_TEXT N_( "Expanding background cone or art." ) #define QT_BGCONE_EXPANDS_LONGTEXT N_( "Background art fits window's size" ) @@ -188,6 +175,14 @@ static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * ); #define ICONCHANGE_LONGTEXT N_( \ "This option allows the interface to change its icon on various occasions.") +#define VOLUME_MAX_TEXT N_( "Maximum Volume displayed" ) + +static const int i_notification_list[] = + { NOTIFICATION_NEVER, NOTIFICATION_MINIMIZED, NOTIFICATION_ALWAYS }; + +static const char *const psz_notification_list_text[] = + { N_("Never"), N_("When minimized"), N_("Always") }; + /**********************************************************************/ vlc_module_begin () set_shortname( "Qt" ) @@ -202,18 +197,23 @@ vlc_module_begin () add_bool( "qt-minimal-view", false, QT_MINIMAL_MODE_TEXT, QT_MINIMAL_MODE_TEXT, false ); - add_bool( "qt-notification", true, NOTIFICATION_TEXT, - NOTIFICATION_LONGTEXT, false ) + add_bool( "qt-system-tray", true, SYSTRAY_TEXT, SYSTRAY_LONGTEXT, false) - add_float_with_range( "qt-opacity", 1., 0.1, 1., NULL, OPACITY_TEXT, - OPACITY_LONGTEXT, false ) - add_float_with_range( "qt-fs-opacity", 0.8, 0.1, 1., NULL, OPACITY_FS_TEXT, - OPACITY_FS_LONGTEXT, false ) + add_integer( "qt-notification", NOTIFICATION_MINIMIZED, + NOTIFICATION_TEXT, + NOTIFICATION_LONGTEXT, false ) + change_integer_list( i_notification_list, psz_notification_list_text ) - add_bool( "qt-system-tray", true, SYSTRAY_TEXT, - SYSTRAY_LONGTEXT, false) add_bool( "qt-start-minimized", false, MINIMIZED_TEXT, MINIMIZED_LONGTEXT, true) + add_bool( "qt-pause-minimized", false, QT_PAUSE_MINIMIZED_TEXT, + QT_PAUSE_MINIMIZED_LONGTEXT, false ) + + add_float_with_range( "qt-opacity", 1., 0.1, 1., OPACITY_TEXT, + OPACITY_LONGTEXT, false ) + add_float_with_range( "qt-fs-opacity", 0.8, 0.1, 1., OPACITY_FS_TEXT, + OPACITY_FS_LONGTEXT, false ) + add_bool( "qt-video-autoresize", true, KEEPSIZE_TEXT, KEEPSIZE_LONGTEXT, false ) add_bool( "qt-name-in-title", true, TITLE_TEXT, @@ -221,33 +221,36 @@ vlc_module_begin () add_bool( "qt-fs-controller", true, QT_FULLSCREEN_TEXT, QT_FULLSCREEN_TEXT, false ) - add_bool( "qt-volume-complete", false, COMPLETEVOL_TEXT, - COMPLETEVOL_LONGTEXT, true ) - add_bool( "qt-autosave-volume", false, SAVEVOL_TEXT, - SAVEVOL_TEXT, true ) - add_integer_with_range( "qt-startvolume", QT_VOLUME_DEFAULT, 0, - QT_VOLUME_MAX, NULL, STARTVOL_TEXT, STARTVOL_TEXT, true ) - - add_bool( "qt-embedded-open", false, QT_NATIVEOPEN_TEXT, - QT_NATIVEOPEN_TEXT, false ) add_bool( "qt-recentplay", true, RECENTPLAY_TEXT, RECENTPLAY_TEXT, false ) add_string( "qt-recentplay-filter", "", RECENTPLAY_FILTER_TEXT, RECENTPLAY_FILTER_LONGTEXT, false ) - add_bool( "qt-adv-options", false, ADVANCED_OPTIONS_TEXT, - ADVANCED_OPTIONS_LONGTEXT, true ) - add_bool( "qt-advanced-pref", false, ADVANCED_PREFS_TEXT, - ADVANCED_PREFS_LONGTEXT, false ) - add_bool( "qt-error-dialogs", true, ERROR_TEXT, - ERROR_TEXT, false ) #ifdef UPDATE_CHECK add_bool( "qt-updates-notif", true, UPDATER_TEXT, UPDATER_LONGTEXT, false ) - add_integer( "qt-updates-days", 3, UPDATER_DAYS_TEXT, - UPDATER_DAYS_TEXT, false ) + add_integer_with_range( "qt-updates-days", 3, 0, 180, + UPDATER_DAYS_TEXT, UPDATER_DAYS_TEXT, false ) #endif - add_string( "qt-slider-colours", "255;255;255;20;210;20;255;199;15;245;39;29", + +#ifdef _WIN32 + add_bool( "qt-disable-volume-keys" /* name */, + true /* default value */, + QT_DISABLE_VOLUME_KEYS_TEXT /* text */, + QT_DISABLE_VOLUME_KEYS_LONGTEXT /* longtext */, + false /* advanced mode only */) +#endif + + add_bool( "qt-embedded-open", false, QT_NATIVEOPEN_TEXT, + QT_NATIVEOPEN_TEXT, false ) + + + add_bool( "qt-advanced-pref", false, ADVANCED_PREFS_TEXT, + ADVANCED_PREFS_LONGTEXT, false ) + add_bool( "qt-error-dialogs", true, ERROR_TEXT, + ERROR_TEXT, false ) + + add_string( "qt-slider-colours", "153;210;153;20;210;20;255;199;15;245;39;29", SLIDERCOL_TEXT, SLIDERCOL_LONGTEXT, false ) add_bool( "qt-privacy-ask", true, PRIVACY_TEXT, PRIVACY_TEXT, @@ -265,25 +268,18 @@ vlc_module_begin () add_bool( "qt-bgcone-expands", false, QT_BGCONE_EXPANDS_TEXT, QT_BGCONE_EXPANDS_LONGTEXT, true ) -#ifdef WIN32 - add_bool( "qt-disable-volume-keys" /* name */, - true /* default value */, - QT_DISABLE_VOLUME_KEYS_TEXT /* text */, - QT_DISABLE_VOLUME_KEYS_LONGTEXT /* longtext */, - false /* advanced mode only */) -#endif + add_bool( "qt-icon-change", true, ICONCHANGE_TEXT, ICONCHANGE_LONGTEXT, true ) - add_bool( "qt-pause-minimized", true, QT_PAUSE_MINIMIZED_TEXT, - QT_PAUSE_MINIMIZED_LONGTEXT, false ) + add_integer_with_range( "qt-max-volume", 125, 60, 300, VOLUME_MAX_TEXT, VOLUME_MAX_TEXT, true) - add_obsolete_bool( "qt-blingbling" ) /* Suppressed since 1.0.0 */ + add_obsolete_bool( "qt-blingbling" ) /* Suppressed since 1.0.0 */ add_obsolete_integer( "qt-display-mode" ) /* Suppressed since 1.1.0 */ - add_bool( "qt-icon-change", true, ICONCHANGE_TEXT, ICONCHANGE_LONGTEXT, true ) + add_obsolete_bool( "qt-adv-options" ) /* Since 2.0.0 */ + add_obsolete_bool( "qt-volume-complete" ) /* Since 2.0.0 */ + add_obsolete_integer( "qt-startvolume" ) /* Since 2.0.0 */ -#ifdef WIN32 cannot_unload_broken_library() -#endif add_submodule () set_description( "Dialogs provider" ) @@ -291,15 +287,20 @@ vlc_module_begin () set_callbacks( OpenDialogs, Close ) -#if defined(Q_WS_X11) || defined(Q_WS_WIN) || defined(Q_WS_MAC) +#if defined (Q_WS_X11) || (defined (Q_WS_QPA) && defined (__unix__)) add_submodule () -#if defined(Q_WS_X11) set_capability( "vout window xid", 0 ) -#elif defined(Q_WS_WIN) + set_callbacks( WindowOpen, WindowClose ) +#endif +#if defined (Q_WS_WIN) || (defined (Q_WS_QPA) && defined (_WIN32)) \ + || defined (Q_WS_PM) || (defined (Q_WS_QPA) && defined (__OS2__)) + add_submodule () set_capability( "vout window hwnd", 0 ) -#elif defined(Q_WS_MAC) - set_capability( "vout window nsobject", 0 ) + set_callbacks( WindowOpen, WindowClose ) #endif +#if defined (Q_WS_MAC) || (defined (Q_WS_QPA) && defined (__APPLE__)) + add_submodule () + set_capability( "vout window nsobject", 0 ) set_callbacks( WindowOpen, WindowClose ) #endif @@ -307,7 +308,7 @@ vlc_module_end () /*****************************************/ -/* Ugly, but the Qt4 interface assumes single instance anyway */ +/* Ugly, but the Qt interface assumes single instance anyway */ static vlc_sem_t ready; static QMutex lock; static bool busy = false; @@ -319,7 +320,7 @@ static bool active = false; #ifdef Q_WS_MAC /* Used to abort the app.exec() on OSX after libvlc_Quit is called */ -#include "../../../src/control/libvlc_internal.h" /* libvlc_SetExitHandler */ +#include "../../../lib/libvlc_internal.h" /* libvlc_SetExitHandler */ static void Abort( void *obj ) { QVLCApp::triggerQuit(); @@ -356,7 +357,7 @@ static int Open( vlc_object_t *p_this, bool isDialogProvider ) QMutexLocker locker (&lock); if (busy) { - msg_Err (p_this, "cannot start Qt4 multiple times"); + msg_Err (p_this, "cannot start Qt multiple times"); return VLC_EGENERIC; } @@ -364,6 +365,7 @@ static int Open( vlc_object_t *p_this, bool isDialogProvider ) intf_sys_t *p_sys = p_intf->p_sys = new intf_sys_t; p_intf->p_sys->b_isDialogProvider = isDialogProvider; p_sys->p_mi = NULL; + p_sys->pl_model = NULL; /* */ vlc_sem_init (&ready, 0); @@ -396,7 +398,7 @@ static int Open( vlc_object_t *p_this, bool isDialogProvider ) return VLC_SUCCESS; } -/* Open qt4 interface */ +/* Open Qt interface */ static int OpenIntf( vlc_object_t *p_this ) { return Open( p_this, false ); @@ -415,8 +417,11 @@ static void Close( vlc_object_t *p_this ) if( !p_sys->b_isDialogProvider ) { - var_Destroy (pl_Get(p_this), "window"); - var_Destroy (pl_Get(p_this), "qt4-iface"); + playlist_t *pl = pl_Get(p_this); + + var_Destroy (pl, "window"); + var_Destroy (pl, "qt4-iface"); + playlist_Deactivate (pl); /* release window provider if needed */ } /* And quit */ @@ -439,8 +444,8 @@ static void *Thread( void *obj ) intf_thread_t *p_intf = (intf_thread_t *)obj; MainInterface *p_mi; char dummy[] = "vlc"; /* for WM_CLASS */ - char *argv[2] = { dummy, NULL, }; - int argc = 1; + char *argv[] = { dummy, NULL, }; + int argc = sizeof(argv) / sizeof(argv[0]) - 1; Q_INIT_RESOURCE( vlc ); @@ -452,7 +457,7 @@ static void *Thread( void *obj ) /* All the settings are in the .conf/.ini style */ p_intf->p_sys->mainSettings = new QSettings( -#ifdef WIN32 +#ifdef _WIN32 QSettings::IniFormat, #else QSettings::NativeFormat, @@ -462,9 +467,9 @@ static void *Thread( void *obj ) /* Icon setting, Mac uses icon from .icns */ #ifndef Q_WS_MAC if( QDate::currentDate().dayOfYear() >= QT_XMAS_JOKE_DAY && var_InheritBool( p_intf, "qt-icon-change" ) ) - app.setWindowIcon( QIcon(vlc_xmas_xpm) ); + app.setWindowIcon( QIcon::fromTheme( "vlc-xmas", QIcon( ":/logo/vlc128-xmas.png" ) ) ); else - app.setWindowIcon( QIcon(vlc_xpm) ); + app.setWindowIcon( QIcon::fromTheme( "vlc", QIcon( ":/logo/vlc256.png" ) ) ); #endif /* Initialize timers and the Dialog Provider */ @@ -502,6 +507,22 @@ static void *Thread( void *obj ) /* Explain how to show a dialog :D */ p_intf->pf_show_dialog = ShowDialog; + /* Check window type from the Qt platform back-end */ + p_intf->p_sys->voutWindowType = VOUT_WINDOW_TYPE_INVALID; +#if defined (Q_WS_QPA) + QString platform = app.platformName(); + if( platform == qfu("xcb") ) + p_intf->p_sys->voutWindowType = VOUT_WINDOW_TYPE_XID; + else + msg_Err( p_intf, "unknown Qt platform: %s", qtu(platform) ); +#elif defined (Q_WS_X11) + p_intf->p_sys->voutWindowType = VOUT_WINDOW_TYPE_XID; +#elif defined (Q_WS_WIN) || defined (Q_WS_PM) + p_intf->p_sys->voutWindowType = VOUT_WINDOW_TYPE_HWND; +#elif defined (Q_WS_MAC) + p_intf->p_sys->voutWindowType = VOUT_WINDOW_TYPE_NSOBJECT; +#endif + /* Tell the main LibVLC thread we are ready */ vlc_sem_post (&ready); @@ -515,10 +536,7 @@ static void *Thread( void *obj ) #endif /* Last settings */ - if( p_intf->p_sys->b_isDialogProvider ) - app.setQuitOnLastWindowClosed( false ); - else - app.setQuitOnLastWindowClosed( true ); + app.setQuitOnLastWindowClosed( false ); /* Retrieve last known path used in file browsing */ p_intf->p_sys->filepath = @@ -544,6 +562,9 @@ static void *Thread( void *obj ) delete p_mi; } + /* */ + ExtensionsManager::killInstance(); + /* Destroy all remaining windows, because some are connected to some slots in the MainInputManager @@ -554,8 +575,14 @@ static void *Thread( void *obj ) /* Delete the recentsMRL object before the configuration */ RecentsMRL::killInstance(); - /* Save the path */ - getSettings()->setValue( "filedialog-path", p_intf->p_sys->filepath ); + /* Save the path or delete if recent play are disabled */ + if( var_InheritBool( p_intf, "qt-recentplay" ) ) + getSettings()->setValue( "filedialog-path", p_intf->p_sys->filepath ); + else + getSettings()->remove( "filedialog-path" ); + + /* */ + delete p_intf->p_sys->pl_model; /* Delete the configuration. Application has to be deleted after that. */ delete p_intf->p_sys->mainSettings; @@ -587,52 +614,55 @@ static int WindowControl( vout_window_t *, int i_query, va_list ); static int WindowOpen( vout_window_t *p_wnd, const vout_window_cfg_t *cfg ) { - /* */ if( cfg->is_standalone ) return VLC_EGENERIC; -#if defined (Q_WS_X11) - if( var_InheritBool( p_wnd, "video-wallpaper" ) ) - return VLC_EGENERIC; -#endif intf_thread_t *p_intf = (intf_thread_t *)var_InheritAddress( p_wnd, "qt4-iface" ); if( !p_intf ) { /* If another interface is used, this plugin cannot work */ - msg_Dbg( p_wnd, "Qt4 interface not found" ); + msg_Dbg( p_wnd, "Qt interface not found" ); return VLC_EGENERIC; } + if( p_intf->p_sys->voutWindowType != cfg->type ) + return VLC_EGENERIC; + switch( cfg->type ) + { + case VOUT_WINDOW_TYPE_XID: + if( var_InheritBool( p_wnd, "video-wallpaper" ) ) + return VLC_EGENERIC; + break; + } QMutexLocker locker (&lock); if (unlikely(!active)) return VLC_EGENERIC; MainInterface *p_mi = p_intf->p_sys->p_mi; - msg_Dbg( p_wnd, "requesting video..." ); + msg_Dbg( p_wnd, "requesting video window..." ); int i_x = cfg->x; int i_y = cfg->y; unsigned i_width = cfg->width; unsigned i_height = cfg->height; -#if defined (Q_WS_X11) - p_wnd->handle.xid = p_mi->getVideo( &i_x, &i_y, &i_width, &i_height ); - if( !p_wnd->handle.xid ) - return VLC_EGENERIC; - p_wnd->display.x11 = NULL; - -#elif defined (Q_WS_WIN) - p_wnd->handle.hwnd = p_mi->getVideo( &i_x, &i_y, &i_width, &i_height ); - if( !p_wnd->handle.hwnd ) + WId wid = p_mi->getVideo( &i_x, &i_y, &i_width, &i_height ); + if( !wid ) return VLC_EGENERIC; -#elif defined (Q_WS_MAC) - p_wnd->handle.nsobject = (void *)p_mi->getVideo( &i_x, &i_y, &i_width, &i_height ); - if( !p_wnd->handle.nsobject ) - return VLC_EGENERIC; -#else -# error FIXME -#endif + switch( cfg->type ) + { + case VOUT_WINDOW_TYPE_XID: + p_wnd->handle.xid = (uintptr_t)wid; + p_wnd->display.x11 = NULL; + break; + case VOUT_WINDOW_TYPE_HWND: + p_wnd->handle.hwnd = (void *)wid; + break; + case VOUT_WINDOW_TYPE_NSOBJECT: + p_wnd->handle.nsobject = (void *)wid; + break; + } p_wnd->control = WindowControl; p_wnd->sys = (vout_window_sys_t*)p_mi;