Commit 33975668 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Qt4: fix Win32 task error handling

 - do not pass NULL HIML on error,
 - clean up COM on error,
 - fix hr variable shadowing.

Not fixed: leak of the task bar and image list.
parent b68711b2
...@@ -116,25 +116,37 @@ void MainInterface::createTaskBarButtons() ...@@ -116,25 +116,37 @@ void MainInterface::createTaskBarButtons()
FIXME:We need pretty buttons in 16x16 px that are handled correctly by masks in Qt FIXME:We need pretty buttons in 16x16 px that are handled correctly by masks in Qt
FIXME:the play button's picture doesn't changed to pause when clicked FIXME:the play button's picture doesn't changed to pause when clicked
*/ */
p_taskbl = NULL;
himl = NULL;
HRESULT hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); HRESULT hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
if( hr == RPC_E_CHANGED_MODE ) if( hr == RPC_E_CHANGED_MODE )
hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ); hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
if( FAILED(hr) )
return;
if( SUCCEEDED(hr) && S_OK == CoCreateInstance( CLSID_TaskbarList, void *pv;
NULL, CLSCTX_INPROC_SERVER, hr = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
IID_ITaskbarList3, IID_ITaskbarList3, &pv);
(void **)&p_taskbl) ) if( FAILED(hr) )
{ {
CoUninitialize();
return;
}
p_taskbl = (ITaskbarList3 *)pv;
p_taskbl->HrInit(); p_taskbl->HrInit();
if( (himl = ImageList_Create( 16, //cx himl = ImageList_Create( 16 /*cx*/, 16 /*cy*/, ILC_COLOR32 /*flags*/,
16, //cy 4 /*cInitial*/, 0 /*cGrow*/);
ILC_COLOR32,//flags if( himl == NULL )
4,//initial nb of images
0//nb of images that can be added
) ) != NULL )
{ {
p_taskbl->Release();
p_taskbl = NULL;
CoUninitialize();
return;
}
QPixmap img = QPixmap(":/win7/prev"); QPixmap img = QPixmap(":/win7/prev");
QPixmap img2 = QPixmap(":/win7/pause"); QPixmap img2 = QPixmap(":/win7/pause");
QPixmap img3 = QPixmap(":/win7/play"); QPixmap img3 = QPixmap(":/win7/play");
...@@ -144,21 +156,20 @@ void MainInterface::createTaskBarButtons() ...@@ -144,21 +156,20 @@ void MainInterface::createTaskBarButtons()
QBitmap mask3 = img3.createMaskFromColor(Qt::transparent); QBitmap mask3 = img3.createMaskFromColor(Qt::transparent);
QBitmap mask4 = img4.createMaskFromColor(Qt::transparent); QBitmap mask4 = img4.createMaskFromColor(Qt::transparent);
if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask))) if( -1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask)))
msg_Err( p_intf, "First ImageList_Add failed" ); msg_Err( p_intf, "%s ImageList_Add failed", "First" );
if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img2, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask2))) if( -1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img2, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask2)))
msg_Err( p_intf, "Second ImageList_Add failed" ); msg_Err( p_intf, "%s ImageList_Add failed", "Second" );
if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img3, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask3))) if( -1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img3, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask3)))
msg_Err( p_intf, "Third ImageList_Add failed" ); msg_Err( p_intf, "%s ImageList_Add failed", "Third" );
if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img4, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask4))) if( -1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img4, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask4)))
msg_Err( p_intf, "Fourth ImageList_Add failed" ); msg_Err( p_intf, "%s ImageList_Add failed", "Fourth" );
}
// Define an array of two buttons. These buttons provide images through an // Define an array of two buttons. These buttons provide images through an
// image list and also provide tooltips. // image list and also provide tooltips.
THUMBBUTTONMASK dwMask = THUMBBUTTONMASK(THB_BITMAP | THB_FLAGS); THUMBBUTTONMASK dwMask = THUMBBUTTONMASK(THB_BITMAP | THB_FLAGS);
THUMBBUTTON thbButtons[3]; THUMBBUTTON thbButtons[3];
thbButtons[0].dwMask = dwMask; thbButtons[0].dwMask = dwMask;
thbButtons[0].iId = 0; thbButtons[0].iId = 0;
thbButtons[0].iBitmap = 0; thbButtons[0].iBitmap = 0;
...@@ -174,22 +185,19 @@ void MainInterface::createTaskBarButtons() ...@@ -174,22 +185,19 @@ void MainInterface::createTaskBarButtons()
thbButtons[2].iBitmap = 3; thbButtons[2].iBitmap = 3;
thbButtons[2].dwFlags = THBF_HIDDEN; thbButtons[2].dwFlags = THBF_HIDDEN;
HRESULT hr = p_taskbl->ThumbBarSetImageList(WinId(this), himl ); hr = p_taskbl->ThumbBarSetImageList( WinId(this), himl );
if(S_OK != hr) if( FAILED(hr) )
msg_Err( p_intf, "ThumbBarSetImageList failed with error %08lx", hr ); msg_Err( p_intf, "%s failed with error %08lx", "ThumbBarSetImageList",
else hr );
{
hr = p_taskbl->ThumbBarAddButtons(WinId(this), 3, thbButtons);
if(S_OK != hr)
msg_Err( p_intf, "ThumbBarAddButtons failed with error %08lx", hr );
}
CONNECT( THEMIM->getIM(), playingStatusChanged( int ), this, changeThumbbarButtons( int ) );
}
else else
{ {
himl = NULL; hr = p_taskbl->ThumbBarAddButtons( WinId(this), 3, thbButtons);
p_taskbl = NULL; if( FAILED(hr) )
msg_Err( p_intf, "%s failed with error %08lx",
"ThumbBarAddButtons", hr );
} }
CONNECT( THEMIM->getIM(), playingStatusChanged( int ),
this, changeThumbbarButtons( int ) );
} }
bool MainInterface::winEvent ( MSG * msg, long * result ) bool MainInterface::winEvent ( MSG * msg, long * result )
......
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