diff options
| author | infirit <[email protected]> | 2014-07-28 15:15:47 +0200 | 
|---|---|---|
| committer | infirit <[email protected]> | 2014-07-28 15:15:47 +0200 | 
| commit | 0dc76c03d545792ae0c90487edff633a94bf87f4 (patch) | |
| tree | 72969a8e3b0e31d95927787231d8bae5fd6e485f /src | |
| parent | 93e9ca48a5a6a5b2cbab373fa12632ef9852d60b (diff) | |
| download | eom-0dc76c03d545792ae0c90487edff633a94bf87f4.tar.bz2 eom-0dc76c03d545792ae0c90487edff633a94bf87f4.tar.xz  | |
Add "Edit Image" toolbar button
Add a conditionally-enabled "Edit Image" toolbar button.  The toolbar is
only enabled if a specific image editor is specified in GSettings.
Eog bug https://bugzilla.gnome.org/show_bug.cgi?id=609958
Based on eog commit b5e6b7d31181ab87f788921f751a6550bddb5bcf
From Ryan Lortie <[email protected]>
Diffstat (limited to 'src')
| -rw-r--r-- | src/eom-config-keys.h | 1 | ||||
| -rw-r--r-- | src/eom-window.c | 121 | 
2 files changed, 122 insertions, 0 deletions
diff --git a/src/eom-config-keys.h b/src/eom-config-keys.h index f91295a..cfc2ede 100644 --- a/src/eom-config-keys.h +++ b/src/eom-config-keys.h @@ -67,6 +67,7 @@  #define EOM_CONF_UI_DISABLE_TRASH_CONFIRMATION  "disable-trash-confirmation"  #define EOM_CONF_UI_FILECHOOSER_XDG_FALLBACK    "filechooser-xdg-fallback"  #define EOM_CONF_UI_PROPSDIALOG_NETBOOK_MODE    "propsdialog-netbook-mode" +#define EOM_CONF_UI_EXTERNAL_EDITOR             "external-editor"  #define EOM_CONF_PLUGINS_ACTIVE_PLUGINS         "active-plugins" diff --git a/src/eom-window.c b/src/eom-window.c index 7daa08f..3efc91a 100644 --- a/src/eom-window.c +++ b/src/eom-window.c @@ -65,6 +65,7 @@  #include <glib/gi18n.h>  #include <gio/gio.h>  #include <gdk/gdkkeysyms.h> +#include <gio/gdesktopappinfo.h>  #include <gtk/gtk.h>  #if HAVE_LCMS @@ -213,6 +214,7 @@ static void eom_window_list_store_image_removed (GtkTreeModel *tree_model,  static void eom_window_set_wallpaper (EomWindow *window, const gchar *filename, const gchar *visible_filename);  static gboolean eom_window_save_images (EomWindow *window, GList *images);  static void eom_window_finish_saving (EomWindow *window); +static GAppInfo *get_appinfo_for_editor (EomWindow *window);  static GQuark  eom_window_error_quark (void) @@ -926,6 +928,8 @@ open_with_launch_application_cb (GtkAction *action, gpointer data) {  static void  eom_window_update_openwith_menu (EomWindow *window, EomImage *image)  { +	gboolean edit_button_active; +	GAppInfo *editor_app;  	GFile *file;  	GFileInfo *file_info;  	GList *iter; @@ -941,6 +945,9 @@ eom_window_update_openwith_menu (EomWindow *window, EomImage *image)  	priv = window->priv; +	edit_button_active = FALSE; +	editor_app = get_appinfo_for_editor (window); +  	file = eom_image_get_file (image);  	file_info = g_file_query_info (file,  				       G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, @@ -983,6 +990,10 @@ eom_window_update_openwith_menu (EomWindow *window, EomImage *image)                  GAppInfo *app = iter->data;                  gchar name[64]; +                if (g_app_info_equal (editor_app, app)) { +                        edit_button_active = TRUE; +                } +                  /* Do not include eom itself */                  if (g_ascii_strcasecmp (g_app_info_get_executable (app),                                          g_get_prgname ()) == 0) { @@ -1070,6 +1081,12 @@ eom_window_update_openwith_menu (EomWindow *window, EomImage *image)          }          g_list_free (apps); + +        action = gtk_action_group_get_action (window->priv->actions_image, +                                              "OpenEditor"); +        if (action != NULL) { +                gtk_action_set_sensitive (action, edit_button_active); +        }  }  static void @@ -4129,6 +4146,108 @@ eom_window_finish_saving (EomWindow *window)  	} while (priv->save_job != NULL);  } +static GAppInfo * +get_appinfo_for_editor (EomWindow *window) +{ +	/* We want this function to always return the same thing, not +	 * just for performance reasons, but because if someone edits +	 * GConf while eom is running, the application could get into an +	 * inconsistent state.  If the editor exists once, it gets added +	 * to the "available" list of the EggToolbarsModel (for which +	 * there is no API to remove it).  If later the editor no longer +	 * existed when constructing a new window, we'd be unable to +	 * construct a GtkAction for the editor for that window, causing +	 * assertion failures when viewing the "Edit Toolbars" dialog +	 * (item is available, but can't find the GtkAction for it). +	 * +	 * By ensuring we keep the GAppInfo around, we avoid the +	 * possibility of that situation occuring. +	 */ +	static GDesktopAppInfo *app_info = NULL; +	static gboolean initialised; + +	if (!initialised) { +		gchar *editor; + +		editor = g_settings_get_string (window->priv->ui_settings, +		                                EOM_CONF_UI_EXTERNAL_EDITOR); + +		if (editor != NULL) { +			app_info = g_desktop_app_info_new (editor); +		} + +		initialised = TRUE; +		g_free (editor); +	} + +	return (GAppInfo *) app_info; +} + +static void +eom_window_open_editor (GtkAction *action, +                        EomWindow *window) +{ +	GdkAppLaunchContext *context; +	GAppInfo *app_info; +	GList files; + +	app_info = get_appinfo_for_editor (window); + +	if (app_info == NULL) +		return; + +	context = gdk_app_launch_context_new (); +	gdk_app_launch_context_set_screen (context, +	  gtk_widget_get_screen (GTK_WIDGET (window))); +	gdk_app_launch_context_set_icon (context, +	  g_app_info_get_icon (app_info)); +	gdk_app_launch_context_set_timestamp (context, +	  gtk_get_current_event_time ()); + +	{ +		GList f = { eom_image_get_file (window->priv->image) }; +		files = f; +	} + +	g_app_info_launch (app_info, &files, +                           G_APP_LAUNCH_CONTEXT (context), NULL); + +	g_object_unref (files.data); +	g_object_unref (context); +} + +static void +eom_window_add_open_editor_action (EomWindow *window) +{ +        EggToolbarsModel *model; +	GAppInfo *app_info; +	GtkAction *action; +        gchar *tooltip; + +	app_info = get_appinfo_for_editor (window); + +	if (app_info == NULL) +		return; + +	model = eom_application_get_toolbars_model (EOM_APP); +	egg_toolbars_model_set_name_flags (model, "OpenEditor", +	                                   EGG_TB_MODEL_NAME_KNOWN); + +	tooltip = g_strdup_printf (_("Edit the current image using %s"), +	                           g_app_info_get_name (app_info)); +	action = gtk_action_new ("OpenEditor", _("Edit Image"), tooltip, NULL); +	gtk_action_set_gicon (action, g_app_info_get_icon (app_info)); +	gtk_action_set_is_important (action, TRUE); + +	g_signal_connect (action, "activate", +	                  G_CALLBACK (eom_window_open_editor), window); + +	gtk_action_group_add_action (window->priv->actions_image, action); + +	g_object_unref (action); +	g_free (tooltip); +} +  static void  eom_window_construct_ui (EomWindow *window)  { @@ -4178,6 +4297,8 @@ eom_window_construct_ui (EomWindow *window)  				      G_N_ELEMENTS (action_entries_image),  				      window); +	eom_window_add_open_editor_action (window); +  	gtk_action_group_add_toggle_actions (priv->actions_image,  					     toggle_entries_image,  					     G_N_ELEMENTS (toggle_entries_image),  | 
