diff options
-rw-r--r-- | plugins/gtkui/callbacks.c | 3 | ||||
-rw-r--r-- | plugins/gtkui/callbacks.h | 26 | ||||
-rw-r--r-- | plugins/gtkui/deadbeef.glade | 6 | ||||
-rw-r--r-- | plugins/gtkui/hotkeys.c | 156 | ||||
-rw-r--r-- | plugins/gtkui/interface.c | 16 |
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); |