Use ShellExecuteEx in sokoke_show_uri on Win32
An 'Open With' dialog opens if needed.
This commit is contained in:
parent
3d4ee81ee4
commit
3a833296b0
1 changed files with 5 additions and 64 deletions
|
@ -286,71 +286,12 @@ sokoke_show_uri (GdkScreen* screen,
|
||||||
return hildon_uri_open (uri, action, error);
|
return hildon_uri_open (uri, action, error);
|
||||||
|
|
||||||
#elif defined (G_OS_WIN32)
|
#elif defined (G_OS_WIN32)
|
||||||
|
CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);
|
||||||
|
SHELLEXECUTEINFO info = { sizeof (info) };
|
||||||
|
info.nShow = SW_SHOWNORMAL;
|
||||||
|
info.lpFile = uri;
|
||||||
|
|
||||||
const gchar* fallbacks [] = { "explorer" };
|
return ShellExecuteEx (&info);
|
||||||
gsize i;
|
|
||||||
GAppInfo *app_info;
|
|
||||||
GFile *file;
|
|
||||||
gchar *free_uri;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GDK_IS_SCREEN (screen) || !screen, FALSE);
|
|
||||||
g_return_val_if_fail (uri != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (!error || !*error, FALSE);
|
|
||||||
|
|
||||||
file = g_file_new_for_uri (uri);
|
|
||||||
app_info = g_file_query_default_handler (file, NULL, error);
|
|
||||||
|
|
||||||
if (app_info != NULL)
|
|
||||||
{
|
|
||||||
GdkAppLaunchContext *context;
|
|
||||||
gboolean result;
|
|
||||||
GList l;
|
|
||||||
|
|
||||||
context = gdk_app_launch_context_new ();
|
|
||||||
gdk_app_launch_context_set_screen (context, screen);
|
|
||||||
gdk_app_launch_context_set_timestamp (context, timestamp);
|
|
||||||
|
|
||||||
l.data = (char *)file;
|
|
||||||
l.next = l.prev = NULL;
|
|
||||||
result = g_app_info_launch (app_info, &l, (GAppLaunchContext*)context, error);
|
|
||||||
|
|
||||||
g_object_unref (context);
|
|
||||||
g_object_unref (app_info);
|
|
||||||
g_object_unref (file);
|
|
||||||
|
|
||||||
if (result)
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
g_object_unref (file);
|
|
||||||
|
|
||||||
free_uri = g_filename_from_uri (uri, NULL, NULL);
|
|
||||||
if (free_uri)
|
|
||||||
{
|
|
||||||
gchar *quoted = g_shell_quote (free_uri);
|
|
||||||
uri = quoted;
|
|
||||||
g_free (free_uri);
|
|
||||||
free_uri = quoted;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (fallbacks); i++)
|
|
||||||
{
|
|
||||||
gchar* command = g_strconcat (fallbacks[i], " ", uri, NULL);
|
|
||||||
gboolean result = g_spawn_command_line_async (command, error);
|
|
||||||
g_free (command);
|
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
g_free (free_uri);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (error)
|
|
||||||
*error = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (free_uri);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#if !GLIB_CHECK_VERSION (2, 28, 0)
|
#if !GLIB_CHECK_VERSION (2, 28, 0)
|
||||||
|
|
Loading…
Reference in a new issue