Adding upstream version 0.9.0.
[debian/lxpanel.git] / src / input-button.c
index 6bd0166..feb65ae 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Andriy Grytsenko <andrej@rep.kiev.ua>
+ * Copyright (C) 2014-2016 Andriy Grytsenko <andrej@rep.kiev.ua>
  *
  * This file is a part of LXPanel project.
  *
@@ -31,6 +31,8 @@
 
 #include <keybinder.h>
 
+static GHashTable *all_bindings = NULL;
+
 /* generated by glib-genmarshal for BOOL:STRING */
 static
 void _marshal_BOOLEAN__STRING (GClosure     *closure,
@@ -131,6 +133,12 @@ static void _button_set_click_label(GtkButton *btn, guint keyval, GdkModifierTyp
 
     mod_text = gtk_accelerator_get_label(0, state);
     btn_text = gdk_keyval_name(keyval);
+    if (btn_text == NULL)
+    {
+        gtk_button_set_label(btn, "");
+        g_free(mod_text);
+        return;
+    }
     switch (btn_text[0])
     {
     case '1':
@@ -197,6 +205,17 @@ static gboolean on_key_event(GtkButton *test, GdkEventKey *event,
         g_free(text);
         return FALSE;
     }
+    /* if BackSpace pressed then just clear the button */
+    if (state == 0 && event->keyval == GDK_KEY_BackSpace)
+    {
+        g_signal_emit(btn, signals[CHANGED], 0, NULL, &ret);
+        if (ret)
+        {
+            btn->mods = 0;
+            btn->key = 0;
+        }
+        goto _done;
+    }
     /* drop single printable and printable with single Shift, Ctrl, Alt */
     if (event->length != 0 && (state == 0 || state == GDK_SHIFT_MASK ||
                                state == GDK_CONTROL_MASK || state == GDK_MOD1_MASK))
@@ -222,6 +241,7 @@ static gboolean on_key_event(GtkButton *test, GdkEventKey *event,
         btn->mods = state;
         btn->key = event->keyval;
     }
+_done:
     text = gtk_accelerator_get_label(btn->key, btn->mods);
     gtk_button_set_label(test, text);
     g_free(text);
@@ -375,7 +395,13 @@ gboolean lxpanel_apply_hotkey(char **hkptr, const char *keystring,
     g_return_val_if_fail(hkptr != NULL, FALSE);
     g_return_val_if_fail(handler != NULL, FALSE);
 
-    if (keystring != NULL && !keybinder_bind(keystring, handler, user_data))
+    if (G_UNLIKELY(all_bindings == NULL))
+        all_bindings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+
+    if (keystring != NULL &&
+        /* check if it was already grabbed in some other place */
+        (g_hash_table_lookup(all_bindings, keystring) != NULL ||
+         !keybinder_bind(keystring, handler, user_data)))
     {
         if (show_error)
         {
@@ -392,9 +418,14 @@ gboolean lxpanel_apply_hotkey(char **hkptr, const char *keystring,
         return FALSE;
     }
     if (*hkptr != NULL)
+    {
         keybinder_unbind(*hkptr, handler);
-    g_free(*hkptr);
+        if (!g_hash_table_remove(all_bindings, *hkptr))
+            g_warning("%s: hotkey %s not found in hast table", __FUNCTION__, *hkptr);
+    }
     *hkptr = g_strdup(keystring);
+    if (*hkptr)
+        g_hash_table_insert(all_bindings, *hkptr, *hkptr);
     return TRUE;
 }
 
@@ -407,7 +438,7 @@ guint panel_config_click_parse(const char *keystring, GdkModifierType *mods)
         return 0;
     gtk_accelerator_parse(keystring, &key, mods);
     name = gdk_keyval_name(key);
-    if (name[0] >= '1' && name[0] <= '9')
+    if (name && name[0] >= '1' && name[0] <= '9')
         return (name[0] - '0');
     return 0;
 }