Commit 2cb3013b authored by Paolo Bacchilega's avatar Paolo Bacchilega
Browse files

shortcuts: save changes to file, load on startup

parent 4b13c27a
...@@ -87,6 +87,18 @@ row_data_free (RowData *row_data) ...@@ -87,6 +87,18 @@ row_data_free (RowData *row_data)
} }
static void
row_data_update_shortcut (RowData *row_data,
guint keycode,
GdkModifierType modifiers)
{
gth_shortcut_set_key (row_data->shortcut, keycode, modifiers);
gtk_label_set_text (GTK_LABEL (row_data->accel_label), row_data->shortcut->label);
gth_main_shortcuts_changed (gth_window_get_shortcuts (GTH_WINDOW (row_data->browser_data->browser)));
}
static void static void
accel_dialog_response_cb (GtkDialog *dialog, accel_dialog_response_cb (GtkDialog *dialog,
gint response_id, gint response_id,
...@@ -98,10 +110,8 @@ accel_dialog_response_cb (GtkDialog *dialog, ...@@ -98,10 +110,8 @@ accel_dialog_response_cb (GtkDialog *dialog,
switch (response_id) { switch (response_id) {
case GTK_RESPONSE_OK: case GTK_RESPONSE_OK:
if (gth_accel_dialog_get_accel (GTH_ACCEL_DIALOG (dialog), &keycode, &modifiers)) { if (gth_accel_dialog_get_accel (GTH_ACCEL_DIALOG (dialog), &keycode, &modifiers))
gth_shortcut_set_key (row_data->shortcut, keycode, modifiers); row_data_update_shortcut (row_data, keycode, modifiers);
gtk_label_set_text (GTK_LABEL (row_data->accel_label), row_data->shortcut->label);
}
gtk_widget_destroy (GTK_WIDGET (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog));
break; break;
...@@ -110,8 +120,7 @@ accel_dialog_response_cb (GtkDialog *dialog, ...@@ -110,8 +120,7 @@ accel_dialog_response_cb (GtkDialog *dialog,
break; break;
case GTH_ACCEL_BUTTON_RESPONSE_DELETE: case GTH_ACCEL_BUTTON_RESPONSE_DELETE:
gth_shortcut_set_key (row_data->shortcut, 0, 0); row_data_update_shortcut (row_data, 0, 0);
gtk_label_set_text (GTK_LABEL (row_data->accel_label), row_data->shortcut->label);
gtk_widget_destroy (GTK_WIDGET (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog));
break; break;
} }
......
...@@ -142,6 +142,7 @@ struct _GthBrowserPrivate { ...@@ -142,6 +142,7 @@ struct _GthBrowserPrivate {
gulong emblems_changed_id; gulong emblems_changed_id;
gulong entry_points_changed_id; gulong entry_points_changed_id;
gulong order_changed_id; gulong order_changed_id;
gulong shortcuts_changed_id;
GthFileData *location; GthFileData *location;
GthFileData *current_file; GthFileData *current_file;
GthFileSource *location_source; GthFileSource *location_source;
...@@ -2082,6 +2083,8 @@ _gth_browser_real_close (GthBrowser *browser) ...@@ -2082,6 +2083,8 @@ _gth_browser_real_close (GthBrowser *browser)
browser->priv->entry_points_changed_id); browser->priv->entry_points_changed_id);
g_signal_handler_disconnect (gth_main_get_default_monitor (), g_signal_handler_disconnect (gth_main_get_default_monitor (),
browser->priv->order_changed_id); browser->priv->order_changed_id);
g_signal_handler_disconnect (gth_main_get_default_monitor (),
browser->priv->shortcuts_changed_id);
/* remove timeouts */ /* remove timeouts */
...@@ -3504,6 +3507,14 @@ order_changed_cb (GthMonitor *monitor, ...@@ -3504,6 +3507,14 @@ order_changed_cb (GthMonitor *monitor,
} }
static void
shortcuts_changed_cb (GthMonitor *monitor,
GthBrowser *browser)
{
gth_window_load_shortcuts (GTH_WINDOW (browser));
}
static void static void
pref_general_filter_changed (GSettings *settings, pref_general_filter_changed (GSettings *settings,
const char *key, const char *key,
...@@ -4807,6 +4818,11 @@ gth_browser_init (GthBrowser *browser) ...@@ -4807,6 +4818,11 @@ gth_browser_init (GthBrowser *browser)
"order-changed", "order-changed",
G_CALLBACK (order_changed_cb), G_CALLBACK (order_changed_cb),
browser); browser);
browser->priv->shortcuts_changed_id =
g_signal_connect (gth_main_get_default_monitor (),
"shortcuts-changed",
G_CALLBACK (shortcuts_changed_cb),
browser);
/* init browser data */ /* init browser data */
...@@ -4900,6 +4916,7 @@ gth_browser_init (GthBrowser *browser) ...@@ -4900,6 +4916,7 @@ gth_browser_init (GthBrowser *browser)
gtk_widget_realize (browser->priv->file_list); gtk_widget_realize (browser->priv->file_list);
gth_hook_invoke ("gth-browser-construct", browser); gth_hook_invoke ("gth-browser-construct", browser);
gth_window_load_shortcuts (GTH_WINDOW (browser));
performance (DEBUG_INFO, "window initialized"); performance (DEBUG_INFO, "window initialized");
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "gth-metadata-provider.h" #include "gth-metadata-provider.h"
#include "gth-user-dir.h" #include "gth-user-dir.h"
#include "gth-preferences.h" #include "gth-preferences.h"
#include "gth-shortcut.h"
#include "gtk-utils.h" #include "gtk-utils.h"
#include "pixbuf-io.h" #include "pixbuf-io.h"
#include "typedefs.h" #include "typedefs.h"
...@@ -1152,6 +1153,14 @@ gth_main_bookmarks_changed (void) ...@@ -1152,6 +1153,14 @@ gth_main_bookmarks_changed (void)
} }
void
gth_main_shortcuts_changed (GPtrArray *shortcuts_v)
{
if (gth_shortcuts_write_to_file (shortcuts_v, NULL))
gth_monitor_shortcuts_changed (gth_main_get_default_monitor ());
}
GthFilterFile * GthFilterFile *
gth_main_get_default_filter_file (void) gth_main_get_default_filter_file (void)
{ {
......
...@@ -112,6 +112,7 @@ void gth_main_register_type (const char ...@@ -112,6 +112,7 @@ void gth_main_register_type (const char
GArray * gth_main_get_type_set (const char *set_name); GArray * gth_main_get_type_set (const char *set_name);
GBookmarkFile * gth_main_get_default_bookmarks (void); GBookmarkFile * gth_main_get_default_bookmarks (void);
void gth_main_bookmarks_changed (void); void gth_main_bookmarks_changed (void);
void gth_main_shortcuts_changed (GPtrArray *shortcuts_v);
GthFilterFile * gth_main_get_default_filter_file (void); GthFilterFile * gth_main_get_default_filter_file (void);
GList * gth_main_get_all_filters (void); GList * gth_main_get_all_filters (void);
void gth_main_filters_changed (void); void gth_main_filters_changed (void);
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
enum { enum {
ICON_THEME_CHANGED, ICON_THEME_CHANGED,
BOOKMARKS_CHANGED, BOOKMARKS_CHANGED,
SHORTCUTS_CHANGED,
FILTERS_CHANGED, FILTERS_CHANGED,
TAGS_CHANGED, TAGS_CHANGED,
FOLDER_CONTENT_CHANGED, FOLDER_CONTENT_CHANGED,
...@@ -106,6 +107,15 @@ gth_monitor_class_init (GthMonitorClass *class) ...@@ -106,6 +107,15 @@ gth_monitor_class_init (GthMonitorClass *class)
g_cclosure_marshal_VOID__VOID, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, G_TYPE_NONE,
0); 0);
monitor_signals[SHORTCUTS_CHANGED] =
g_signal_new ("shortcuts-changed",
G_TYPE_FROM_CLASS (class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GthMonitorClass, shortcuts_changed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
monitor_signals[FILTERS_CHANGED] = monitor_signals[FILTERS_CHANGED] =
g_signal_new ("filters-changed", g_signal_new ("filters-changed",
G_TYPE_FROM_CLASS (class), G_TYPE_FROM_CLASS (class),
...@@ -253,6 +263,17 @@ gth_monitor_bookmarks_changed (GthMonitor *self) ...@@ -253,6 +263,17 @@ gth_monitor_bookmarks_changed (GthMonitor *self)
} }
void
gth_monitor_shortcuts_changed (GthMonitor *self)
{
g_return_if_fail (GTH_IS_MONITOR (self));
g_signal_emit (G_OBJECT (self),
monitor_signals[SHORTCUTS_CHANGED],
0);
}
void void
gth_monitor_filters_changed (GthMonitor *self) gth_monitor_filters_changed (GthMonitor *self)
{ {
......
...@@ -61,6 +61,7 @@ struct _GthMonitorClass ...@@ -61,6 +61,7 @@ struct _GthMonitorClass
void (*icon_theme_changed) (GthMonitor *monitor); void (*icon_theme_changed) (GthMonitor *monitor);
void (*bookmarks_changed) (GthMonitor *monitor); void (*bookmarks_changed) (GthMonitor *monitor);
void (*shortcuts_changed) (GthMonitor *monitor);
void (*filters_changed) (GthMonitor *monitor); void (*filters_changed) (GthMonitor *monitor);
void (*tags_changed) (GthMonitor *monitor); void (*tags_changed) (GthMonitor *monitor);
void (*folder_changed) (GthMonitor *monitor, void (*folder_changed) (GthMonitor *monitor,
...@@ -89,6 +90,7 @@ void gth_monitor_resume (GthMonitor *monitor, ...@@ -89,6 +90,7 @@ void gth_monitor_resume (GthMonitor *monitor,
GFile *file); GFile *file);
void gth_monitor_icon_theme_changed (GthMonitor *monitor); void gth_monitor_icon_theme_changed (GthMonitor *monitor);
void gth_monitor_bookmarks_changed (GthMonitor *monitor); void gth_monitor_bookmarks_changed (GthMonitor *monitor);
void gth_monitor_shortcuts_changed (GthMonitor *monitor);
void gth_monitor_filters_changed (GthMonitor *monitor); void gth_monitor_filters_changed (GthMonitor *monitor);
void gth_monitor_tags_changed (GthMonitor *monitor); void gth_monitor_tags_changed (GthMonitor *monitor);
void gth_monitor_folder_changed (GthMonitor *monitor, void gth_monitor_folder_changed (GthMonitor *monitor,
......
...@@ -20,7 +20,11 @@ ...@@ -20,7 +20,11 @@
*/ */
#include <config.h> #include <config.h>
#include <glib/gi18n.h>
#include "dom.h"
#include "gio-utils.h"
#include "gth-shortcut.h" #include "gth-shortcut.h"
#include "gth-user-dir.h"
GthShortcut * GthShortcut *
...@@ -146,3 +150,101 @@ gth_shortcut_valid (guint keycode, ...@@ -146,3 +150,101 @@ gth_shortcut_valid (guint keycode,
return FALSE; return FALSE;
} }
gboolean
gth_shortcuts_write_to_file (GPtrArray *shortcuts_v,
GError **error)
{
DomDocument *doc;
DomElement *shortcuts;
int i;
char *buffer;
gsize size;
GFile *file;
gboolean result;
doc = dom_document_new ();
shortcuts = dom_document_create_element (doc, "shortcuts", NULL);
for (i = 0; i < shortcuts_v->len; i++) {
GthShortcut *shortcut = g_ptr_array_index (shortcuts_v, i);
if (shortcut->context == GTH_SHORTCUT_CONTEXT_INTERNAL)
continue;
dom_element_append_child (shortcuts,
dom_document_create_element (doc, "shortcut",
"action", shortcut->action_name,
"accelerator", shortcut->accelerator,
NULL));
}
dom_element_append_child (DOM_ELEMENT (doc), shortcuts);
buffer = dom_document_dump (doc, &size);
file = gth_user_dir_get_file_for_write (GTH_DIR_CONFIG, GTHUMB_DIR, SHORTCUTS_FILE, NULL);
result = _g_file_write (file, FALSE, G_FILE_CREATE_NONE, buffer, size, NULL, error);
g_object_unref (file);
g_free (buffer);
g_object_unref (doc);
return result;
}
gboolean
gth_shortcuts_load_from_file (GPtrArray *shortcuts_v,
GHashTable *shortcuts,
GError **error)
{
gboolean success = FALSE;
GFile *file;
void *buffer;
gsize size;
file = gth_user_dir_get_file_for_write (GTH_DIR_CONFIG, GTHUMB_DIR, SHORTCUTS_FILE, NULL);
if (_g_file_load_in_buffer (file, &buffer, &size, NULL, error)) {
DomDocument *doc;
doc = dom_document_new ();
if (dom_document_load (doc, buffer, size, error)) {
DomElement *node;
for (node = DOM_ELEMENT (doc)->first_child; node; node = node->next_sibling) {
if (g_strcmp0 (node->tag_name, "shortcuts") == 0) {
DomElement *shortcut_node;
for (shortcut_node = node->first_child; shortcut_node; shortcut_node = shortcut_node->next_sibling) {
if (g_strcmp0 (shortcut_node->tag_name, "shortcut") == 0) {
const char *action_name;
const char *accelerator;
GthShortcut *shortcut;
action_name = dom_element_get_attribute (shortcut_node, "action");
accelerator = dom_element_get_attribute (shortcut_node, "accelerator");
if (action_name == NULL)
continue;
shortcut = g_hash_table_lookup (shortcuts, action_name);
if (shortcut != NULL)
gth_shortcut_set_accelerator (shortcut, accelerator);
}
}
success = TRUE;
}
}
}
if (! success && (error != NULL))
*error = g_error_new_literal (DOM_ERROR, DOM_ERROR_INVALID_FORMAT, _("Invalid file format"));
g_object_unref (doc);
g_free (buffer);
}
g_object_unref (file);
return success;
}
...@@ -57,6 +57,11 @@ GthShortcut * gth_shortcut_array_find (GPtrArray *shortcuts_v, ...@@ -57,6 +57,11 @@ GthShortcut * gth_shortcut_array_find (GPtrArray *shortcuts_v,
GdkModifierType modifiers); GdkModifierType modifiers);
gboolean gth_shortcut_valid (guint keycode, gboolean gth_shortcut_valid (guint keycode,
GdkModifierType modifiers); GdkModifierType modifiers);
gboolean gth_shortcuts_write_to_file (GPtrArray *shortcuts_v,
GError **error);
gboolean gth_shortcuts_load_from_file (GPtrArray *shortcuts_v,
GHashTable *shortcuts,
GError **error);
G_END_DECLS G_END_DECLS
......
...@@ -706,7 +706,7 @@ _gth_window_add_shortcut (GthWindow *window, ...@@ -706,7 +706,7 @@ _gth_window_add_shortcut (GthWindow *window,
{ {
g_hash_table_insert (window->priv->shortcuts, g_hash_table_insert (window->priv->shortcuts,
g_strdup (shorcut->action_name), g_strdup (shorcut->action_name),
GINT_TO_POINTER (1)); shorcut);
g_ptr_array_add (window->priv->shortcuts_v, shorcut); g_ptr_array_add (window->priv->shortcuts_v, shorcut);
} }
...@@ -850,3 +850,14 @@ gth_window_activate_shortcut (GthWindow *window, ...@@ -850,3 +850,14 @@ gth_window_activate_shortcut (GthWindow *window,
return activated; return activated;
} }
void
gth_window_load_shortcuts (GthWindow *window)
{
g_return_if_fail (GTH_IS_WINDOW (window));
gth_shortcuts_load_from_file (window->priv->shortcuts_v,
window->priv->shortcuts,
NULL);
}
...@@ -129,6 +129,7 @@ gboolean gth_window_activate_shortcut (GthWindow *window, ...@@ -129,6 +129,7 @@ gboolean gth_window_activate_shortcut (GthWindow *window,
int context, int context,
guint keycode, guint keycode,
GdkModifierType modifiers); GdkModifierType modifiers);
void gth_window_load_shortcuts (GthWindow *window);
G_END_DECLS G_END_DECLS
......
...@@ -31,6 +31,7 @@ G_BEGIN_DECLS ...@@ -31,6 +31,7 @@ G_BEGIN_DECLS
#define FILTERS_FILE "filters.xml" #define FILTERS_FILE "filters.xml"
#define TAGS_FILE "tags.xml" #define TAGS_FILE "tags.xml"
#define FILE_CACHE "cache" #define FILE_CACHE "cache"
#define SHORTCUTS_FILE "shortcuts.xml"
typedef enum { typedef enum {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment