aboutsummaryrefslogtreecommitdiffstats
path: root/patches/add_bindings_list_interface.patch
blob: 828644487039b3cc1ef318994422907ac981c170 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Index: ui/UI.xs
===================================================================
--- ui/UI.xs	(revision 5190)
+++ ui/UI.xs	(working copy)
@@ -106,3 +106,47 @@
 	irssi_boot(UI__Formats);
 	irssi_boot(UI__Themes);
 	irssi_boot(UI__Window);
+
+HV*
+bindings()
+PREINIT:
+    GSList *info;
+    GSList  *key;
+CODE:
+
+    RETVAL = newHV();
+    sv_2mortal((SV*)RETVAL);
+
+    /* loop stolen from keyboard.c#cmd_show_keys */
+
+    for (info = keyinfos; info != NULL; info = info->next) {
+        KEYINFO_REC *rec = info->data;
+		for (key = rec->keys; key != NULL; key = key->next) {
+			KEY_REC *key_rec = key->data;
+
+            /* return value { key => [ info, data ] } */
+            AV* value_array = newAV();
+
+            char *kinfo = key_rec->info->id;
+            char *kdata = key_rec->data;
+
+            /* store info, or undef if it's null */
+            av_push(value_array, kinfo != NULL
+                    ? newSVpv(kinfo, strlen(kinfo))
+                    : newSV(0));
+
+            /* ditto data */
+            av_push(value_array, kdata != NULL
+                    ? newSVpv(kdata, strlen(kdata))
+                    : newSV(0));
+
+            /* wedge it all into a reference so we can use it in the hash */
+            SV* value_ref = newRV_inc((SV*)value_array);
+
+            /* and finally, set up the hash */
+            hv_store(RETVAL, key_rec->key, strlen(key_rec->key),
+                     value_ref, 0);
+		}
+    }
+OUTPUT:
+    RETVAL
Index: ui/module.h
===================================================================
--- ui/module.h	(revision 5190)
+++ ui/module.h	(working copy)
@@ -12,3 +12,5 @@
 typedef TEXT_DEST_REC *Irssi__UI__TextDest;
 typedef THEME_REC *Irssi__UI__Theme;
 typedef KEYINFO_REC *Irssi__UI__Keyinfo;
+typedef KEY_REC *Irssi__UI__Key;
+