Damjan Jovanovic : winemenubuilder: Generate desktop files instead of wineshelllink.
Alexandre Julliard
julliard at winehq.org
Mon Nov 10 07:43:50 CST 2008
Module: wine
Branch: master
Commit: f5b8bad2aafb14b7b47746edbe670a0235d4524e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f5b8bad2aafb14b7b47746edbe670a0235d4524e
Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date: Sat Nov 8 11:03:39 2008 +0200
winemenubuilder: Generate desktop files instead of wineshelllink.
---
programs/winemenubuilder/winemenubuilder.c | 59 +++++++++++++++++++++++++---
1 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 90c613a..4e7cb1d 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -786,6 +786,37 @@ static char *extract_icon( LPCWSTR path, int index, BOOL bWait )
return xpm_path;
}
+static BOOL write_desktop_entry(const char *location, const char *linkname, const char *path,
+ const char *args, const char *descr, const char *workdir,
+ const char *icon)
+{
+ FILE *file;
+
+ WINE_TRACE("(%s,%s,%s,%s,%s,%s,%s)\n", wine_dbgstr_a(location),
+ wine_dbgstr_a(linkname), wine_dbgstr_a(path), wine_dbgstr_a(args),
+ wine_dbgstr_a(descr), wine_dbgstr_a(workdir), wine_dbgstr_a(icon));
+
+ file = fopen(location, "w");
+ if (file == NULL)
+ return FALSE;
+
+ fprintf(file, "[Desktop Entry]\n");
+ fprintf(file, "Name=%s\n", linkname);
+ fprintf(file, "Exec=env WINEPREFIX=\"%s\" wine \"%s\" %s\n",
+ wine_get_config_dir(), path, args);
+ fprintf(file, "Type=Application\n");
+ fprintf(file, "StartupWMClass=Wine\n");
+ if (descr && lstrlenA(descr))
+ fprintf(file, "Comment=%s\n", descr);
+ if (workdir && lstrlenA(workdir))
+ fprintf(file, "Path=%s\n", workdir);
+ if (icon && lstrlenA(icon))
+ fprintf(file, "Icon=%s\n", icon);
+
+ fclose(file);
+ return TRUE;
+}
+
/* This escapes \ in filenames */
static LPSTR escape(LPCWSTR arg)
{
@@ -1204,8 +1235,7 @@ static BOOL InvokeShellLinker( IShellLinkW *sl, LPCWSTR link, BOOL bWait )
escaped_args = escape(szArgs);
escaped_description = escape(szDescription);
- /* running multiple instances of wineshelllink
- at the same time may be dangerous */
+ /* building multiple menus concurrently has race conditions */
hsem = CreateSemaphoreA( NULL, 1, 1, "winemenubuilder_semaphore");
if( WAIT_OBJECT_0 != MsgWaitForMultipleObjects( 1, &hsem, FALSE, INFINITE, QS_ALLINPUT ) )
{
@@ -1213,9 +1243,26 @@ static BOOL InvokeShellLinker( IShellLinkW *sl, LPCWSTR link, BOOL bWait )
goto cleanup;
}
- r = fork_and_wait("wineshelllink", link_name, escaped_path,
- in_desktop_dir(csidl), escaped_args, icon_name,
- work_dir ? work_dir : "", escaped_description);
+ if (in_desktop_dir(csidl))
+ {
+ char *location;
+ const char *lastEntry;
+ lastEntry = strrchr(link_name, '/');
+ if (lastEntry == NULL)
+ lastEntry = link_name;
+ else
+ ++lastEntry;
+ location = heap_printf("%s/Desktop/%s.desktop", getenv("HOME"), lastEntry);
+ if (location)
+ {
+ r = !write_desktop_entry(location, lastEntry, escaped_path, escaped_args, escaped_description, work_dir, icon_name);
+ HeapFree(GetProcessHeap(), 0, location);
+ }
+ }
+ else
+ r = fork_and_wait("wineshelllink", link_name, escaped_path,
+ 0, escaped_args, icon_name,
+ work_dir ? work_dir : "", escaped_description);
ReleaseSemaphore( hsem, 1, NULL );
@@ -1229,7 +1276,7 @@ cleanup:
HeapFree( GetProcessHeap(), 0, escaped_description );
if (r && !bWait)
- WINE_ERR("failed to fork and exec wineshelllink\n" );
+ WINE_ERR("failed to build the menu\n" );
return ( r == 0 );
}
More information about the wine-cvs
mailing list