Changes since the last version:
- Feedback by Vincent Porvik, Nikolay Sivov and GOUJON Alexandre has been incorporated.
- Where appropriate, bigger patches have been split into smaller chunks.
- All required features are now implemented: You can try it out by installing LibreOffice using the MSI package, set the windows version to Win7 in winecfg and observe the new fancy desktop file matching performed by your desktop shell. (assuming your shell does this; Gnome3 and Unity do, XFCE and LXDE don't)
- While Gnome3 works great, KDE hasn't been exactly cooperative so far. It now gets the grouping right, but ignores the StartupWMClass key in the desktop files, so pinning and fancy high-res icons won't work. This is most likely not fixable on our side, at least not without further research.
I am still not happy with the PROPVARIANT (de)serialization code (patches 4 and 5, hope the mailing list won't eat it this time). The ole32 <-> propsys interfacing has been implemented as Nikolay Sivov suggested, but I'm not really happy with it.
The new (de)serialization code also caused a weird regression in MSI.dll which I haven't been able to track down yet.
I'm currently leaning towards moving the new code to propsys.dll and leaving ole32.dll untouched, even though that would result in two different implementations of basically the same thing. Does anyone have strong opinions on this matter?
Rationale: AppUserModelIDs can be used to match open windows to shortcuts in order to make the Win7 Taskbar happen. The idea is similar to WM_CLASS in X11/freedesktop.org environments: Add the AppUserModelID to every window and every shortcut and let the shell figure out the matching. The shell can then do fancy things like pinning the app or showing a high quality icon.
While most windows apps rely on the fallback algorithm of doing the shortcut<->window mapping via the full path to the executable, some applications, like LibreOffice, are making use of the AppUserModelID feature to appear as a set of different applications (Writer, Calc, ...) while sharing the same exe file (soffice.bin).
Modern freedesktop.org shells work very similar to the Win7 Taskbar in this regard (using the X11 WM_CLASS attribute and the StartupWMClass= deskop entry key), and the goal is to have wine apps appear like any native app: With a high-res icon and pinnable.
Jonas Kümmerlin (15): shell32: Implement process-wide explicit AppUserModelID propsys: Implement several PropVariantInit*() functions propsys: Extend PropVariantCompareEx() ole32: Rework property (de)serialization propsys: Implement Stg(De)SerializePropVariant propsys: Implement named properties on the in-memory property store propsys: Implement serialization of the in-memory property store propsys: Implement IPersistStream on the in-memory property store propsys: Partially implement property stringification shell32: Properly implement IPropertyStore for shell links shell32: Implement window property store (SHGetPropertyStoreForWindow) winex11.drv,user32,shell32 Use AppUserModelID to populate WM_CLASS propsys: Partially implement/stub IPropertyDescription msi: Write shortcut properties winemenubuilder: Save AppUserModelID as StartupWMClass
dlls/msi/Makefile.in | 2 +- dlls/msi/action.c | 120 ++ dlls/msi/tests/Makefile.in | 2 +- dlls/msi/tests/action.c | 75 +- dlls/msi/tests/automation.c | 1 - dlls/msi/tests/suminfo.c | 4 +- dlls/ole32/stg_prop.c | 1717 +++++++++++++++++++++++----- dlls/ole32/tests/propvariant.c | 86 +- dlls/propsys/Makefile.in | 4 +- dlls/propsys/propdesc.c | 537 +++++++++ dlls/propsys/propdesc_builtin_data.c | 85 ++ dlls/propsys/propstore.c | 1062 ++++++++++++++++- dlls/propsys/propsys.spec | 36 +- dlls/propsys/propsys_classes.idl | 7 +- dlls/propsys/propsys_main.c | 6 - dlls/propsys/propsys_private.h | 23 + dlls/propsys/propvar.c | 889 +++++++++++++- dlls/propsys/tests/Makefile.in | 2 +- dlls/propsys/tests/propstore.c | 403 ++++++- dlls/propsys/tests/propsys.c | 709 +++++++++++- dlls/shell32/Makefile.in | 1 + dlls/shell32/shell32.spec | 2 + dlls/shell32/shell32_main.c | 109 +- dlls/shell32/shelllink.c | 218 +++- dlls/shell32/tests/Makefile.in | 1 + dlls/shell32/tests/appusermodel.c | 272 +++++ dlls/shell32/tests/shell32_test.h | 9 + dlls/shell32/tests/shelllink.c | 123 ++ dlls/shell32/winpropstore.c | 303 +++++ dlls/user32/message.c | 2 +- dlls/user32/user_private.h | 5 +- dlls/winex11.drv/window.c | 160 ++- include/propidl.idl | 6 + include/propsys.idl | 1 + include/propvarutil.h | 105 +- include/shellapi.h | 1 + include/shobjidl.idl | 6 + include/strsafe.h | 17 + include/winbase.h | 2 + include/wine/server_protocol.h | 59 +- programs/winemenubuilder/winemenubuilder.c | 123 +- server/protocol.def | 38 + server/request.h | 35 + server/trace.c | 47 + server/window.c | 148 +++ 45 files changed, 7098 insertions(+), 465 deletions(-) create mode 100644 dlls/propsys/propdesc.c create mode 100644 dlls/propsys/propdesc_builtin_data.c create mode 100644 dlls/shell32/tests/appusermodel.c create mode 100644 dlls/shell32/winpropstore.c