rpms/gnome-panel/devel desktop-file-monitoring.patch, NONE, 1.1 launcher-desktop-files.patch, NONE, 1.1 preferred-apps.patch, NONE, 1.1
Matthias Clasen (mclasen)
fedora-extras-commits at redhat.com
Thu Sep 6 16:59:37 UTC 2007
Author: mclasen
Update of /cvs/extras/rpms/gnome-panel/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv14451
Added Files:
desktop-file-monitoring.patch launcher-desktop-files.patch
preferred-apps.patch
Log Message:
add new patches
desktop-file-monitoring.patch:
--- NEW FILE desktop-file-monitoring.patch ---
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 <libgnomevfs/gnome-vfs.h>
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;
+}
+
launcher-desktop-files.patch:
--- NEW FILE launcher-desktop-files.patch ---
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);
}
preferred-apps.patch:
--- NEW FILE preferred-apps.patch ---
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 <libgnomeui/gnome-url.h>
#include <libgnomevfs/gnome-vfs.h>
#include <gdk/gdkx.h>
+#include <gmenu-tree.h>
#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;
More information about the fedora-extras-commits
mailing list