void panel_launch_desktop_file (const char *desktop_file, const char *fallback_exec, GdkScreen *screen, GError **error) { GnomeDesktopItem *ditem; if (g_path_is_absolute (desktop_file)) ditem = gnome_desktop_item_new_from_file (desktop_file, 0, error); else ditem = gnome_desktop_item_new_from_basename (desktop_file, 0, error); if (ditem != NULL) { panel_ditem_launch (ditem, NULL, screen, error); gnome_desktop_item_unref (ditem); } else if (fallback_exec != NULL) { char *argv [2] = {(char *)fallback_exec, NULL}; if (*error) { g_error_free (*error); *error = NULL; } gdk_spawn_on_screen (screen, NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, error); } }
static void ditem_read_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { GnomeDesktopItem *item; GtkWidget *box; gsize file_size; char *file_contents; box = GTK_WIDGET (user_data); if (g_file_load_contents_finish (G_FILE (source_object), res, &file_contents, &file_size, NULL, NULL)) { item = gnome_desktop_item_new_from_string (g_object_get_data (G_OBJECT (box), "uri"), file_contents, file_size, 0, NULL); g_free (file_contents); if (item == NULL) { return; } /* for some reason, this isn't done automatically */ gnome_desktop_item_set_location (item, g_object_get_data (G_OBJECT (box), "uri")); create_page (item, box); gnome_desktop_item_unref (item); } g_object_unref (box); }
gboolean desktop_launch(GdkScreen *screen, const char *desktop_name, GError **error) { GnomeDesktopItem *item; int result; gnome_vfs_init(); /* gnome desktop item uses it internally */ item = find_desktop_item(desktop_name); if (item == NULL) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_FAILED, "Could not find the file %s.desktop needed to start this application", desktop_name); return FALSE; } result = gnome_desktop_item_launch_on_screen(item, NULL, 0, screen, -1, error); gnome_desktop_item_unref(item); if (result < 0) { return FALSE; } else { return TRUE; } }
static void box_weak_cb (gpointer user_data, GObject *box) { GnomeDesktopItem *item; item = (GnomeDesktopItem *) user_data; gnome_desktop_item_unref (item); }
void panel_util_launch_from_key_file (GKeyFile *keyfile, GList *file_list, GdkScreen *screen, GError **error) { GnomeDesktopItem *ditem; int i; static const char *keys [] = { "Type", "Exec", "URL", "Dev", "Path", "Terminal", "TerminalOptions", "StartupNotify", "StartupWMClass", }; static const char *locale_keys [] = { "Name", "GenericName", "Icon", "MiniIcon", }; g_return_if_fail (keyfile != NULL); ditem = gnome_desktop_item_new (); if (ditem == NULL) return; for (i = 0; i < G_N_ELEMENTS (keys); i++) { char *value; value = panel_util_key_file_get_string (keyfile, keys [i]); if (value != NULL) { gnome_desktop_item_set_string (ditem, keys [i], value); g_free (value); } } for (i = 0; i < G_N_ELEMENTS (locale_keys); i++) { char *value; value = panel_util_key_file_get_locale_string (keyfile, locale_keys [i]); if (value != NULL) { gnome_desktop_item_set_string (ditem, locale_keys [i], value); g_free (value); } } panel_ditem_launch (ditem, file_list, screen, error); gnome_desktop_item_unref (ditem); }
static void fm_ditem_page_exec_drag_data_received (GtkWidget *widget, GdkDragContext *context, int x, int y, GtkSelectionData *selection_data, guint info, guint time, GtkEntry *entry) { char **uris; gboolean exactly_one; NautilusFile *file; GnomeDesktopItem *item; char *uri; const char *exec; uris = g_strsplit (selection_data->data, "\r\n", 0); exactly_one = uris[0] != NULL && (uris[1] == NULL || uris[1][0] == '\0'); if (!exactly_one) { g_strfreev (uris); return; } file = nautilus_file_get_by_uri (uris[0]); g_return_if_fail (file != NULL); uri = nautilus_file_get_uri (file); if (nautilus_file_is_mime_type (file, "application/x-desktop")) { item = gnome_desktop_item_new_from_uri (uri, GNOME_DESKTOP_ITEM_LOAD_ONLY_IF_EXISTS, NULL); if (item != NULL && gnome_desktop_item_get_entry_type (item) == GNOME_DESKTOP_ITEM_TYPE_APPLICATION) { exec = gnome_desktop_item_get_string (item, GNOME_DESKTOP_ITEM_EXEC); gtk_entry_set_text (entry, exec?exec:""); gnome_desktop_item_unref (item); gtk_widget_grab_focus (GTK_WIDGET (entry)); } } else { gtk_entry_set_text (entry, uri?uri:""); } g_free (uri); nautilus_file_unref (file); g_strfreev (uris); }