Taskbar grouping in Windows 7

Tobias Häußler tobias.haeussler@gmx.de
Mon Jul 25 11:20:00 GMT 2011

On 19.07.2011 17:17, Jon TURNEY wrote:
> On 01/07/2011 21:38, Tobias Häußler wrote:
>> On 29/06/2011 15:25, Jon TURNEY wrote:
>>> On 25/06/2011 13:48, Tobias Häußler wrote:
>>>> I created a small patch for XWin that adds correct grouping of taskbar
>>>> icons when 'Always combine, hide labels' is set in the taskbar
>>>> properties. It uses the new taskbar APIs introduced in Windows 7 to set
>>>> an application id for each window. The id is based on the X11 class hints.
>>>> Maybe it is useful for someone...
>>> Firstly, thanks very much for this patch.
>>> Getting Windows to correctly group XWin windows on the taskbar is something
>>> that has needed fixing for a while, so it's great to have it done :-)
>> Thanks for your suggestions! I changed the code you mentioned.
> Thanks.  I've included this patch into the 1.10.3-1 package.
> I noticed that there are a couple of warnings issued when building
>>    CC     winmultiwindowwm.o
>> In file included from winmultiwindowwm.c:69:0:
>> taskbar.h:59:19: warning: ‘IID_IPropertyStore’ initialized and declared ‘extern’
>> taskbar.h:67:53: warning: ‘PKEY_AppUserModel_ID’ initialized and declared ‘extern’
> This seems to be related to the nonsense that is INITGUID.  I'm not sure how
> to fix this warning.  Would moving all the GUIDs we use (including the DirectX
> ones we use) to a separate file and compiling that with INITGUID defined be
> the correct solution?

I don't know the right way to deal with that, but it seems to work if 
taskbar.h is included in a separate .c-file with INITGUID defined, and 
in winmultiwindowwm.c without:

--- taskbar.c:
#define INITGUID
#include <basetyps.h>
#include <shlguid.h>

#include "taskbar.h"

--- winmultiwindowwm.c:
#include "taskbar.h"

The current solution produces this warning because of the declaration of 
DEFINE_GUID in basetyps.h and initguid.h:

DEFINE_GUID with INITGUID in basetyps.h resolves to:
   const GUID IID_IPropertyStore = {a,b,c,...}

DEFINE_GUID without INITGUID in basetyps.h resolves to:
   extern const GUID IID_IPropertyStore;

DEFINE_GUID with INITGUID in initguid.h resolves to:
   (extern) const GUID IID_IPropertyStore = {a,b,c,...}
Whether extern is appended or not depends on basetyps.h, which is 
included before initguid.h.

Including initguid.h (with INITGUID defined) after basetyps.h appends "= 
{a,b,c}", but does not remove "extern". In winmultiwindowwm.c this is 
the case, as basetyps.h is included by objbase.h before initguid.h.

The DirectX-GUIDs are initialized in the lib*.a-files of w32api, 
therefore INITGUID is not necessary and the warnings are not present. As 
soon as w32api contains the GUID for IID_IPropertyStore, taskbar.c with 
INITGUID can be removed.

> The other thing I noticed is that PropVariantClear() has been provided by
> ole32.dll since at least NT4, so there's no need to dynamically link with it.
>   So I'm confused as to why you are using GetProcAddress for that?

PropVariantClear() is not declared in the header files of w32api, so I 
had to link it dynamically.

Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/

More information about the Cygwin-xfree mailing list