diff -ru old-freetalk/doc/freetalk.texi new-freetalk/doc/freetalk.texi --- old-freetalk/doc/freetalk.texi 2006-08-19 12:13:41.000000000 +0200 +++ new-freetalk/doc/freetalk.texi 2006-08-19 12:29:03.000000000 +0200 @@ -939,6 +939,19 @@ @end deffn @prindex ft-display address@hidden primitive ft-bind-to-ctrl-key char command +Binds CTRL+ given @var{char} to arbitrary scm @var{command}. Allows for +displaying roster or whatever by just pressing a key even +during composition of new messages, +keeping the readline state as-is. + +Example: address@hidden +(ft-bind-to-ctrl-key #\a "(/who \"all\")") address@hidden lisp address@hidden deffn address@hidden ft-bind-to-ctrl-key + @node Configuration procedures, Hook related procedures, General procedures, Procedures @section Configuration procedures diff -ru old-freetalk/extensions/first-time-run.sh new-freetalk/extensions/first-time-run.sh --- old-freetalk/extensions/first-time-run.sh 2006-08-19 12:13:42.000000000 +0200 +++ new-freetalk/extensions/first-time-run.sh 2006-08-19 12:26:13.000000000 +0200 @@ -49,6 +49,11 @@ ; (begin ; (ft-set-prompt! "~\\\/~ ") ; (ft-set-status-msg! "chat I use GNU Freetalk"))))) +;;; +;;; Let ctrl-a display full roster, ctrl-e who i am, ctrl-h online buddies +; (ft-bind-to-ctrl-key #\a "(/who \"all\")") +; (ft-bind-to-ctrl-key #\e "(/whoami \"\")") +; (ft-bind-to-ctrl-key #\h "(/who \"\")") EOF mkdir -p "${CONFIG_BASE}/extensions"; mkdir -p "${CONFIG_BASE}/downloads"; diff -ru old-freetalk/src/extensions.cc new-freetalk/src/extensions.cc --- old-freetalk/src/extensions.cc 2006-08-19 12:13:41.000000000 +0200 +++ new-freetalk/src/extensions.cc 2006-08-19 12:27:14.000000000 +0200 @@ -189,6 +189,7 @@ gh_new_procedure2_0 ("ft-set-allow-file", ex_set_allow_file); gh_new_procedure1_0 ("ft-change-password", ex_change_password); + gh_new_procedure2_0 ("ft-bind-to-ctrl-key", ex_bind_to_ctrl_key); } void diff -ru old-freetalk/src/freetalk.cc new-freetalk/src/freetalk.cc --- old-freetalk/src/freetalk.cc 2006-08-19 12:13:43.000000000 +0200 +++ new-freetalk/src/freetalk.cc 2006-08-19 12:26:13.000000000 +0200 @@ -45,6 +45,13 @@ ft_state state; +GSList *key_bindings = NULL; + +typedef struct { + char key; + char *command; +} key_binding; + static void state_init (void) { @@ -287,3 +294,41 @@ lm_message_unref (send_msg); return result; } + +int ft_key_bound (int count, int key) +{ + GSList *list; + for (list = key_bindings; list; list = list->next) { + key_binding *b = (key_binding*) list->data; + if (b->key == key) { + scm_c_eval_string (b->command); + scm_force_output (scm_current_output_port ()); + return 0; + } + } + return 1; +} + +void ft_bind_key (char key, char *command) +{ + GSList *list; + for (list = key_bindings; list; list = list->next) { + key_binding *b = (key_binding*) list->data; + if (b->key == key) { + char *old = b->command; + b->command = strdup (command); + free (old); + return; + } + } + key_binding *b = (key_binding*) malloc (sizeof (key_binding)); + b->key = key; + b->command = strdup (command); + rl_bind_key (key, &ft_key_bound); + key_bindings = g_slist_append (key_bindings, b); +} + +void ft_bind_to_ctrl_key (char key, char *command) +{ + ft_bind_key (CTRL (key), command); +} diff -ru old-freetalk/src/freetalk.h new-freetalk/src/freetalk.h --- old-freetalk/src/freetalk.h 2006-08-19 12:13:43.000000000 +0200 +++ new-freetalk/src/freetalk.h 2006-08-19 12:27:31.000000000 +0200 @@ -71,5 +71,7 @@ void interface_init (void); int ft_msg_iq_version_cb (LmMessage*); int ft_msg_iq_last_cb (LmMessage*); +void ft_bind_key (char key, char *command); +void ft_bind_to_ctrl_key (char key, char *command); #endif /* __FREETALK_H__ */ diff -ru old-freetalk/src/primitives.cc new-freetalk/src/primitives.cc --- old-freetalk/src/primitives.cc 2006-08-19 12:13:41.000000000 +0200 +++ new-freetalk/src/primitives.cc 2006-08-19 12:26:13.000000000 +0200 @@ -489,3 +489,10 @@ do_change_password (npass); return SCM_UNSPECIFIED; } + +SCM +ex_bind_to_ctrl_key (SCM key, SCM command) +{ + ft_bind_to_ctrl_key (SCM_CHAR (key), SCM_STRING_CHARS (command)); + return SCM_UNSPECIFIED; +} diff -ru old-freetalk/src/primitives.h new-freetalk/src/primitives.h --- old-freetalk/src/primitives.h 2006-08-19 12:13:41.000000000 +0200 +++ new-freetalk/src/primitives.h 2006-08-19 12:26:13.000000000 +0200 @@ -108,4 +108,6 @@ SCM ex_roster_set_nickname (SCM jid, SCM nickname); +SCM ex_bind_to_ctrl_key (SCM key, SCM command); + #endif /* __PRIMITIVES_H__ */