aboutsummaryrefslogblamecommitdiffstats
path: root/patches/binding-api.patch
blob: cafbbee40ccbd306df88683b69d71261a7998a55 (plain) (tree)

































































































































































































































                                                                                  
From 73f47425b315285b7c6576706f8892675e6d81d4 Mon Sep 17 00:00:00 2001
From: Tom Feist <shabble@metavore.org>
Date: Wed, 6 Apr 2011 22:37:22 +0100
Subject: [PATCH 1/2] attempting to move binding API to separate xs file

---
 src/perl/Makefile.am    |    1 +
 src/perl/ui/Bindings.xs |  109 +++++++++++++++++++++++++++++++++++++++++++++++
 src/perl/ui/module.h    |    1 +
 3 files changed, 111 insertions(+), 0 deletions(-)
 create mode 100644 src/perl/ui/Bindings.xs

diff --git a/src/perl/Makefile.am b/src/perl/Makefile.am
index 909f4a8..1091df4 100644
--- a/src/perl/Makefile.am
+++ b/src/perl/Makefile.am
@@ -100,6 +100,7 @@ ui_sources = \
 	ui/Formats.xs \
 	ui/Themes.xs \
 	ui/Window.xs \
+	ui//Bindings.xs \
 	ui/Makefile.PL.in \
 	ui/typemap \
 	ui/module.h
diff --git a/src/perl/ui/Bindings.xs b/src/perl/ui/Bindings.xs
new file mode 100644
index 0000000..6522377
--- /dev/null
+++ b/src/perl/ui/Bindings.xs
@@ -0,0 +1,109 @@
+#include "module.h"
+
+void populate_binding_array(AV *value_array, KEY_REC *key_rec) {
+    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));
+}
+
+MODULE = Irssi::UI  PACKAGE = Irssi
+
+PROTOTYPES: ENABLE
+
+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();
+
+            populate_binding_array(value_array, key_rec);
+
+            /* wedge it all into a reference so we can use it in the hash */
+            SV* value_ref = newRV_noinc((SV*)value_array);
+
+            /* and finally, set up the hash */
+            hv_store(RETVAL, key_rec->key, strlen(key_rec->key),
+                     value_ref, 0);
+		}
+    }
+OUTPUT:
+    RETVAL
+
+SV*
+binding_add(key, function, data)
+char *key
+char *function
+char *data
+CODE:
+
+    if (key_info_find(function) == NULL)
+        RETVAL = &PL_sv_no;
+	else {
+        key_configure_add(function, key, data);
+        RETVAL = &PL_sv_yes;
+    }
+OUTPUT:
+   RETVAL
+
+AV*
+binding_find(searchkey)
+char *searchkey
+PREINIT:
+    GSList *info, *key;
+    int    len;
+    int    done = 0;
+CODE:
+    RETVAL = newAV();
+    sv_2mortal((SV*)RETVAL);
+
+    len = searchkey == NULL ? 0 : strlen(searchkey);
+
+    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;
+
+            if (strlen(key_rec->key) != len) {
+                continue;
+            }
+
+            if (g_strncasecmp(key_rec->key, searchkey, len) == 0) {
+                populate_binding_array(RETVAL, key_rec);
+                done = 1;
+                break;
+            }
+        }
+        if (done) { break; }
+    }
+OUTPUT:
+   RETVAL
+
+void
+binding_remove(key)
+char *key
+CODE:
+    key_configure_remove(key);
diff --git a/src/perl/ui/module.h b/src/perl/ui/module.h
index 3177503..d48a6d8 100644
--- a/src/perl/ui/module.h
+++ b/src/perl/ui/module.h
@@ -12,3 +12,4 @@ typedef WINDOW_REC *Irssi__UI__Window;
 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;
-- 
1.7.4.2


From 16dc3266a8931ccf45978428882f6f21ff5c39ca Mon Sep 17 00:00:00 2001
From: Tom Feist <shabble@metavore.org>
Date: Thu, 7 Apr 2011 00:24:37 +0100
Subject: [PATCH 2/2] bindings: working as separate xs files.

---
 src/perl/Makefile.am    |    2 +-
 src/perl/ui/Bindings.xs |    7 ++-----
 src/perl/ui/UI.xs       |    1 +
 3 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/src/perl/Makefile.am b/src/perl/Makefile.am
index 1091df4..d0850d3 100644
--- a/src/perl/Makefile.am
+++ b/src/perl/Makefile.am
@@ -100,7 +100,7 @@ ui_sources = \
 	ui/Formats.xs \
 	ui/Themes.xs \
 	ui/Window.xs \
-	ui//Bindings.xs \
+	ui/Bindings.xs \
 	ui/Makefile.PL.in \
 	ui/typemap \
 	ui/module.h
diff --git a/src/perl/ui/Bindings.xs b/src/perl/ui/Bindings.xs
index 6522377..6c7037c 100644
--- a/src/perl/ui/Bindings.xs
+++ b/src/perl/ui/Bindings.xs
@@ -1,6 +1,6 @@
 #include "module.h"
 
-void populate_binding_array(AV *value_array, KEY_REC *key_rec) {
+static void populate_binding_array(AV *value_array, KEY_REC *key_rec) {
     char *kinfo = key_rec->info->id;
     char *kdata = key_rec->data;
 
@@ -15,8 +15,7 @@ void populate_binding_array(AV *value_array, KEY_REC *key_rec) {
               : newSV(0));
 }
 
-MODULE = Irssi::UI  PACKAGE = Irssi
-
+MODULE = Irssi::UI::Bindings  PACKAGE = Irssi
 PROTOTYPES: ENABLE
 
 HV*
@@ -25,7 +24,6 @@ PREINIT:
     GSList *info;
     GSList  *key;
 CODE:
-
     RETVAL = newHV();
     sv_2mortal((SV*)RETVAL);
 
@@ -58,7 +56,6 @@ char *key
 char *function
 char *data
 CODE:
-
     if (key_info_find(function) == NULL)
         RETVAL = &PL_sv_no;
 	else {
diff --git a/src/perl/ui/UI.xs b/src/perl/ui/UI.xs
index d8c7f7a..87b14ae 100644
--- a/src/perl/ui/UI.xs
+++ b/src/perl/ui/UI.xs
@@ -106,3 +106,4 @@ BOOT:
 	irssi_boot(UI__Formats);
 	irssi_boot(UI__Themes);
 	irssi_boot(UI__Window);
+    irssi_boot(UI__Bindings);
-- 
1.7.4.2