[PATCH v2 00/15] AppUserModelID support

Jonas Kümmerlin rgcjonas at gmail.com
Sat Jul 18 11:26:39 CDT 2015


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

-- 
2.4.3




More information about the wine-devel mailing list