Index: ui/UI.xs =================================================================== --- ui/UI.xs (revision 5190) +++ ui/UI.xs (working copy) @@ -106,3 +106,71 @@ irssi_boot(UI__Formats); irssi_boot(UI__Themes); irssi_boot(UI__Window); + +MODULE = Irssi::UI PACKAGE = Irssi + +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_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 + +void +binding_remove(key) +char *key +CODE: + key_configure_remove(key); Index: ui/module.h =================================================================== --- ui/module.h (revision 5190) +++ ui/module.h (working copy) @@ -12,3 +12,4 @@ 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;