char * panel_make_unique_desktop_path_from_name (const char *dir, const char *name) { int num = 1; char *path = NULL; #ifndef NAME_MAX /* sigh: some OS don't have NAME_MAX (which is POSIX). */ #ifdef MAXNAMLEN #define NAME_MAX MAXNAMLEN #else #define NAME_MAX 255 #endif #endif char filename[NAME_MAX]; /* g_file_set_contents() use "%s.XXXXXX" * FIXME: waiting for http://bugzilla.gnome.org/show_bug.cgi?id=437977 */ #define LENGTH_FOR_TMPFILE_EXT 7 g_snprintf (filename, sizeof (filename) - strlen (".desktop") - LENGTH_FOR_TMPFILE_EXT, "%s", name); g_strlcat (filename, ".desktop", sizeof (filename)); path = panel_make_full_path (dir, filename); if (!g_file_test (path, G_FILE_TEST_EXISTS)) return path; g_free (path); while (TRUE) { char *buf; buf = g_strdup_printf ("-%d.desktop", num); g_snprintf (filename, sizeof (filename) - strlen (buf) - LENGTH_FOR_TMPFILE_EXT, "%s", name); g_strlcat (filename, buf, sizeof (filename)); g_free (buf); path = panel_make_full_path (dir, filename); if (!g_file_test (path, G_FILE_TEST_EXISTS)) return path; g_free (path); num++; } return NULL; }
static char * panel_launcher_find_writable_uri (const char *launcher_location, const char *source) { char *path; char *uri; if (!launcher_location) return panel_make_unique_desktop_uri (NULL, source); if (!strchr (launcher_location, G_DIR_SEPARATOR)) { path = panel_make_full_path (NULL, launcher_location); uri = g_filename_to_uri (path, NULL, NULL); g_free (path); return uri; } if (panel_launcher_get_filename (launcher_location) != NULL) { /* we have a file in the user directory. We either have a path * or an URI */ if (g_path_is_absolute (launcher_location)) return g_filename_to_uri (launcher_location, NULL, NULL); else return g_strdup (launcher_location); } return panel_make_unique_desktop_uri (NULL, source); }
GFile * panel_launcher_get_gfile (const char *location) { char *path; GFile *file; if (!g_ascii_strncasecmp (location, "file:", strlen ("file:"))) return g_file_new_for_uri (location); if (g_path_is_absolute (location)) return g_file_new_for_path (location); path = panel_make_full_path (NULL, location); file = g_file_new_for_path (path); g_free (path); return file; }
char * panel_launcher_get_uri (const char *location) { char *path; char *uri; if (!g_ascii_strncasecmp (location, "file:", strlen ("file:"))) return g_strdup (location); if (!g_path_is_absolute (location)) path = panel_make_full_path (NULL, location); else path = g_strdup (location); uri = g_filename_to_uri (path, NULL, NULL); g_free (path); return uri; }
static Launcher * create_launcher (const char *location) { GKeyFile *key_file; char *scheme; gboolean is_uri; gboolean loaded; Launcher *launcher; GError *error = NULL; char *new_location; if (!location) { g_printerr (_("No URI provided for panel launcher desktop file\n")); return NULL; } new_location = NULL; key_file = g_key_file_new (); scheme = g_uri_parse_scheme (location); is_uri = scheme != NULL; g_free (scheme); if (!is_uri && !g_path_is_absolute (location)) { /* try to first load a file in our config directory, and if it * doesn't exist there, try to find it in the xdg data dirs */ char *path; path = panel_make_full_path (NULL, location); if (!g_file_test (path, G_FILE_TEST_EXISTS)) { g_free (path); path = panel_g_lookup_in_applications_dirs (location); /* it's important to keep the full path if the desktop * file comes from a data dir: when the user will edit * it, we'll want to save it in PANEL_LAUNCHERS_PATH * with a random name (and not evolution.desktop, eg) * and having only a basename as location will make * this impossible */ if (path) new_location = g_strdup (path); } if (path) { loaded = g_key_file_load_from_file (key_file, path, G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error); g_free (path); } else { loaded = FALSE; } } else loaded = panel_key_file_load_from_uri (key_file, location, G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error); if (!loaded) { g_printerr (_("Unable to open desktop file %s for panel launcher%s%s\n"), location, error ? ": " : "", error ? error->message : ""); if (error) g_error_free (error); g_key_file_free (key_file); return NULL; /*button is null*/ } if (!new_location) new_location = g_strdup (location); launcher = g_new0 (Launcher, 1); launcher->info = NULL; launcher->button = NULL; launcher->location = new_location; launcher->key_file = key_file; launcher->prop_dialog = NULL; launcher->destroy_handler = 0; /* Icon will be setup later */ launcher->button = button_widget_new (NULL /* icon */, FALSE, PANEL_ORIENTATION_TOP); gtk_widget_show (launcher->button); /*gtk_drag_dest_set (GTK_WIDGET (launcher->button), GTK_DEST_DEFAULT_ALL, dnd_targets, 2, GDK_ACTION_COPY);*/ gtk_drag_dest_set (GTK_WIDGET (launcher->button), 0, NULL, 0, 0); g_signal_connect (launcher->button, "drag_data_get", G_CALLBACK (drag_data_get_cb), launcher); g_signal_connect (launcher->button, "drag_data_received", G_CALLBACK (drag_data_received_cb), launcher); g_signal_connect (launcher->button, "drag_motion", G_CALLBACK (drag_motion_cb), launcher); g_signal_connect (launcher->button, "drag_drop", G_CALLBACK (drag_drop_cb), launcher); g_signal_connect (launcher->button, "drag_leave", G_CALLBACK (drag_leave_cb), launcher); g_signal_connect_swapped (launcher->button, "clicked", G_CALLBACK (launcher_launch), launcher); launcher->destroy_handler = g_signal_connect (launcher->button, "destroy", G_CALLBACK (destroy_launcher), launcher); return launcher; }