summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/gtkui/callbacks.c3
-rw-r--r--plugins/gtkui/callbacks.h26
-rw-r--r--plugins/gtkui/deadbeef.glade6
-rw-r--r--plugins/gtkui/hotkeys.c156
-rw-r--r--plugins/gtkui/interface.c16
5 files changed, 194 insertions, 13 deletions
diff --git a/plugins/gtkui/callbacks.c b/plugins/gtkui/callbacks.c
index 66d0b17e..17109be8 100644
--- a/plugins/gtkui/callbacks.c
+++ b/plugins/gtkui/callbacks.c
@@ -1311,6 +1311,3 @@ on_design_mode1_activate (GtkMenuItem *menuitem,
gboolean act = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem));
w_set_design_mode (act ? 1 : 0);
}
-
-
-
diff --git a/plugins/gtkui/callbacks.h b/plugins/gtkui/callbacks.h
index 15e060c8..abf7a7c4 100644
--- a/plugins/gtkui/callbacks.h
+++ b/plugins/gtkui/callbacks.h
@@ -1213,3 +1213,29 @@ gboolean
on_hotkey_keycombo_key_press_event (GtkWidget *widget,
GdkEventKey *event,
gpointer user_data);
+
+gboolean
+on_hotkey_keycombo_focus_in_event (GtkWidget *widget,
+ GdkEventFocus *event,
+ gpointer user_data);
+
+gboolean
+on_hotkey_keycombo_button_press_event (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data);
+
+gboolean
+on_hotkey_keycombo_motion_notify_event (GtkWidget *widget,
+ GdkEventMotion *event,
+ gpointer user_data);
+
+gboolean
+on_hotkey_keycombo_button_release_event
+ (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data);
+
+gboolean
+on_hotkey_keycombo_focus_in_event (GtkWidget *widget,
+ GdkEventFocus *event,
+ gpointer user_data);
diff --git a/plugins/gtkui/deadbeef.glade b/plugins/gtkui/deadbeef.glade
index 6c7223ce..af213d1a 100644
--- a/plugins/gtkui/deadbeef.glade
+++ b/plugins/gtkui/deadbeef.glade
@@ -5255,6 +5255,7 @@ SOCKS5_HOSTNAME</property>
<child>
<widget class="GtkEntry" id="hotkey_keycombo">
+ <property name="width_request">284</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
@@ -5264,8 +5265,11 @@ SOCKS5_HOSTNAME</property>
<property name="has_frame">True</property>
<property name="invisible_char">•</property>
<property name="activates_default">False</property>
- <signal name="changed" handler="on_hotkey_keycombo_changed" last_modification_time="Tue, 30 Oct 2012 20:39:32 GMT"/>
<signal name="key_press_event" handler="on_hotkey_keycombo_key_press_event" last_modification_time="Tue, 30 Oct 2012 20:56:34 GMT"/>
+ <signal name="button_press_event" handler="on_hotkey_keycombo_button_press_event" last_modification_time="Thu, 01 Nov 2012 20:13:45 GMT"/>
+ <signal name="motion_notify_event" handler="on_hotkey_keycombo_motion_notify_event" last_modification_time="Thu, 01 Nov 2012 20:23:31 GMT"/>
+ <signal name="button_release_event" handler="on_hotkey_keycombo_button_release_event" last_modification_time="Thu, 01 Nov 2012 20:23:36 GMT"/>
+ <signal name="focus_in_event" handler="on_hotkey_keycombo_focus_in_event" last_modification_time="Thu, 01 Nov 2012 20:30:12 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
diff --git a/plugins/gtkui/hotkeys.c b/plugins/gtkui/hotkeys.c
index 340b17d7..be67f9e3 100644
--- a/plugins/gtkui/hotkeys.c
+++ b/plugins/gtkui/hotkeys.c
@@ -62,6 +62,15 @@ prefwin_init_hotkeys (GtkWidget *prefwin) {
gtk_tree_view_append_column (GTK_TREE_VIEW (hotkeys), hk_col3);
gtk_tree_view_append_column (GTK_TREE_VIEW (hotkeys), hk_col4);
GtkListStore *hkstore = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+
+ DB_conf_item_t *item = deadbeef->conf_find ("hotkeys.", NULL);
+ while (item) {
+ GtkTreeIter iter;
+ gtk_list_store_append (hkstore, &iter);
+ gtk_list_store_set (hkstore, &iter, 0, "key", 1, "action", 2, "context", 3, "global", -1);
+ item = deadbeef->conf_find ("hotkeys.", item);
+ }
+
gtk_tree_view_set_model (GTK_TREE_VIEW (hotkeys), GTK_TREE_MODEL (hkstore));
// setup action tree
@@ -153,26 +162,161 @@ on_hotkeys_actions_cursor_changed (GtkTreeView *treeview,
void
-on_hotkey_keycombo_changed (GtkEditable *editable,
+on_hotkey_is_global_toggled (GtkToggleButton *togglebutton,
gpointer user_data)
{
}
+int grabbed = 0;
+guint last_accel_key = 0;
+guint last_accel_mask = 0;
-void
-on_hotkey_is_global_toggled (GtkToggleButton *togglebutton,
+gboolean
+on_hotkey_keycombo_key_press_event (GtkWidget *widget,
+ GdkEventKey *event,
gpointer user_data)
{
+ GdkModifierType accel_mods = 0;
+ guint accel_key;
+ gchar *path;
+ gboolean edited;
+ gboolean cleared;
+ GdkModifierType consumed_modifiers;
+ GdkDisplay *display;
+
+ if (!grabbed) {
+ return TRUE;
+ }
+ display = gtk_widget_get_display (widget);
+
+ if (event->is_modifier)
+ return TRUE;
+
+ edited = FALSE;
+ cleared = FALSE;
+
+ gdk_keymap_translate_keyboard_state (gdk_keymap_get_for_display (display),
+ event->hardware_keycode,
+ event->state,
+ event->group,
+ NULL, NULL, NULL, &consumed_modifiers);
+
+ accel_key = gdk_keyval_to_lower (event->keyval);
+ if (accel_key == GDK_ISO_Left_Tab)
+ accel_key = GDK_Tab;
+
+ accel_mods = event->state & gtk_accelerator_get_default_mod_mask ();
+
+ /* Filter consumed modifiers
+ */
+ accel_mods &= ~consumed_modifiers;
+
+ /* Put shift back if it changed the case of the key, not otherwise.
+ */
+ if (accel_key != event->keyval)
+ accel_mods |= GDK_SHIFT_MASK;
+
+ gtk_entry_set_text (GTK_ENTRY (widget), _(""));
+ if (accel_mods == 0)
+ {
+ switch (event->keyval)
+ {
+ case GDK_Escape:
+ {
+ gchar *name = gtk_accelerator_get_label (last_accel_key, last_accel_mask);
+ gtk_entry_set_text (GTK_ENTRY (widget), name);
+ g_free (name);
+ }
+ goto out; /* cancel */
+ case GDK_BackSpace:
+ gtk_entry_set_text (GTK_ENTRY (widget), "");
+ last_accel_key = 0;
+ last_accel_mask = 0;
+ /* clear the accelerator on Backspace */
+ cleared = TRUE;
+ goto out;
+ default:
+ break;
+ }
+ }
+
+ if (!gtk_accelerator_valid (accel_key, accel_mods))
+ {
+ gtk_widget_error_bell (widget);
+
+ return TRUE;
+ }
+ last_accel_key = accel_key;
+ last_accel_mask = accel_mods;
+ gchar *name = gtk_accelerator_get_label (accel_key, accel_mods);
+ gtk_entry_set_text (GTK_ENTRY (widget), name);
+ g_free (name);
+
+out:
+ gdk_display_keyboard_ungrab (display, GDK_CURRENT_TIME);
+ gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME);
+ grabbed = 0;
+ return TRUE;
+}
+
+static void
+hotkey_grab_focus (GtkWidget *widget, GdkEvent *event) {
+ GdkDisplay *display = gtk_widget_get_display (widget);
+ if (grabbed) {
+ return;
+ }
+ grabbed = 0;
+ if (GDK_GRAB_SUCCESS != gdk_keyboard_grab (gtk_widget_get_window (widget), FALSE, gdk_event_get_time ((GdkEvent*)event))) {
+ return;
+ }
+
+ if (gdk_pointer_grab (gtk_widget_get_window (widget), FALSE,
+ GDK_BUTTON_PRESS_MASK,
+ NULL, NULL,
+ gdk_event_get_time ((GdkEvent *)event)) != GDK_GRAB_SUCCESS)
+ {
+ gdk_display_keyboard_ungrab (display, gdk_event_get_time ((GdkEvent *)event));
+ return;
+ }
+ gtk_entry_set_text (GTK_ENTRY (widget), _("New key combination..."));
+ grabbed = 1;
}
gboolean
-on_hotkey_keycombo_key_press_event (GtkWidget *widget,
- GdkEventKey *event,
+on_hotkey_keycombo_focus_in_event (GtkWidget *widget,
+ GdkEventFocus *event,
+ gpointer user_data)
+{
+ hotkey_grab_focus (widget, (GdkEvent *)event);
+ return TRUE;
+}
+
+gboolean
+on_hotkey_keycombo_button_press_event (GtkWidget *widget,
+ GdkEventButton *event,
gpointer user_data)
{
+ hotkey_grab_focus (widget, (GdkEvent *)event);
+ return FALSE;
+}
+
+gboolean
+on_hotkey_keycombo_motion_notify_event (GtkWidget *widget,
+ GdkEventMotion *event,
+ gpointer user_data)
+{
+ return TRUE;
+}
+
- return FALSE;
+gboolean
+on_hotkey_keycombo_button_release_event
+ (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ return TRUE;
}
diff --git a/plugins/gtkui/interface.c b/plugins/gtkui/interface.c
index e7e9d943..8802e866 100644
--- a/plugins/gtkui/interface.c
+++ b/plugins/gtkui/interface.c
@@ -2583,6 +2583,7 @@ create_prefwin (void)
hotkey_keycombo = gtk_entry_new ();
gtk_widget_show (hotkey_keycombo);
gtk_box_pack_start (GTK_BOX (hbox107), hotkey_keycombo, FALSE, TRUE, 0);
+ gtk_widget_set_size_request (hotkey_keycombo, 284, -1);
gtk_entry_set_invisible_char (GTK_ENTRY (hotkey_keycombo), 8226);
hotkey_is_global = gtk_check_button_new_with_mnemonic (_("Global hotkey"));
@@ -2888,12 +2889,21 @@ create_prefwin (void)
g_signal_connect ((gpointer) hotkeys_actions, "cursor_changed",
G_CALLBACK (on_hotkeys_actions_cursor_changed),
NULL);
- g_signal_connect ((gpointer) hotkey_keycombo, "changed",
- G_CALLBACK (on_hotkey_keycombo_changed),
- NULL);
g_signal_connect ((gpointer) hotkey_keycombo, "key_press_event",
G_CALLBACK (on_hotkey_keycombo_key_press_event),
NULL);
+ g_signal_connect ((gpointer) hotkey_keycombo, "button_press_event",
+ G_CALLBACK (on_hotkey_keycombo_button_press_event),
+ NULL);
+ g_signal_connect ((gpointer) hotkey_keycombo, "motion_notify_event",
+ G_CALLBACK (on_hotkey_keycombo_motion_notify_event),
+ NULL);
+ g_signal_connect ((gpointer) hotkey_keycombo, "button_release_event",
+ G_CALLBACK (on_hotkey_keycombo_button_release_event),
+ NULL);
+ g_signal_connect ((gpointer) hotkey_keycombo, "focus_in_event",
+ G_CALLBACK (on_hotkey_keycombo_focus_in_event),
+ NULL);
g_signal_connect ((gpointer) hotkey_is_global, "toggled",
G_CALLBACK (on_hotkey_is_global_toggled),
NULL);