summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-03-18 22:42:18 +0100
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-03-18 22:42:18 +0100
commit2c6f50695af8b9dba7022cae891610e7285b5749 (patch)
tree1bc00da09e302f0288f50b4e167377f61d2b8e0d
parent6e9f5c00d97065a0480ceaa1ce9d103dbadb1364 (diff)
global hotkeys GUI configuration WIP
-rw-r--r--plugins/gtkui/deadbeef.glade6
-rw-r--r--plugins/gtkui/interface.c36
-rw-r--r--plugins/gtkui/prefwin.c114
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;