diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2010-03-18 22:42:18 +0100 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2010-03-18 22:42:18 +0100 |
commit | 2c6f50695af8b9dba7022cae891610e7285b5749 (patch) | |
tree | 1bc00da09e302f0288f50b4e167377f61d2b8e0d /plugins/gtkui | |
parent | 6e9f5c00d97065a0480ceaa1ce9d103dbadb1364 (diff) |
global hotkeys GUI configuration WIP
Diffstat (limited to 'plugins/gtkui')
-rw-r--r-- | plugins/gtkui/deadbeef.glade | 6 | ||||
-rw-r--r-- | plugins/gtkui/interface.c | 36 | ||||
-rw-r--r-- | plugins/gtkui/prefwin.c | 114 |
3 files changed, 135 insertions, 21 deletions
diff --git a/plugins/gtkui/deadbeef.glade b/plugins/gtkui/deadbeef.glade index 532a6462..85cf6cd6 100644 --- a/plugins/gtkui/deadbeef.glade +++ b/plugins/gtkui/deadbeef.glade @@ -3906,7 +3906,7 @@ SOCKS5_HOSTNAME</property> <property name="window_placement">GTK_CORNER_TOP_LEFT</property> <child> - <widget class="GtkTreeView" id="treeview1"> + <widget class="GtkTreeView" id="hotkeystree"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="headers_visible">True</property> @@ -3933,7 +3933,7 @@ SOCKS5_HOSTNAME</property> <property name="spacing">0</property> <child> - <widget class="GtkButton" id="button4"> + <widget class="GtkButton" id="addhotkey"> <property name="visible">True</property> <property name="can_default">True</property> <property name="can_focus">True</property> @@ -3945,7 +3945,7 @@ SOCKS5_HOSTNAME</property> </child> <child> - <widget class="GtkButton" id="button5"> + <widget class="GtkButton" id="removehotkey"> <property name="visible">True</property> <property name="can_default">True</property> <property name="can_focus">True</property> diff --git a/plugins/gtkui/interface.c b/plugins/gtkui/interface.c index 770bf32d..cb33ff83 100644 --- a/plugins/gtkui/interface.c +++ b/plugins/gtkui/interface.c @@ -1600,10 +1600,10 @@ create_prefwin (void) GtkWidget *label3; GtkWidget *vbox17; GtkWidget *scrolledwindow6; - GtkWidget *treeview1; + GtkWidget *hotkeystree; GtkWidget *hbuttonbox3; - GtkWidget *button4; - GtkWidget *button5; + GtkWidget *addhotkey; + GtkWidget *removehotkey; GtkWidget *label66; GtkWidget *dialog_action_area2; GtkWidget *closebutton1; @@ -2060,25 +2060,25 @@ create_prefwin (void) gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow6), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow6), GTK_SHADOW_IN); - treeview1 = gtk_tree_view_new (); - gtk_widget_show (treeview1); - gtk_container_add (GTK_CONTAINER (scrolledwindow6), treeview1); - gtk_tree_view_set_enable_search (GTK_TREE_VIEW (treeview1), FALSE); + hotkeystree = gtk_tree_view_new (); + gtk_widget_show (hotkeystree); + gtk_container_add (GTK_CONTAINER (scrolledwindow6), hotkeystree); + gtk_tree_view_set_enable_search (GTK_TREE_VIEW (hotkeystree), FALSE); hbuttonbox3 = gtk_hbutton_box_new (); gtk_widget_show (hbuttonbox3); gtk_box_pack_start (GTK_BOX (vbox17), hbuttonbox3, FALSE, FALSE, 0); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox3), GTK_BUTTONBOX_END); - button4 = gtk_button_new_with_mnemonic ("Add"); - gtk_widget_show (button4); - gtk_container_add (GTK_CONTAINER (hbuttonbox3), button4); - GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT); + addhotkey = gtk_button_new_with_mnemonic ("Add"); + gtk_widget_show (addhotkey); + gtk_container_add (GTK_CONTAINER (hbuttonbox3), addhotkey); + GTK_WIDGET_SET_FLAGS (addhotkey, GTK_CAN_DEFAULT); - button5 = gtk_button_new_with_mnemonic ("Remove"); - gtk_widget_show (button5); - gtk_container_add (GTK_CONTAINER (hbuttonbox3), button5); - GTK_WIDGET_SET_FLAGS (button5, GTK_CAN_DEFAULT); + removehotkey = gtk_button_new_with_mnemonic ("Remove"); + gtk_widget_show (removehotkey); + gtk_container_add (GTK_CONTAINER (hbuttonbox3), removehotkey); + GTK_WIDGET_SET_FLAGS (removehotkey, GTK_CAN_DEFAULT); label66 = gtk_label_new ("Global Hotkeys"); gtk_widget_show (label66); @@ -2246,10 +2246,10 @@ create_prefwin (void) GLADE_HOOKUP_OBJECT (prefwin, label3, "label3"); GLADE_HOOKUP_OBJECT (prefwin, vbox17, "vbox17"); GLADE_HOOKUP_OBJECT (prefwin, scrolledwindow6, "scrolledwindow6"); - GLADE_HOOKUP_OBJECT (prefwin, treeview1, "treeview1"); + GLADE_HOOKUP_OBJECT (prefwin, hotkeystree, "hotkeystree"); GLADE_HOOKUP_OBJECT (prefwin, hbuttonbox3, "hbuttonbox3"); - GLADE_HOOKUP_OBJECT (prefwin, button4, "button4"); - GLADE_HOOKUP_OBJECT (prefwin, button5, "button5"); + GLADE_HOOKUP_OBJECT (prefwin, addhotkey, "addhotkey"); + GLADE_HOOKUP_OBJECT (prefwin, removehotkey, "removehotkey"); GLADE_HOOKUP_OBJECT (prefwin, label66, "label66"); GLADE_HOOKUP_OBJECT_NO_REF (prefwin, dialog_action_area2, "dialog_action_area2"); GLADE_HOOKUP_OBJECT (prefwin, closebutton1, "closebutton1"); diff --git a/plugins/gtkui/prefwin.c b/plugins/gtkui/prefwin.c index d679c62b..00c53515 100644 --- a/plugins/gtkui/prefwin.c +++ b/plugins/gtkui/prefwin.c @@ -95,6 +95,44 @@ preferences_fill_soundcards (void) { } void +on_hk_slot_edited (GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer user_data) { + GtkListStore *store = GTK_LIST_STORE (user_data); + GtkTreePath *treepath = gtk_tree_path_new_from_string (path); + GtkTreeIter iter; + gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, treepath); + gtk_tree_path_free (treepath); + gtk_list_store_set (store, &iter, 0, new_text, -1); +} + +void +on_hk_binding_edited (GtkCellRendererAccel *accel, gchar *path, guint accel_key, GdkModifierType accel_mods, guint hardware_keycode, gpointer user_data) { + GtkListStore *store = GTK_LIST_STORE (user_data); + GtkTreePath *treepath = gtk_tree_path_new_from_string (path); + GtkTreeIter iter; + gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, treepath); + gtk_tree_path_free (treepath); + + // build value + char new_value[1000] = ""; + if (accel_mods & GDK_SHIFT_MASK) { + strcat (new_value, "Shift "); + } + if (accel_mods & GDK_CONTROL_MASK) { + strcat (new_value, "Ctrl "); + } + if (accel_mods & GDK_MOD4_MASK) { + strcat (new_value, "Super "); + } + if (accel_mods & GDK_META_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); +} + +void on_preferences_activate (GtkMenuItem *menuitem, gpointer user_data) { @@ -231,6 +269,82 @@ on_preferences_activate (GtkMenuItem *menuitem, gtk_widget_set_sensitive (lookup_widget (prefwin, "configure_plugin"), FALSE); // gtk_widget_show (w); + + // hotkeys + GtkTreeView *hktree = GTK_TREE_VIEW (lookup_widget (prefwin, "hotkeystree")); + GtkListStore *hkstore = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + GtkCellRenderer *rend_hk_slot = gtk_cell_renderer_combo_new (); + + // 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", + NULL + }; + GtkListStore *slots_store = gtk_list_store_new (1, G_TYPE_STRING); + for (int i = 0; slots[i]; i++) { + GtkTreeIter iter; + gtk_list_store_append (slots_store, &iter); + gtk_list_store_set (slots_store, &iter, 0, slots[i], -1); + } + g_object_set (G_OBJECT (rend_hk_slot), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); + g_object_set (G_OBJECT (rend_hk_slot), "has-entry", FALSE, NULL); + g_object_set (G_OBJECT (rend_hk_slot), "text-column", 0, NULL); + g_object_set (G_OBJECT (rend_hk_slot), "model", slots_store, NULL); + g_object_set (G_OBJECT (rend_hk_slot), "editable", TRUE, NULL); + + g_signal_connect ((gpointer)rend_hk_slot, "edited", + G_CALLBACK (on_hk_slot_edited), + hkstore); + + GtkCellRenderer *rend_hk_binding = gtk_cell_renderer_accel_new (); + g_object_set (G_OBJECT (rend_hk_binding), "editable", TRUE, NULL); + + g_signal_connect ((gpointer)rend_hk_binding, "accel-edited", + G_CALLBACK (on_hk_binding_edited), + hkstore); + + + GtkTreeViewColumn *hk_col1 = gtk_tree_view_column_new_with_attributes ("Slot", rend_hk_slot, "text", 0, NULL); + GtkTreeViewColumn *hk_col2 = gtk_tree_view_column_new_with_attributes ("Key combination", rend_hk_binding, "text", 1, NULL); + gtk_tree_view_append_column (hktree, hk_col1); + gtk_tree_view_append_column (hktree, hk_col2); + + // fetch hotkeys from config + DB_conf_item_t *item = deadbeef->conf_find ("hotkeys.", NULL); + while (item) { + size_t l = strlen (item->value); + char param[l+1]; + memcpy (param, item->value, l+1); + + char* colon = strchr (param, ':'); + if (!colon) + { + fprintf (stderr, "hotkeys: bad config option %s %s\n", item->key, item->value); + continue; + } + char* command = colon+1; + *colon = 0; + while (*command && ((uint8_t)*command) <= 0x20) { + command++; + } + if (*command) { + GtkTreeIter iter; + gtk_list_store_append (hkstore, &iter); + gtk_list_store_set (hkstore, &iter, 0, command, 1, param, -1); + item = deadbeef->conf_find ("hotkeys.", item); + } + } + gtk_tree_view_set_model (hktree, GTK_TREE_MODEL (hkstore)); + gtk_dialog_run (GTK_DIALOG (prefwin)); gtk_widget_destroy (prefwin); prefwin = NULL; |