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()
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
*/
p_taskbl = NULL;
himl = NULL;
HRESULT hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
if( hr == RPC_E_CHANGED_MODE )
hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
if( FAILED(hr) )
return;
if( SUCCEEDED(hr) && S_OK == CoCreateInstance( CLSID_TaskbarList,
NULL, CLSCTX_INPROC_SERVER,
IID_ITaskbarList3,
(void **)&p_taskbl) )
void *pv;
hr = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
IID_ITaskbarList3, &pv);
if( FAILED(hr) )
{
CoUninitialize();
return;
}
p_taskbl = (ITaskbarList3 *)pv;
p_taskbl->HrInit();
if( (himl = ImageList_Create( 16, //cx
16, //cy
ILC_COLOR32,//flags
4,//initial nb of images
0//nb of images that can be added
) ) != NULL )
himl = ImageList_Create( 16 /*cx*/, 16 /*cy*/, ILC_COLOR32 /*flags*/,
4 /*cInitial*/, 0 /*cGrow*/);
if( himl == NULL )
{
p_taskbl->Release();
p_taskbl = NULL;
CoUninitialize();
return;
}
QPixmap img = QPixmap(":/win7/prev");
QPixmap img2 = QPixmap(":/win7/pause");
QPixmap img3 = QPixmap(":/win7/play");
......@@ -144,21 +156,20 @@ void MainInterface::createTaskBarButtons()
QBitmap mask3 = img3.createMaskFromColor(Qt::transparent);
QBitmap mask4 = img4.createMaskFromColor(Qt::transparent);
if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask)))
msg_Err( p_intf, "First ImageList_Add failed" );
if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img2, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask2)))
msg_Err( p_intf, "Second ImageList_Add failed" );
if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img3, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask3)))
msg_Err( p_intf, "Third ImageList_Add failed" );
if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img4, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask4)))
msg_Err( p_intf, "Fourth ImageList_Add failed" );
}
if( -1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask)))
msg_Err( p_intf, "%s ImageList_Add failed", "First" );
if( -1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img2, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask2)))
msg_Err( p_intf, "%s ImageList_Add failed", "Second" );
if( -1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img3, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask3)))
msg_Err( p_intf, "%s ImageList_Add failed", "Third" );
if( -1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img4, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask4)))
msg_Err( p_intf, "%s ImageList_Add failed", "Fourth" );
// Define an array of two buttons. These buttons provide images through an
// image list and also provide tooltips.
THUMBBUTTONMASK dwMask = THUMBBUTTONMASK(THB_BITMAP | THB_FLAGS);
THUMBBUTTON thbButtons[3];
thbButtons[0].dwMask = dwMask;
thbButtons[0].iId = 0;
thbButtons[0].iBitmap = 0;
......@@ -174,22 +185,19 @@ void MainInterface::createTaskBarButtons()
thbButtons[2].iBitmap = 3;
thbButtons[2].dwFlags = THBF_HIDDEN;
HRESULT hr = p_taskbl->ThumbBarSetImageList(WinId(this), himl );
if(S_OK != hr)
msg_Err( p_intf, "ThumbBarSetImageList failed with error %08lx", hr );
else
{
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 ) );
}
hr = p_taskbl->ThumbBarSetImageList( WinId(this), himl );
if( FAILED(hr) )
msg_Err( p_intf, "%s failed with error %08lx", "ThumbBarSetImageList",
hr );
else
{
himl = NULL;
p_taskbl = NULL;
hr = p_taskbl->ThumbBarAddButtons( WinId(this), 3, thbButtons);
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 )
......
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