gboolean panel_launch_key_file (GKeyFile *keyfile, GList *uri_list, GdkScreen *screen, GError **error) { GDesktopAppInfo *appinfo; gboolean retval; g_return_val_if_fail (keyfile != NULL, FALSE); g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); appinfo = g_desktop_app_info_new_from_keyfile (keyfile); if (appinfo == NULL) return FALSE; retval = panel_app_info_launch_uris (G_APP_INFO (appinfo), uri_list, screen, gtk_get_current_event_time (), error); g_object_unref (appinfo); return retval; }
static gboolean exo_open_launch_desktop_file (const gchar *arg) { #ifdef HAVE_GIO_UNIX GFile *gfile; gchar *contents; gsize length; gboolean result; GKeyFile *key_file; GDesktopAppInfo *appinfo; /* try to open a file from the arguments */ gfile = g_file_new_for_commandline_arg (arg); if (G_UNLIKELY (gfile == NULL)) return FALSE; /* load the contents of the file */ result = g_file_load_contents (gfile, NULL, &contents, &length, NULL, NULL); g_object_unref (G_OBJECT (gfile)); if (G_UNLIKELY (!result || length == 0)) return FALSE; /* create the key file */ key_file = g_key_file_new (); result = g_key_file_load_from_data (key_file, contents, length, G_KEY_FILE_NONE, NULL); g_free (contents); if (G_UNLIKELY (!result)) { g_key_file_free (key_file); return FALSE; } /* create the appinfo */ appinfo = g_desktop_app_info_new_from_keyfile (key_file); g_key_file_free (key_file); if (G_UNLIKELY (appinfo == NULL)) return FALSE; /* try to launch a (non-hidden) desktop file */ if (G_LIKELY (!g_desktop_app_info_get_is_hidden (appinfo))) result = g_app_info_launch (G_APP_INFO (appinfo), NULL, NULL, NULL); else result = FALSE; g_object_unref (G_OBJECT (appinfo)); #ifndef NDEBUG g_debug ("launching desktop file %s", result ? "succeeded" : "failed"); #endif return result; #else /* !HAVE_GIO_UNIX */ g_critical (_("Launching desktop files is not supported when %s is compiled " "without GIO-Unix features."), g_get_prgname ()); return FALSE; #endif }
gboolean fm_launch_desktop_entry(GAppLaunchContext* ctx, const char* file_or_id, GList* uris, GError** err) { GKeyFile* kf = g_key_file_new(); gboolean loaded; gboolean ret = FALSE; if(g_path_is_absolute(file_or_id)) loaded = g_key_file_load_from_file(kf, file_or_id, 0, err); else { char* tmp = g_strconcat("applications/", file_or_id, NULL); loaded = g_key_file_load_from_data_dirs(kf, tmp, NULL, 0, err); g_free(tmp); } if(loaded) { GList* _uris = NULL; GAppInfo* app = NULL; char* type = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, "Type", NULL); if(type) { if(strcmp(type, "Application") == 0) app = g_desktop_app_info_new_from_keyfile(kf); else if(strcmp(type, "Link") == 0) { char* url = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, "URL", NULL); if(url) { char* scheme = g_uri_parse_scheme(url); if(scheme) { /* Damn! this actually relies on gconf to work. */ /* FIXME: use our own way to get a usable browser later. */ app = g_app_info_get_default_for_uri_scheme(scheme); uris = _uris = g_list_prepend(NULL, url); g_free(scheme); } } } else if(strcmp(type, "Directory") == 0) { /* FIXME: how should this work? It's not defined in the spec. */ } if(app) ret = g_app_info_launch_uris(app, uris, ctx, err); } } g_key_file_free(kf); return ret; }
static void on_browse_btn_clicked(GtkButton* btn, AppChooserData* data) { FmPath* file; GtkFileFilter* filter = gtk_file_filter_new(); char* binary; gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME|GTK_FILE_FILTER_MIME_TYPE, exec_filter_func, NULL, NULL); /* gtk_file_filter_set_name(filter, _("Executable files")); */ file = fm_select_file(GTK_WINDOW(data->dlg), NULL, "/usr/bin", TRUE, FALSE, filter, NULL); if (file == NULL) return; binary = fm_path_to_str(file); if (g_str_has_suffix(fm_path_get_basename(file), ".desktop")) { GKeyFile *kf = g_key_file_new(); GDesktopAppInfo *info; if (g_key_file_load_from_file(kf, binary, 0, NULL) && (info = g_desktop_app_info_new_from_keyfile(kf)) != NULL) /* it is a valid desktop entry */ { /* FIXME: it will duplicate the file, how to avoid that? */ gtk_entry_set_text(data->cmdline, g_app_info_get_commandline(G_APP_INFO(info))); gtk_entry_set_text(data->app_name, g_app_info_get_name(G_APP_INFO(info))); gtk_toggle_button_set_active(data->use_terminal, g_key_file_get_boolean(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, NULL)); gtk_toggle_button_set_active(data->keep_open, g_key_file_get_boolean(kf, G_KEY_FILE_DESKTOP_GROUP, "X-KeepTerminal", NULL)); g_object_unref(info); g_key_file_free(kf); fm_path_unref(file); return; } g_key_file_free(kf); } gtk_entry_set_text(data->cmdline, binary); g_free(binary); fm_path_unref(file); }
// FIXME_pcm: error handling static gboolean launch_program (FmArchiver *archiver, GAppLaunchContext *ctx, const char *cmd, FmPathList *files, FmPath *dir) { GDesktopAppInfo *app; char *_cmd = NULL; const char *dir_place_holder; GKeyFile *dummy; char *tmp; if (dir && (dir_place_holder = strstr (cmd, "%d"))) { char *dir_str; int len; if (strstr (cmd, "%U") || strstr (cmd, "%u")) // supports URI dir_str = fm_path_to_uri (dir); else { GFile *gf = fm_path_to_gfile (dir); // FIXME_pcm: convert dir to fuse-based local path if needed. dir_str = g_file_get_path (gf); g_object_unref (gf); } // replace all % with %% so encoded URI can be handled correctly when parsing Exec key. tmp = fm_str_replace (dir_str, "%", "%%"); g_free (dir_str); dir_str = tmp; // quote the path or URI tmp = g_shell_quote (dir_str); g_free (dir_str); dir_str = tmp; len = strlen (cmd) - 2 + strlen (dir_str) + 1; _cmd = g_malloc (len); len = (dir_place_holder - cmd); strncpy (_cmd, cmd, len); strcpy (_cmd + len, dir_str); strcat (_cmd, dir_place_holder + 2); g_free (dir_str); cmd = _cmd; } // create a fake key file to cheat GDesktopAppInfo dummy = g_key_file_new (); g_key_file_set_string (dummy, G_KEY_FILE_DESKTOP_GROUP, "Type", "Application"); g_key_file_set_string (dummy, G_KEY_FILE_DESKTOP_GROUP, "Name", archiver->program); // replace all % with %% so encoded URI can be handled correctly when parsing Exec key. g_key_file_set_string (dummy, G_KEY_FILE_DESKTOP_GROUP, "Exec", cmd); app = g_desktop_app_info_new_from_keyfile (dummy); g_key_file_free (dummy); g_debug ("cmd = %s", cmd); if (app) { GList *uris = NULL, *l; for (l = fm_list_peek_head_link (files); l; l=l->next) { FmPath *path = FM_PATH (l->data); uris = g_list_prepend (uris, fm_path_to_uri (path)); } fm_app_info_launch_uris ((GAppInfo *) app, uris, ctx, NULL); g_list_foreach (uris, (GFunc)g_free, NULL); g_list_free (uris); } g_free (_cmd); return TRUE; }
static VALUE rg_s_new_from_keyfile(G_GNUC_UNUSED VALUE self, VALUE keyfile) { return GOBJ2RVAL_UNREF(g_desktop_app_info_new_from_keyfile(RVAL2GKEYFILE(keyfile))); }
gboolean open_file_with_filemanager (GtkWidget * window, const gchar * file) { GDesktopAppInfo * d_app_info; GKeyFile * key_file; GdkAppLaunchContext * ctx = NULL; GList * list = NULL; GAppInfo * g_app_info; GFile * g_file; gchar * command; gchar * contents; gchar * uri; gboolean result = TRUE; uri = g_filename_to_uri (file, NULL, NULL); list = g_list_prepend (list, uri); g_file = g_file_new_for_path (file); g_app_info = g_file_query_default_handler (g_file, NULL, NULL); if (strcmp (g_app_info_get_executable (g_app_info), "nautilus") == 0) { command = g_strconcat ("nautilus ", "--sm-disable ", "--no-desktop ", "--no-default-window ", NULL); } else { command = g_strconcat (g_app_info_get_executable (g_app_info), " ", NULL); } contents = g_strdup_printf ("[Desktop Entry]\n" "Name=Nautilus\n" "Icon=file-manager\n" "Exec=%s\n" "Terminal=false\n" "StartupNotify=true\n" "Type=Application\n", command); key_file = g_key_file_new (); g_key_file_load_from_data (key_file, contents, strlen(contents), G_KEY_FILE_NONE, NULL); d_app_info = g_desktop_app_info_new_from_keyfile (key_file); if (d_app_info != NULL) { ctx = gdk_app_launch_context_new (); gdk_app_launch_context_set_screen (ctx, gtk_widget_get_screen (window)); result = g_app_info_launch_uris (G_APP_INFO (d_app_info), list, G_APP_LAUNCH_CONTEXT (ctx), NULL); } else { result = FALSE; } g_object_unref (g_app_info); g_object_unref (d_app_info); g_object_unref (g_file); g_object_unref (ctx); g_key_file_free (key_file); g_list_free (list); g_free (contents); g_free (command); g_free (uri); return result; }