diff options
author | 2010-03-19 22:23:18 +0100 | |
---|---|---|
committer | 2010-03-19 22:23:18 +0100 | |
commit | a723a88e649bba5b8187bee0a7156beca31a1c8c (patch) | |
tree | c4615ee8090551b1e6b0c28f9086ab49e8e7f3e4 /plugins/gtkui/prefwin.c | |
parent | 2c6f50695af8b9dba7022cae891610e7285b5749 (diff) |
finished initial implementation of global hotkeys gui configuration
Diffstat (limited to 'plugins/gtkui/prefwin.c')
-rw-r--r-- | plugins/gtkui/prefwin.c | 112 |
1 files changed, 97 insertions, 15 deletions
diff --git a/plugins/gtkui/prefwin.c b/plugins/gtkui/prefwin.c index 00c53515..efb407a3 100644 --- a/plugins/gtkui/prefwin.c +++ b/plugins/gtkui/prefwin.c @@ -24,6 +24,9 @@ #include "interface.h" #include "callbacks.h" #include "drawing.h" +#include "../hotkeys/hotkeys.h" + +#pragma GCC optimize("O0") static GtkWidget *prefwin; @@ -96,6 +99,9 @@ preferences_fill_soundcards (void) { void on_hk_slot_edited (GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer user_data) { + if (!new_text || !new_text[0]) { + return; + } GtkListStore *store = GTK_LIST_STORE (user_data); GtkTreePath *treepath = gtk_tree_path_new_from_string (path); GtkTreeIter iter; @@ -120,16 +126,87 @@ on_hk_binding_edited (GtkCellRendererAccel *accel, gchar *path, guint accel_key, if (accel_mods & GDK_CONTROL_MASK) { strcat (new_value, "Ctrl "); } - if (accel_mods & GDK_MOD4_MASK) { + if (accel_mods & GDK_SUPER_MASK) { strcat (new_value, "Super "); } - if (accel_mods & GDK_META_MASK) { + if (accel_mods & GDK_MOD1_MASK) { strcat (new_value, "Alt "); } - char key[2] = {accel_key, 0}; - strcat (new_value, key); - gtk_list_store_set (store, &iter, 1, new_value, -1); + // find key name from hotkeys plugin + DB_plugin_t **plugs = deadbeef->plug_get_list (); + int i; + for (i = 0; plugs[i]; i++) { + if (plugs[i]->id && !strcmp (plugs[i]->id, "hotkeys")) { + const char *name = ((DB_hotkeys_plugin_t *)plugs[i])->get_name_for_keycode (accel_key); + strcat (new_value, name); + gtk_list_store_set (store, &iter, 1, new_value, -1); + break; + } + } +// if (!plugs[i]) { +// return; +// } +} + +void +on_addhotkey_clicked (GtkButton *button, gpointer user_data) { + GtkListStore *store = GTK_LIST_STORE (user_data); + GtkTreeIter iter; + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, "toggle_pause", 1, "", -1); +} + +void +on_removehotkey_clicked (GtkButton *button, gpointer user_data) { + GtkTreeView *tree = GTK_TREE_VIEW (user_data); + GtkTreeModel *model = gtk_tree_view_get_model (tree); + if (model) { + GtkTreeSelection *sel = gtk_tree_view_get_selection (tree); + if (sel) { + GtkTreeIter iter; + if (gtk_tree_selection_get_selected (sel, NULL, &iter)) { + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + } + } + } +} + +static gboolean +add_hotkey_to_config (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { + int *counter = (int *)data; + GValue key = {0,}, value = {0,}; +// g_value_init (&key, G_TYPE_STRING); +// g_value_init (&value, G_TYPE_STRING); + gtk_tree_model_get_value (model, iter, 0, &key); + gtk_tree_model_get_value (model, iter, 1, &value); + const char *skey = g_value_get_string (&key); + const char *svalue = g_value_get_string (&value); + + char conf_name[100]; + char conf_value[100]; + snprintf (conf_name, sizeof (conf_name), "hotkeys.key%d", *counter); + (*counter)++; + snprintf (conf_value, sizeof (conf_value), "%s: %s", svalue, skey); + deadbeef->conf_set_str (conf_name, conf_value); +} + +void +on_applyhotkeys_clicked (GtkButton *button, gpointer user_data) { + DB_plugin_t **plugs = deadbeef->plug_get_list (); + int i; + for (i = 0; plugs[i]; i++) { + if (plugs[i]->id && !strcmp (plugs[i]->id, "hotkeys")) { + // rebuild config + deadbeef->conf_remove_items ("hotkeys.key"); + int counter = 1; + GtkTreeModel *model = GTK_TREE_MODEL (user_data); + gtk_tree_model_foreach (model, add_hotkey_to_config, &counter); + + ((DB_hotkeys_plugin_t *)plugs[i])->reset (); + break; + } + } } void @@ -277,16 +354,17 @@ on_preferences_activate (GtkMenuItem *menuitem, // model for hotkey slots const char *slots[] = { - "Toggle pause", - "Play", - "Prev", - "Next", - "Random", - "Seek forward", - "Seek backward", - "Volume up", - "Volume down", - "Toggle stop after current", + "toggle_pause", + "play", + "prev", + "next", + "stop", + "play_random", + "seek_fwd", + "seek_back", + "volume_up", + "volume_down", + "toggle_stop_after_current", NULL }; GtkListStore *slots_store = gtk_list_store_new (1, G_TYPE_STRING); @@ -345,6 +423,10 @@ on_preferences_activate (GtkMenuItem *menuitem, } gtk_tree_view_set_model (hktree, GTK_TREE_MODEL (hkstore)); + g_signal_connect ((gpointer)lookup_widget (prefwin, "addhotkey"), "clicked", G_CALLBACK (on_addhotkey_clicked), hkstore); + g_signal_connect ((gpointer)lookup_widget (prefwin, "removehotkey"), "clicked", G_CALLBACK (on_removehotkey_clicked), hktree); + g_signal_connect ((gpointer)lookup_widget (prefwin, "applyhotkeys"), "clicked", G_CALLBACK (on_applyhotkeys_clicked), hkstore); + gtk_dialog_run (GTK_DIALOG (prefwin)); gtk_widget_destroy (prefwin); prefwin = NULL; |