X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fsimple_preferences.cpp;h=2a93bb0bee0d5c23254c7ad06c302f256429ce47;hb=e7ef356de5e6d6f931478e92cc000480d8284974;hp=5c2dc605ca8b3ed53815198e125a51a0707c68ee;hpb=3392ff1e732347b1f8cf0163ba0325eca58622e7;p=vlc diff --git a/modules/gui/qt4/components/simple_preferences.cpp b/modules/gui/qt4/components/simple_preferences.cpp index 5c2dc605ca..2a93bb0bee 100644 --- a/modules/gui/qt4/components/simple_preferences.cpp +++ b/modules/gui/qt4/components/simple_preferences.cpp @@ -29,7 +29,6 @@ #include "components/simple_preferences.hpp" #include "components/preferences_widgets.hpp" -#include "dialogs/ml_configuration.hpp" #include #include @@ -45,21 +44,206 @@ #include #include #include +#include +#include -#define ICON_HEIGHT 64 +#define ICON_HEIGHT 48 #ifdef _WIN32 # include +# include #endif #include +static const char *const ppsz_language[] = +{ + "auto", + "en", + "ar", + "bn", + "pt_BR", + "en_GB", + "el", + "bg", + "ca", + "zh_TW", + "cs", + "cy", + "da", + "nl", + "fi", + "et", + "eu", + "fr", + "ga", + "gd", + "gl", + "ka", + "de", + "he", + "hr", + "hu", + "hy", + "is", + "id", + "it", + "ja", + "ko", + "lt", + "mn", + "ms", + "nb", + "nn", + "kk", + "km", + "ne", + "oc", + "fa", + "pl", + "pt_PT", + "pa", + "ro", + "ru", + "zh_CN", + "si", + "sr", + "sk", + "sl", + "ckb", + "es", + "sv", + "te", + "tr", + "uk", + "vi", + "wa", + NULL, +}; + +static const char *const ppsz_language_text[] = +{ + N_("Auto"), + "American English", + "ﻉﺮﺒﻳ", + "বাংলা", + "Português Brasileiro", + "British English", + "Νέα Ελληνικά", + "български език", + "Català", + "正體中文", + "Čeština", + "Cymraeg", + "Dansk", + "Nederlands", + "Suomi", + "eesti keel", + "Euskara", + "Français", + "Gaeilge", + "Gàidhlig", + "Galego", + "ქართული", + "Deutsch", + "עברית", + "hrvatski", + "Magyar", + "հայերեն", + "íslenska", + "Bahasa Indonesia", + "Italiano", + "日本語", + "한국어", + "lietuvių", + "Монгол хэл", + "Melayu", + "Bokmål", + "Nynorsk", + "Қазақ тілі", + "ភាសាខ្មែរ", + "नेपाली", + "Occitan", + "ﻑﺍﺮﺳی", + "Polski", + "Português", + "ਪੰਜਾਬੀ", + "Română", + "Русский", + "简体中文", + "සිංහල", + "српски", + "Slovensky", + "slovenščina", + "کوردیی سۆرانی", + "Español", + "Svenska", + "తెలుగు", + "Türkçe", + "украї́нська мо́ва", + "tiếng Việt", + "Walon", +}; + +static int getDefaultAudioVolume(vlc_object_t *obj, const char *aout) +{ + if (!strcmp(aout, "") || !strcmp(aout, "any")) + return -1; + else + /* Note: For hysterical raisins, this is sorted by decreasing priority + * order (then alphabetical order). */ + if (!strcmp(aout, "pulse")) + return -1; + else +#ifdef __linux__ + if (!strcmp(aout, "alsa") && module_exists("alsa")) + return cbrtf(config_GetFloat(obj, "alsa-gain")) * 100.f + .5f; + else +#endif +#ifdef _WIN32 + if (!strcmp(aout, "mmdevice")) + return -1; + else +#endif + if (!strcmp(aout, "sndio")) + return -1; + else +#ifdef __APPLE__ + if (!strcmp(aout, "auhal") && module_exists("auhal")) + return (config_GetFloat(obj, "auhal-volume") * 100.f + .5f) + / AOUT_VOLUME_DEFAULT; + else +#endif +#ifdef _WIN32 + if (!strcmp(aout, "directsound") && module_exists("directsound")) + return config_GetFloat(obj, "directx-volume") * 100.f + .5f; + else +#endif + if (!strcmp(aout, "jack")) + return cbrtf(config_GetFloat(obj, "jack-gain")) * 100.f + 0.5f; + else +#ifdef __OS2__ + if (!strcmp(aout, "kai")) + return cbrtf(config_GetFloat(obj, "kai-gain")) * 100.f + .5f; + else +#endif + if (!strcmp(aout, "oss")) + return -1; + else +#ifdef _WIN32 + if (!strcmp(aout, "waveout")) + return config_GetFloat(obj, "waveout-volume") * 100.f + .5f; + else +#endif + return -1; +} + /********************************************************************* * The List of categories *********************************************************************/ -SPrefsCatList::SPrefsCatList( intf_thread_t *_p_intf, QWidget *_parent, bool small ) : +SPrefsCatList::SPrefsCatList( intf_thread_t *_p_intf, QWidget *_parent ) : QWidget( _parent ), p_intf( _p_intf ) { - QVBoxLayout *layout = new QVBoxLayout(); + QHBoxLayout *layout = new QHBoxLayout(); /* Use autoExclusive buttons and a mapper as QButtonGroup can't set focus (keys) when it manages the buttons's exclusivity. @@ -67,7 +251,7 @@ SPrefsCatList::SPrefsCatList( intf_thread_t *_p_intf, QWidget *_parent, bool sma QSignalMapper *mapper = new QSignalMapper( layout ); CONNECT( mapper, mapped(int), this, switchPanel(int) ); - short icon_height = small ? ICON_HEIGHT /2 : ICON_HEIGHT; + short icon_height = ICON_HEIGHT; #define ADD_CATEGORY( button, label, ltooltip, icon, numb ) \ QToolButton * button = new QToolButton( this ); \ @@ -75,9 +259,8 @@ SPrefsCatList::SPrefsCatList( intf_thread_t *_p_intf, QWidget *_parent, bool sma button->setText( label ); \ button->setToolTip( ltooltip ); \ button->setToolButtonStyle( Qt::ToolButtonTextUnderIcon ); \ - button->setIconSize( QSize( icon_height, icon_height ) ); \ - button->resize( icon_height + 6 , icon_height + 6 ); \ - button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding) ; \ + button->setIconSize( QSize( icon_height + 40 , icon_height ) ); \ + button->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred ); \ button->setAutoRaise( true ); \ button->setCheckable( true ); \ button->setAutoExclusive( true ); \ @@ -91,9 +274,9 @@ SPrefsCatList::SPrefsCatList( intf_thread_t *_p_intf, QWidget *_parent, bool sma cone_audio_64, 1 ); ADD_CATEGORY( SPrefsVideo, qtr("Video"), qtr("Video Settings"), cone_video_64, 2 ); - ADD_CATEGORY( SPrefsSubtitles, SUBPIC_TITLE, qtr("Subtitle & On Screen Display Settings"), + ADD_CATEGORY( SPrefsSubtitles, qtr(SUBPIC_TITLE), qtr("Subtitle & On Screen Display Settings"), cone_subtitles_64, 3 ); - ADD_CATEGORY( SPrefsInputAndCodecs, INPUT_TITLE, qtr("Input & Codecs Settings"), + ADD_CATEGORY( SPrefsInputAndCodecs, qtr(INPUT_TITLE), qtr("Input & Codecs Settings"), cone_input_64, 4 ); ADD_CATEGORY( SPrefsHotkeys, qtr("Hotkeys"), qtr("Configure Hotkeys"), cone_hotkeys_64, 5 ); @@ -104,10 +287,9 @@ SPrefsCatList::SPrefsCatList( intf_thread_t *_p_intf, QWidget *_parent, bool sma layout->setMargin( 0 ); layout->setSpacing( 1 ); - setMinimumWidth( 140 ); - setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); + setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Preferred); + setMinimumWidth( ICON_HEIGHT * 6 + 10 ); setLayout( layout ); - } void SPrefsCatList::switchPanel( int i ) @@ -119,11 +301,13 @@ void SPrefsCatList::switchPanel( int i ) * The Panels *********************************************************************/ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, - int _number, bool small ) : QWidget( _parent ), p_intf( _p_intf ) + int _number ) : QWidget( _parent ), p_intf( _p_intf ) { module_config_t *p_config; ConfigControl *control; number = _number; + lang = NULL; + radioGroup = NULL; #define CONFIG_GENERIC( option, type, label, qcontrol ) \ p_config = config_FindConfig( VLC_OBJECT(p_intf), option ); \ @@ -283,10 +467,13 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, #define audioControl2( name) \ audioCommon( name ) \ + QHBoxLayout * name ## hboxLayout = new QHBoxLayout; \ QLineEdit * name ## Device = new QLineEdit; \ name ## Label->setBuddy( name ## Device ); \ + name ## hboxLayout->addWidget( name ## Device ); \ QPushButton * name ## Browse = new QPushButton( qtr( "Browse..." ) ); \ - outputAudioLayout->addWidget( name ## Device, outputAudioLayout->rowCount() - 1, 0, 1, -1, Qt::AlignLeft ); + name ## hboxLayout->addWidget( name ## Browse ); \ + outputAudioLayout->addLayout( name ## hboxLayout, outputAudioLayout->rowCount() - 1, 1, 1, 1, Qt::AlignLeft ); /* Build if necessary */ QGridLayout * outputAudioLayout = qobject_cast(ui.outputAudioBox->layout()); @@ -296,6 +483,13 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, optionWidgets["directxW" ] = DirectXDevice; CONFIG_GENERIC_NO_UI( "directx-audio-device", StringList, DirectXLabel, DirectXDevice ); + + audioControl( Waveout ); + optionWidgets["waveoutL" ] = WaveoutLabel; + optionWidgets["waveoutW" ] = WaveoutDevice; + CONFIG_GENERIC_NO_UI( "waveout-audio-device", StringList, + WaveoutLabel, WaveoutDevice ); + #elif defined( __OS2__ ) audioControl( kai ); optionWidgets["kaiL"] = kaiLabel; @@ -317,7 +511,7 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, optionWidgets["ossL"] = OSSLabel; optionWidgets["ossW"] = OSSDevice; optionWidgets["ossB"] = OSSBrowse; - CONFIG_GENERIC_FILE( "oss-audio-device" , File, NULL, OSSDevice, + CONFIG_GENERIC_FILE( "oss-audio-device" , File, OSSLabel, OSSDevice, OSSBrowse ); } #endif @@ -326,16 +520,17 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, #undef audioControl #undef audioCommon + int i_max_volume = config_GetInt( p_intf, "qt-max-volume" ); + /* Audio Options */ - ui.volumeValue->setMaximum( 200 ); - CONFIG_GENERIC_NO_BOOL( "volume" , IntegerRangeSlider, NULL, - defaultVolume ); + ui.volumeValue->setMaximum( i_max_volume ); + ui.defaultVolume->setMaximum( i_max_volume ); + CONNECT( ui.defaultVolume, valueChanged( int ), this, updateAudioVolume( int ) ); - CONFIG_BOOL( "volume-save", keepVolumeRadio ); - ui.defaultVolume_zone->setEnabled( ui.resetVolumeRadio->isChecked() ); - CONNECT( ui.resetVolumeRadio, toggled( bool ), + ui.defaultVolume_zone->setEnabled( ui.resetVolumeCheckbox->isChecked() ); + CONNECT( ui.resetVolumeCheckbox, toggled( bool ), ui.defaultVolume_zone, setEnabled( bool ) ); CONFIG_GENERIC( "audio-language" , String , ui.langLabel, @@ -371,6 +566,8 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, optionWidgets["volLW"] = ui.volumeValue; optionWidgets["headphoneB"] = ui.headphoneEffect; optionWidgets["spdifChB"] = ui.spdifBox; + optionWidgets["defaultVolume"] = ui.defaultVolume; + optionWidgets["resetVolumeCheckbox"] = ui.resetVolumeCheckbox; updateAudioOptions( ui.outputModule->currentIndex() ); /* LastFM */ @@ -519,6 +716,29 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, * Interface Panel * *******************/ START_SPREFS_CAT( Interface, qtr("Interface Settings") ); + +#ifndef _WIN32 + ui.langBox->hide(); +#else + for( int i = 0; ppsz_language[i] != NULL; i++) + ui.langCombo->addItem( qfu(ppsz_language_text[i]), ppsz_language[i]); + CONNECT( ui.langCombo, currentIndexChanged( int ), this, langChanged( int ) ); + + HKEY h_key; + char *langReg = NULL; + if( RegOpenKeyEx( HKEY_CURRENT_USER, TEXT("Software\\VideoLAN\\VLC\\"), 0, KEY_READ, &h_key ) + == ERROR_SUCCESS ) + { + TCHAR szData[256]; + DWORD len = 256; + if( RegQueryValueEx( h_key, TEXT("Lang"), NULL, NULL, (LPBYTE) &szData, &len ) == ERROR_SUCCESS ) { + langReg = FromWide( szData ); + ui.langCombo->setCurrentIndex( ui.langCombo->findData(langReg) ); + } + } + free( langReg); +#endif + // ui.defaultLabel->setFont( italicFont ); ui.skinsLabel->setText( qtr( "This is VLC's skinnable interface. You can download other skins at" ) @@ -531,11 +751,6 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, #else ui.osGroupBox->hide(); #endif -#ifdef MEDIA_LIBRARY - BUTTONACT( ui.sqlMLbtn, configML() ); -#else - ui.sqlMLbtn->hide(); -#endif /* interface */ char *psz_intf = config_GetPsz( p_intf, "intf" ); @@ -598,8 +813,7 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, CONFIG_GENERIC_FILE( "skins2-last", File, ui.skinFileLabel, ui.fileSkin, ui.skinBrowse ); - CONFIG_GENERIC( "album-art", IntegerList, ui.artFetchLabel, - artFetcher ); + CONFIG_BOOL( "metadata-network-access", MetadataNetworkAccessMode ); /* UPDATE options */ #ifdef UPDATE_CHECK @@ -697,7 +911,15 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, line++; - p_config = config_FindConfig( VLC_OBJECT(p_intf), "hotkeys-mousewheel-mode" ); + p_config = config_FindConfig( VLC_OBJECT(p_intf), "hotkeys-y-wheel-mode" ); + control = new IntegerListConfigControl( VLC_OBJECT(p_intf), + p_config, this, false ); + control->insertIntoExistingGrid( gLayout, line ); + controls.append( control ); + + line++; + + p_config = config_FindConfig( VLC_OBJECT(p_intf), "hotkeys-x-wheel-mode" ); control = new IntegerListConfigControl( VLC_OBJECT(p_intf), p_config, this, false ); control->insertIntoExistingGrid( gLayout, line ); @@ -719,19 +941,11 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent, panel_layout->addWidget( panel_label ); panel_layout->addWidget( title_line ); - if( small ) - { - QScrollArea *scroller= new QScrollArea; - scroller->setWidget( panel ); - scroller->setWidgetResizable( true ); - scroller->setFrameStyle( QFrame::NoFrame ); - panel_layout->addWidget( scroller ); - } - else - { - panel_layout->addWidget( panel ); - if( number != SPrefsHotkeys ) panel_layout->addStretch( 2 ); - } + QScrollArea *scroller= new QScrollArea; + scroller->setWidget( panel ); + scroller->setWidgetResizable( true ); + scroller->setFrameStyle( QFrame::NoFrame ); + panel_layout->addWidget( scroller ); setLayout( panel_layout ); @@ -752,6 +966,8 @@ void SPrefsPanel::updateAudioOptions( int number) #ifdef _WIN32 optionWidgets["directxW"]->setVisible( ( value == "directsound" ) ); optionWidgets["directxL"]->setVisible( ( value == "directsound" ) ); + optionWidgets["waveoutW"]->setVisible( ( value == "waveout" ) ); + optionWidgets["waveoutL"]->setVisible( ( value == "waveout" ) ); #elif defined( __OS2__ ) optionWidgets["kaiL"]->setVisible( ( value == "kai" ) ); optionWidgets["kaiW"]->setVisible( ( value == "kai" ) ); @@ -768,9 +984,25 @@ void SPrefsPanel::updateAudioOptions( int number) optionWidgets["alsaL"]->setVisible( ( value == "alsa" ) ); } #endif - optionWidgets["fileW"]->setVisible( ( value == "aout_file" ) ); + optionWidgets["fileW"]->setVisible( ( value == "afile" ) ); optionWidgets["spdifChB"]->setVisible( ( value == "alsa" || value == "oss" || value == "auhal" || value == "directsound" || value == "waveout" ) ); + + int volume = getDefaultAudioVolume(VLC_OBJECT(p_intf), qtu(value)); + bool save = true; + + if (volume >= 0) + save = config_GetInt(VLC_OBJECT(p_intf), "volume-save"); + + QCheckBox *resetVolumeCheckBox = + qobject_cast(optionWidgets["resetVolumeCheckbox"]); + resetVolumeCheckBox->setChecked(!save); + resetVolumeCheckBox->setEnabled(volume >= 0); + + QSlider *defaultVolume = + qobject_cast(optionWidgets["defaultVolume"]); + defaultVolume->setValue((volume >= 0) ? volume : 100); + defaultVolume->setEnabled(volume >= 0); } @@ -782,7 +1014,7 @@ SPrefsPanel::~SPrefsPanel() void SPrefsPanel::updateAudioVolume( int volume ) { qobject_cast(optionWidgets["volLW"]) - ->setValue( volume * 100 / AOUT_VOLUME_DEFAULT ); + ->setValue( volume ); } @@ -837,7 +1069,9 @@ void SPrefsPanel::apply() if( qobject_cast(optionWidgets["styleCB"]) ) getSettings()->setValue( "MainWindow/QtStyle", qobject_cast(optionWidgets["styleCB"])->currentText() ); - +#ifdef _WIN32 + saveLang(); +#endif break; } @@ -859,6 +1093,45 @@ void SPrefsPanel::apply() qs_filter.removeAll( "headphone" ); config_PutPsz( p_intf, "audio-filter", qtu( qs_filter.join( ":" ) ) ); + + /* Default volume */ + int i_volume = + qobject_cast(optionWidgets["defaultVolume"])->value(); + bool b_reset_volume = + qobject_cast(optionWidgets["resetVolumeCheckbox"])->isChecked(); + char *psz_aout = config_GetPsz( p_intf, "aout" ); + + float f_gain = powf( i_volume / 100.f, 3 ); + +#define save_vol_aout( name ) \ + module_exists( name ) && ( !psz_aout || !strcmp( psz_aout, name ) || !strcmp( psz_aout, "any" ) ) + + //FIXME this is moot +#if defined( _WIN32 ) + VLC_UNUSED( f_gain ); + if( save_vol_aout( "directsound" ) ) + config_PutFloat( p_intf, "directx-volume", i_volume / 100.f ); + if( save_vol_aout( "waveout" ) ) + config_PutFloat( p_intf, "waveout-volume", i_volume / 100.f ); +#elif defined( Q_OS_MAC ) + VLC_UNUSED( f_gain ); + if( save_vol_aout( "auhal" ) ) + config_PutFloat( p_intf, "auhal-volume", i_volume / 100.f + * AOUT_VOLUME_DEFAULT ); +#elif defined( __OS2__ ) + if( save_vol_aout( "kai" ) ) + config_PutFloat( p_intf, "kai-gain", f_gain ); +#else + if( save_vol_aout( "alsa" ) ) + config_PutFloat( p_intf, "alsa-gain", f_gain ); + if( save_vol_aout( "jack" ) ) + config_PutFloat( p_intf, "jack-gain", f_gain ); +#endif +#undef save_vol_aout + free( psz_aout ); + + config_PutInt( p_intf, "volume-save", !b_reset_volume ); + break; } case SPrefsSubtitles: @@ -907,9 +1180,14 @@ void SPrefsPanel::changeStyle( QString s_style ) }; } +void SPrefsPanel::langChanged( int i ) +{ + lang = strdup( ppsz_language[i] ); +} + void SPrefsPanel::configML() { -#ifdef MEDIA_LIBRARY +#ifdef SQL_MEDIA_LIBRARY MLConfDialog *mld = new MLConfDialog( this, p_intf ); mld->exec(); delete mld; @@ -920,6 +1198,27 @@ void SPrefsPanel::configML() #include #include "util/registry.hpp" +void SPrefsPanel::cleanLang() { + QVLCRegistry *qvReg = new QVLCRegistry( HKEY_CURRENT_USER ); + qvReg->DeleteValue( "Software\\VideoLAN\\VLC\\", "Lang" ); + qvReg->DeleteKey( "Software\\VideoLAN\\", "VLC" ); + qvReg->DeleteKey( "Software\\", "VideoLAN" ); + delete qvReg; +} + +void SPrefsPanel::saveLang() { + if( !lang ) return; + + if( !strncmp( lang, "auto", 4 ) ) { + cleanLang(); + } + else + { + QVLCRegistry *qvReg = new QVLCRegistry( HKEY_CURRENT_USER ); + qvReg->WriteRegistryString( "Software\\VideoLAN\\VLC\\", "Lang", lang ); + } +} + bool SPrefsPanel::addType( const char * psz_ext, QTreeWidgetItem* current, QTreeWidgetItem* parent, QVLCRegistry *qvReg ) { @@ -941,24 +1240,42 @@ bool SPrefsPanel::addType( const char * psz_ext, QTreeWidgetItem* current, return b_temp; } +#if !defined(__IApplicationAssociationRegistrationUI_INTERFACE_DEFINED__) +#define __IApplicationAssociationRegistrationUI_INTERFACE_DEFINED__ + const GUID IID_IApplicationAssociationRegistrationUI = {0x1f76a169,0xf994,0x40ac, {0x8f,0xc8,0x09,0x59,0xe8,0x87,0x47,0x10}}; + extern const GUID CLSID_ApplicationAssociationRegistrationUI; + interface IApplicationAssociationRegistrationUI : public IUnknown + { + virtual HRESULT STDMETHODCALLTYPE LaunchAdvancedAssociationUI( + LPCWSTR pszAppRegName) = 0; + }; +#endif /* __IApplicationAssociationRegistrationUI_INTERFACE_DEFINED__ */ + void SPrefsPanel::assoDialog() { - IApplicationAssociationRegistrationUI *p_appassoc; - CoInitializeEx( NULL, COINIT_MULTITHREADED ); + HRESULT hr; - if( S_OK == CoCreateInstance(CLSID_ApplicationAssociationRegistrationUI, - NULL, CLSCTX_INPROC_SERVER, - IID_IApplicationAssociationRegistrationUI, - (void **)&p_appassoc) ) + hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); + if( SUCCEEDED(hr) ) { - if(S_OK == p_appassoc->LaunchAdvancedAssociationUI(L"VLC" ) ) + void *p; + + hr = CoCreateInstance(CLSID_ApplicationAssociationRegistrationUI, + NULL, CLSCTX_INPROC_SERVER, + IID_IApplicationAssociationRegistrationUI, &p); + if( SUCCEEDED(hr) ) { - CoUninitialize(); - return; + IApplicationAssociationRegistrationUI *p_regui = + (IApplicationAssociationRegistrationUI *)p; + + hr = p_regui->LaunchAdvancedAssociationUI(L"VLC" ); + p_regui->Release(); } + CoUninitialize(); } - CoUninitialize(); + if( SUCCEEDED(hr) ) + return; QDialog *d = new QDialog( this ); d->setWindowTitle( qtr( "File associations" ) );