summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/eom-config-keys.h1
-rw-r--r--src/eom-window.c121
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),