This is the mail archive of the cygwin-xfree mailing list for the Cygwin XFree86 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Taskbar grouping in Windows 7


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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]