From adb8fd2f3b45ea9be616686229df78dc936509f6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sep 06 2007 16:59:35 +0000 Subject: add new patches --- diff --git a/desktop-file-monitoring.patch b/desktop-file-monitoring.patch new file mode 100644 index 0000000..411f95e --- /dev/null +++ b/desktop-file-monitoring.patch @@ -0,0 +1,277 @@ +diff -up gnome-panel-2.19.92/gnome-panel/launcher.h.desktop-file-monitoring gnome-panel-2.19.92/gnome-panel/launcher.h +--- gnome-panel-2.19.92/gnome-panel/launcher.h.desktop-file-monitoring 2007-09-04 13:34:26.000000000 -0400 ++++ gnome-panel-2.19.92/gnome-panel/launcher.h 2007-09-05 23:24:37.000000000 -0400 +@@ -13,6 +13,7 @@ + + #include "applet.h" + #include "panel-widget.h" ++#include + + G_BEGIN_DECLS + +@@ -29,6 +30,8 @@ typedef struct { + GSList *error_dialogs; + + gulong destroy_handler; ++ ++ GnomeVFSMonitorHandle *monitor; + } Launcher; + + void panel_launcher_create (PanelToplevel *toplevel, +diff -up gnome-panel-2.19.92/gnome-panel/panel-ditem-editor.h.desktop-file-monitoring gnome-panel-2.19.92/gnome-panel/panel-ditem-editor.h +--- gnome-panel-2.19.92/gnome-panel/panel-ditem-editor.h.desktop-file-monitoring 2007-09-04 13:34:26.000000000 -0400 ++++ gnome-panel-2.19.92/gnome-panel/panel-ditem-editor.h 2007-09-05 23:24:37.000000000 -0400 +@@ -101,6 +101,8 @@ void panel_ditem_editor_set_uri (PanelDI + const char *uri); + + G_CONST_RETURN char *panel_ditem_editor_get_uri (PanelDItemEditor *dialog); ++G_CONST_RETURN char *panel_ditem_editor_get_orig_desktop_file (PanelDItemEditor *dialog); ++ + + void panel_ditem_register_save_uri_func (PanelDItemEditor *dialog, + PanelDitemSaveUri save_uri, +diff -up gnome-panel-2.19.92/gnome-panel/launcher.c.desktop-file-monitoring gnome-panel-2.19.92/gnome-panel/launcher.c +--- gnome-panel-2.19.92/gnome-panel/launcher.c.desktop-file-monitoring 2007-09-04 13:34:26.000000000 -0400 ++++ gnome-panel-2.19.92/gnome-panel/launcher.c 2007-09-06 00:33:52.000000000 -0400 +@@ -285,6 +287,8 @@ static void + destroy_launcher (GtkWidget *widget, + Launcher *launcher) + { ++ if (launcher->monitor) ++ gnome_vfs_monitor_cancel (launcher->monitor); + launcher_properties_destroy (launcher); + launcher_widget_destroy_open_dialogs (launcher); + } +@@ -458,6 +462,37 @@ drag_data_get_cb (GtkWidget *widg + + } + ++static void setup_button (Launcher *launcher); ++ ++static void ++desktop_file_changed (GnomeVFSMonitorHandle *handle, ++ const gchar *monitor_uri, ++ const gchar *info_uri, ++ GnomeVFSMonitorEventType event_type, ++ gpointer user_data) ++{ ++ Launcher *launcher = user_data; ++ GKeyFile *key_file; ++ ++ if (event_type == GNOME_VFS_MONITOR_EVENT_CHANGED || ++ event_type == GNOME_VFS_MONITOR_EVENT_CREATED) { ++ gchar *path; ++ ++ path = gnome_vfs_get_local_path_from_uri (monitor_uri); ++ ++ key_file = g_key_file_new (); ++ if (g_key_file_load_from_file (key_file, path, ++ G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, ++ NULL)) { ++ g_key_file_free (launcher->key_file); ++ launcher->key_file = key_file; ++ setup_button (launcher); ++ } ++ ++ g_free (path); ++ } ++} ++ + static Launcher * + create_launcher (const char *location) + { +@@ -534,6 +569,25 @@ create_launcher (const char *location) + launcher->key_file = key_file; + launcher->prop_dialog = NULL; + launcher->destroy_handler = 0; ++ launcher->monitor = NULL; ++ ++ /* Watch for changes to the desktop file. Since we don't want ++ * to do this for every launcher, we only do it if the desktop ++ * file contains a X-Panel-Monitor entry. ++ */ ++ if (g_key_file_get_boolean (key_file, "Desktop Entry", "X-Panel-Monitor", NULL)) { ++ gchar *uri; ++ ++ ++ ++ uri = g_strdup_printf ("file:%s", new_location); ++ gnome_vfs_monitor_add (&launcher->monitor, ++ uri, ++ GNOME_VFS_MONITOR_FILE, ++ desktop_file_changed, ++ launcher); ++ g_free (uri); ++ } + + /* Icon will be setup later */ + launcher->button = button_widget_new (NULL /* icon */, +@@ -662,6 +716,15 @@ static void + launcher_changed (PanelDItemEditor *dialog, + Launcher *launcher) + { ++ /* If the user manually changes launcher properties, ++ * we stop monitoring the desktop file to not overwrite ++ * user changes. ++ */ ++ if (launcher->monitor) { ++ gnome_vfs_monitor_cancel (launcher->monitor); ++ launcher->monitor = NULL; ++ } ++ + /* Setup the button look */ + setup_button (launcher); + } +@@ -733,6 +796,43 @@ launcher_save_uri (PanelDItemEditor *dia + return NULL; + } + ++static const char * ++desktop_file_to_monitor (PanelDItemEditor *editor) ++{ ++ const char *entry; ++ GKeyFile *key_file; ++ ++ /* When the user selects a desktop file in the ditem editor, ++ * start monitoring the desktop file for changes. ++ */ ++ entry = panel_ditem_editor_get_orig_desktop_file (editor); ++ if (entry) { ++ key_file = g_key_file_new (); ++ if (!g_key_file_load_from_file (key_file, entry, 0, NULL) || ++ !panel_util_key_file_get_boolean (key_file, "X-Panel-Monitor", FALSE)) ++ entry = NULL; ++ g_key_file_free (key_file); ++ } ++ ++ return entry; ++} ++ ++static void ++start_monitoring (Launcher *launcher) ++{ ++ gchar *uri; ++ ++ uri = g_strdup_printf ("file:%s", launcher->location); ++ if (launcher->monitor) ++ gnome_vfs_monitor_cancel (launcher->monitor); ++ gnome_vfs_monitor_add (&launcher->monitor, ++ uri, ++ GNOME_VFS_MONITOR_FILE, ++ desktop_file_changed, ++ launcher); ++ g_free (uri); ++} ++ + static void + launcher_saved (GtkWidget *dialog, + Launcher *launcher) +@@ -740,11 +840,15 @@ launcher_saved (GtkWidget *dialog, + const char *uri; + GConfClient *client; + const char *key; ++ const char *path; + + uri = panel_ditem_editor_get_uri (PANEL_DITEM_EDITOR (dialog)); + if (panel_launcher_get_filename (uri) != NULL) + uri = panel_launcher_get_filename (uri); + ++ if ((path = desktop_file_to_monitor (PANEL_DITEM_EDITOR (dialog))) != NULL) ++ uri = path; ++ + if (uri && launcher->location && strcmp (uri, launcher->location)) { + client = panel_gconf_get_client (); + +@@ -757,6 +861,9 @@ launcher_saved (GtkWidget *dialog, + if (launcher->location) + g_free (launcher->location); + launcher->location = g_strdup (uri); ++ ++ if (path) ++ start_monitoring (launcher); + } + } + +@@ -923,6 +1030,7 @@ launcher_new_saved (GtkWidget *dialog, + PanelWidget *panel; + int pos; + const char *uri; ++ const char *path; + + pos = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), "pos")); + panel = g_object_get_data (G_OBJECT (dialog), "panel"); +@@ -930,6 +1038,10 @@ launcher_new_saved (GtkWidget *dialog, + uri = panel_ditem_editor_get_uri (PANEL_DITEM_EDITOR (dialog)); + if (panel_launcher_get_filename (uri) != NULL) + uri = panel_launcher_get_filename (uri); ++ ++ if ((path = desktop_file_to_monitor (PANEL_DITEM_EDITOR (dialog))) != NULL) ++ uri = path; ++ + panel_launcher_create (panel->toplevel, pos, uri); + } + +diff -up gnome-panel-2.19.92/gnome-panel/panel-ditem-editor.c.desktop-file-monitoring gnome-panel-2.19.92/gnome-panel/panel-ditem-editor.c +--- gnome-panel-2.19.92/gnome-panel/panel-ditem-editor.c.desktop-file-monitoring 2007-09-05 23:24:37.000000000 -0400 ++++ gnome-panel-2.19.92/gnome-panel/panel-ditem-editor.c 2007-09-05 23:24:37.000000000 -0400 +@@ -80,6 +80,8 @@ struct _PanelDItemEditorPrivate + + /* the directory of the theme for the icon, see bug #119208 */ + char *icon_theme_dir; ++ ++ char *orig_desktop_file; + }; + + /* Time in seconds after which we save the file on the disk */ +@@ -367,6 +369,10 @@ panel_ditem_editor_destroy (GtkObject *o + g_free (dialog->priv->icon_theme_dir); + dialog->priv->icon_theme_dir = NULL; + ++ if (dialog->priv->orig_desktop_file != NULL) ++ g_free (dialog->priv->orig_desktop_file); ++ dialog->priv->orig_desktop_file = NULL; ++ + GTK_OBJECT_CLASS (panel_ditem_editor_parent_class)->destroy (object); + } + +@@ -833,6 +839,13 @@ panel_ditem_editor_changed (PanelDItemEd + TRUE); + } + ++ /* When the user changes any fields, unset the orig_desktop_file ++ * field since the editor contents are not entirely from a desktop ++ * file anymore. ++ */ ++ g_free (dialog->priv->orig_desktop_file); ++ dialog->priv->orig_desktop_file = NULL; ++ + dialog->priv->dirty = TRUE; + g_signal_emit (G_OBJECT (dialog), ditem_edit_signals[CHANGED], 0); + } +@@ -1003,6 +1016,13 @@ update_editor_from_desktop_file (PanelDI + */ + setup_icon_entry (dialog, icon); + ++ /* We set the orig_desktop_file field to let the ++ * launcher know that the editor contents are coming ++ * directly from a desktop file. ++ */ ++ g_free (dialog->priv->orig_desktop_file); ++ dialog->priv->orig_desktop_file = g_strdup (uri); ++ + return TRUE; + } + +@@ -1826,3 +1846,12 @@ panel_ditem_register_save_uri_func (Pane + dialog->priv->save_uri = save_uri; + dialog->priv->save_uri_data = data; + } ++ ++G_CONST_RETURN char * ++panel_ditem_editor_get_orig_desktop_file (PanelDItemEditor *dialog) ++{ ++ g_return_val_if_fail (PANEL_IS_DITEM_EDITOR (dialog), NULL); ++ ++ return dialog->priv->orig_desktop_file; ++} ++ diff --git a/launcher-desktop-files.patch b/launcher-desktop-files.patch new file mode 100644 index 0000000..4d1d92a --- /dev/null +++ b/launcher-desktop-files.patch @@ -0,0 +1,71 @@ +diff -up gnome-panel-2.19.6/gnome-panel/panel-ditem-editor.c.launcher-desktop-file gnome-panel-2.19.6/gnome-panel/panel-ditem-editor.c +--- gnome-panel-2.19.6/gnome-panel/panel-ditem-editor.c.launcher-desktop-file 2007-08-28 00:20:51.000000000 -0400 ++++ gnome-panel-2.19.6/gnome-panel/panel-ditem-editor.c 2007-08-28 00:20:57.000000000 -0400 +@@ -973,6 +973,42 @@ panel_ditem_editor_icon_changed (PanelDI + g_free (file); + } + ++static gboolean ++update_editor_from_desktop_file (PanelDItemEditor *dialog, ++ const gchar *uri) ++{ ++ GKeyFile *key_file; ++ char *name; ++ char *comment; ++ char *exec; ++ char *icon; ++ ++ key_file = g_key_file_new (); ++ if (g_key_file_load_from_file (key_file, uri, 0, NULL)) { ++ if (panel_util_key_file_get_boolean (key_file, "Terminal", FALSE)) ++ gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->priv->type_combo), 1); ++ else ++ gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->priv->type_combo), 0); ++ ++ name = panel_util_key_file_get_locale_string (key_file, "Name"); ++ comment = panel_util_key_file_get_locale_string (key_file, "Comment"); ++ icon = panel_util_key_file_get_locale_string (key_file, "Icon"); ++ exec = panel_util_key_file_get_string (key_file, "Exec"); ++ ++ gtk_entry_set_text (GTK_ENTRY (dialog->priv->name_entry), name ? name : ""); ++ gtk_entry_set_text (GTK_ENTRY (dialog->priv->comment_entry), comment ? comment : ""); ++ gtk_entry_set_text (GTK_ENTRY (dialog->priv->command_entry), exec ? exec : ""); ++ /* Note: we need to set the icon last, since the editor ++ * tries to guess the icon when the command is modified ++ */ ++ setup_icon_entry (dialog, icon); ++ ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ + static void + command_browse_chooser_response (GtkFileChooser *chooser, + gint response_id, +@@ -986,7 +1022,11 @@ command_browse_chooser_response (GtkFile + case PANEL_DITEM_EDITOR_TYPE_APPLICATION: + case PANEL_DITEM_EDITOR_TYPE_TERMINAL_APPLICATION: + text = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); +- uri = panel_util_make_exec_uri_for_desktop (text); ++ if (g_str_has_suffix (text, ".desktop") && ++ update_editor_from_desktop_file (dialog, text)) ++ uri = NULL; ++ else ++ uri = panel_util_make_exec_uri_for_desktop (text); + g_free (text); + break; + case PANEL_DITEM_EDITOR_TYPE_LINK: +@@ -996,8 +1036,9 @@ command_browse_chooser_response (GtkFile + g_assert_not_reached (); + } + +- gtk_entry_set_text (GTK_ENTRY (dialog->priv->command_entry), +- uri); ++ if (uri) ++ gtk_entry_set_text (GTK_ENTRY (dialog->priv->command_entry), ++ uri); + g_free (uri); + } + diff --git a/preferred-apps.patch b/preferred-apps.patch new file mode 100644 index 0000000..0bff680 --- /dev/null +++ b/preferred-apps.patch @@ -0,0 +1,240 @@ +diff -up gnome-panel-2.19.6/gnome-panel/main.c.preferred-apps gnome-panel-2.19.6/gnome-panel/main.c +--- gnome-panel-2.19.6/gnome-panel/main.c.preferred-apps 2007-08-28 01:01:57.000000000 -0400 ++++ gnome-panel-2.19.6/gnome-panel/main.c 2007-08-28 01:02:42.000000000 -0400 +@@ -26,6 +26,7 @@ + #include "panel-action-protocol.h" + #include "panel-lockdown.h" + #include "panel-icon-names.h" ++#include "launcher.h" + #include "xstuff.h" + + #include "nothing.cP" +@@ -81,6 +82,7 @@ main (int argc, char **argv) + GCONF_CLIENT_PRELOAD_NONE, + NULL); + ++ panel_preferred_apps_init (); + panel_global_config_load (); + panel_lockdown_init (); + panel_profile_load (); +diff -up gnome-panel-2.19.6/gnome-panel/launcher.c.preferred-apps gnome-panel-2.19.6/gnome-panel/launcher.c +--- gnome-panel-2.19.6/gnome-panel/launcher.c.preferred-apps 2007-08-28 00:49:14.000000000 -0400 ++++ gnome-panel-2.19.6/gnome-panel/launcher.c 2007-08-28 01:01:47.000000000 -0400 +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #include "launcher.h" + +@@ -39,6 +40,7 @@ + #include "panel-compatibility.h" + #include "panel-ditem-editor.h" + #include "panel-icon-names.h" ++#include "panel-run-dialog.h" + + static GdkScreen * + launcher_get_screen (Launcher *launcher) +@@ -1264,3 +1266,166 @@ panel_launcher_set_dnd_enabled (Launcher + } else + gtk_drag_source_unset (launcher->button); + } ++ ++static gchar * ++find_desktop_file_from_exec (const gchar *exec) ++{ ++ GSList *all_applications, *l; ++ gchar *path = NULL; ++ gchar **tokens, **tokens2; ++ gint i, match = 0; ++ ++ /* FIXME no need to construct a humongous list here */ ++ all_applications = get_all_applications (); ++ ++ for (l = all_applications; l; l = l->next) { ++ GMenuTreeEntry *entry = l->data; ++ const char *entry_exec; ++ ++ entry_exec = gmenu_tree_entry_get_exec (entry); ++ ++ if (strcmp (exec, entry_exec) == 0) { ++ path = gmenu_tree_entry_get_desktop_file_path (entry); ++ break; ++ } ++ ++ tokens = g_strsplit (exec, " ", -1); ++ tokens2 = g_strsplit (entry_exec, " ", -1); ++ ++ for (i = 0; tokens[i] && tokens2[i]; i++) { ++ if (strcmp (tokens[i], tokens2[i]) != 0) ++ break; ++ } ++ if (i > match) { ++ match = i; ++ path = gmenu_tree_entry_get_desktop_file_path (entry); ++ } ++ ++ g_strfreev (tokens); ++ g_strfreev (tokens2); ++ } ++ ++ path = g_strdup (path); ++ g_slist_free (all_applications); ++ ++ return path; ++} ++ ++static void ++update_preferred_app (const gchar *filename, ++ const gchar *key, ++ const gchar *exec) ++{ ++ gchar *location; ++ GKeyFile *key_file; ++ GError *error = NULL; ++ gchar *data; ++ gsize len; ++ gboolean needs_terminal; ++ ++ location = find_desktop_file_from_exec (exec); ++ key_file = g_key_file_new (); ++ if (!panel_util_key_file_load_from_uri (key_file, location, ++ G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, ++ NULL)) { ++ /* FIXME would be much better if preferred apps were backed by desktop files */ ++ g_key_file_set_string (key_file, "Desktop Entry", "Version", "1.0"); ++ g_key_file_set_string (key_file, "Desktop Entry", "Encoding", "UTF-8"); ++ g_key_file_set_string (key_file, "Desktop Entry", "Type", "Application"); ++ g_key_file_set_string (key_file, "Desktop Entry", "Exec", exec); ++ if (strstr (key, "http")) { ++ g_key_file_set_string (key_file, "Desktop Entry", "Name", "Preferred Web Browser"); ++ g_key_file_set_string (key_file, "Desktop Entry", "GenericName", "Web Browser"); ++ g_key_file_set_string (key_file, "Desktop Entry", "Comment", "Browse the Web"); ++ g_key_file_set_string (key_file, "Desktop Entry", "Icon", "redhat-web-browser.png"); ++ } ++ else if (strstr (key, "mailto")) { ++ g_key_file_set_string (key_file, "Desktop Entry", "Name", "Preferred Mail Reader"); ++ g_key_file_set_string (key_file, "Desktop Entry", "GenericName", "Mail Reader"); ++ g_key_file_set_string (key_file, "Desktop Entry", "Comment", "Send email"); ++ g_key_file_set_string (key_file, "Desktop Entry", "Icon", "redhat-email.png"); ++ } ++ if (g_str_has_suffix (key, "command")) { ++ int len; ++ char *key2; ++ ++ len = strlen (key); ++ key2 = g_new (char, len - strlen ("command") + strlen ("needs_terminal") + 1); ++ strncpy (key2, key, len - strlen ("command")); ++ strcpy (key2 + len - strlen ("command"), "needs_terminal"); ++ needs_terminal = gconf_client_get_bool (panel_gconf_get_client (), ++ key2, ++ NULL); ++ g_free (key2); ++ } ++ else ++ needs_terminal = FALSE; ++ g_key_file_set_boolean (key_file, "Desktop Entry", "Terminal", needs_terminal); ++ } ++ ++ g_free (location); ++ ++ g_key_file_set_boolean (key_file, "Desktop Entry", "X-Panel-Monitor", TRUE); ++ g_key_file_set_boolean (key_file, "Desktop Entry", "NoDisplay", TRUE); ++ ++ data = g_key_file_to_data (key_file, &len, &error); ++ if (error) { ++ g_printerr (_("Failed to convert data for '%s': %s"), ++ filename, error->message); ++ g_error_free (error); ++ g_key_file_free (key_file); ++ ++ return; ++ } ++ if (!g_file_set_contents (filename, data, len, &error)) { ++ g_printerr (_("Failed to save '%s': %s"), ++ filename, error->message); ++ g_error_free (error); ++ } ++ ++ g_key_file_free (key_file); ++ g_free (data); ++} ++ ++static void ++preferred_app_changed (GConfClient *client, ++ gint notify_id, ++ GConfEntry *entry, ++ const gchar *filename) ++{ ++ update_preferred_app (filename, ++ gconf_entry_get_key (entry), ++ gconf_value_get_string (entry->value)); ++} ++ ++void ++panel_preferred_apps_init (void) ++{ ++ GConfClient *client; ++ gchar *filename, *exec; ++ gint i; ++ ++ const gchar *keys[] = { ++ "/desktop/gnome/url-handlers/http/command", ++ "/desktop/gnome/url-handlers/mailto/command", ++ NULL }; ++ const gchar *files[] = { ++ "preferred-web-browser.desktop", ++ "preferred-mail-reader.desktop", ++ NULL }; ++ ++ client = panel_gconf_get_client (); ++ ++ for (i = 0; keys[i]; i++) { ++ filename = g_build_filename (g_get_user_data_dir (), ++ "applications", files[i], NULL); ++ if (!g_file_test (filename, G_FILE_TEST_EXISTS)) { ++ exec = gconf_client_get_string (client, keys[i], NULL); ++ update_preferred_app (filename, keys[i], exec); ++ g_free (exec); ++ } ++ gconf_client_notify_add (client, keys[i], ++ (GConfClientNotifyFunc) preferred_app_changed, ++ filename, g_free, NULL); ++ } ++} +diff -up gnome-panel-2.19.6/gnome-panel/launcher.h.preferred-apps gnome-panel-2.19.6/gnome-panel/launcher.h +--- gnome-panel-2.19.6/gnome-panel/launcher.h.preferred-apps 2007-08-28 00:46:47.000000000 -0400 ++++ gnome-panel-2.19.6/gnome-panel/launcher.h 2007-08-28 00:47:10.000000000 -0400 +@@ -75,6 +75,7 @@ void launcher_properties_dest + void panel_launcher_set_dnd_enabled (Launcher *launcher, + gboolean dnd_enabled); + ++void panel_preferred_apps_init (void); + + G_END_DECLS + +diff -up gnome-panel-2.19.6/gnome-panel/panel-run-dialog.h.preferred-apps gnome-panel-2.19.6/gnome-panel/panel-run-dialog.h +--- gnome-panel-2.19.6/gnome-panel/panel-run-dialog.h.preferred-apps 2007-08-28 00:48:11.000000000 -0400 ++++ gnome-panel-2.19.6/gnome-panel/panel-run-dialog.h 2007-08-28 00:48:34.000000000 -0400 +@@ -32,6 +32,8 @@ G_BEGIN_DECLS + void panel_run_dialog_present (GdkScreen *screen, + guint32 activate_time); + ++GSList *get_all_applications (void); ++ + G_END_DECLS + + #endif /* __PANEL_RUN_DIALOG_H__ */ +diff -up gnome-panel-2.19.6/gnome-panel/panel-run-dialog.c.preferred-apps gnome-panel-2.19.6/gnome-panel/panel-run-dialog.c +--- gnome-panel-2.19.6/gnome-panel/panel-run-dialog.c.preferred-apps 2007-08-28 00:47:26.000000000 -0400 ++++ gnome-panel-2.19.6/gnome-panel/panel-run-dialog.c 2007-08-28 00:47:51.000000000 -0400 +@@ -813,7 +813,7 @@ get_all_applications_from_dir (GMenuTree + return list; + } + +-static GSList * ++GSList * + get_all_applications (void) + { + GMenuTree *tree;