From 73f47425b315285b7c6576706f8892675e6d81d4 Mon Sep 17 00:00:00 2001 From: Tom Feist 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 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