Alexandre Julliard : winemenubuilder: Launch .lnk files directly through the Wine loader.
Alexandre Julliard
julliard at winehq.org
Fri Oct 1 18:02:21 CDT 2021
Module: wine
Branch: master
Commit: 542d67342db8b77af8244328ca175f91cb504e5c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=542d67342db8b77af8244328ca175f91cb504e5c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Oct 1 10:20:15 2021 +0200
winemenubuilder: Launch .lnk files directly through the Wine loader.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winemenubuilder/winemenubuilder.c | 59 ++++--------------------------
1 file changed, 8 insertions(+), 51 deletions(-)
diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 06d1e655195..c0701d0241f 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -2492,10 +2492,8 @@ static char *get_start_exe_path(void)
static BOOL InvokeShellLinker( IShellLinkW *sl, LPCWSTR link, BOOL bWait )
{
- static const WCHAR startW[] = {'\\','c','o','m','m','a','n','d',
- '\\','s','t','a','r','t','.','e','x','e',0};
char *link_name = NULL, *icon_name = NULL, *work_dir = NULL;
- char *escaped_path = NULL, *escaped_args = NULL, *description = NULL;
+ char *description = NULL;
char *wmclass = NULL;
WCHAR szTmp[INFOTIPSIZE];
WCHAR szDescription[INFOTIPSIZE], szPath[MAX_PATH], szWorkDir[MAX_PATH];
@@ -2503,7 +2501,6 @@ static BOOL InvokeShellLinker( IShellLinkW *sl, LPCWSTR link, BOOL bWait )
int iIconId = 0, r = -1;
DWORD csidl = -1;
HANDLE hsem = NULL;
- char *start_path = NULL;
if ( !link )
{
@@ -2574,37 +2571,11 @@ static BOOL InvokeShellLinker( IShellLinkW *sl, LPCWSTR link, BOOL bWait )
/* check the path */
if( szPath[0] )
{
- static const WCHAR exeW[] = {'.','e','x','e',0};
- WCHAR *p;
-
- /* check for .exe extension */
- if (!(p = strrchrW( szPath, '.' )) ||
- strchrW( p, '\\' ) || strchrW( p, '/' ) ||
- lstrcmpiW( p, exeW ))
- {
- /* Not .exe - use 'start.exe' to launch this file */
- p = szArgs + lstrlenW(szPath) + 2;
- if (szArgs[0])
- {
- p[0] = ' ';
- memmove( p+1, szArgs, min( (lstrlenW(szArgs) + 1) * sizeof(szArgs[0]),
- sizeof(szArgs) - (p + 1 - szArgs) * sizeof(szArgs[0]) ) );
- }
- else
- p[0] = 0;
+ /* FIXME: Use AppUserModelID if present. */
+ WCHAR *p = PathFindFileNameW(szPath);
- szArgs[0] = '"';
- lstrcpyW(szArgs + 1, szPath);
- szArgs[lstrlenW(szArgs)] = '"';
-
- GetWindowsDirectoryW(szPath, MAX_PATH);
- lstrcatW(szPath, startW);
- }
- else
+ if (p)
{
- /* FIXME: Use AppUserModelID if present. */
- WCHAR *p = PathFindFileNameW(szPath);
-
lstrcpyW(szWMClass, p);
CharLowerW(szWMClass);
}
@@ -2613,20 +2584,9 @@ static BOOL InvokeShellLinker( IShellLinkW *sl, LPCWSTR link, BOOL bWait )
if (szWorkDir[0])
work_dir = wine_get_unix_file_name( szWorkDir );
}
- else
- {
- /* if there's no path... try run the link itself */
- lstrcpynW(szArgs, link, MAX_PATH);
- GetWindowsDirectoryW(szPath, MAX_PATH);
- lstrcatW(szPath, startW);
- }
- /* escape the path and parameters */
- escaped_path = escape(szPath);
- escaped_args = escape(szArgs);
description = wchars_to_utf8_chars(szDescription);
wmclass = wchars_to_utf8_chars(szWMClass);
- start_path = get_start_exe_path();
/* building multiple menus concurrently has race conditions */
hsem = CreateSemaphoreA( NULL, 1, 1, "winemenubuilder_semaphore");
@@ -2646,17 +2606,17 @@ static BOOL InvokeShellLinker( IShellLinkW *sl, LPCWSTR link, BOOL bWait )
else
++lastEntry;
location = heap_printf("%s/%s.desktop", xdg_desktop_dir, lastEntry);
- if (csidl == CSIDL_COMMON_DESKTOPDIRECTORY)
- r = !write_desktop_entry(link, location, lastEntry, start_path, escape(link),
+ if (csidl == CSIDL_COMMON_DESKTOPDIRECTORY || !szPath[0])
+ r = !write_desktop_entry(link, location, lastEntry, escape(link), "",
description, work_dir, icon_name, wmclass);
else
- r = !write_desktop_entry(NULL, location, lastEntry, escaped_path, escaped_args, description, work_dir, icon_name, wmclass);
+ r = !write_desktop_entry(NULL, location, lastEntry, escape(szPath), escape(szArgs), description, work_dir, icon_name, wmclass);
if (r == 0)
chmod(location, 0755);
heap_free(location);
}
else
- r = !write_menu_entry(link, link_name, start_path, escape(link),
+ r = !write_menu_entry(link, link_name, escape(link), "",
description, work_dir, icon_name, wmclass);
ReleaseSemaphore( hsem, 1, NULL );
@@ -2666,11 +2626,8 @@ cleanup:
heap_free(icon_name );
heap_free(work_dir );
heap_free(link_name );
- heap_free(escaped_args );
- heap_free(escaped_path );
heap_free(description );
heap_free(wmclass );
- heap_free(start_path );
if (r && !bWait)
WINE_ERR("failed to build the menu\n" );
More information about the wine-cvs
mailing list