--- /home/compile/uim-el-0.0.6-beta3/uim-el-agent/callback.c 2005-11-27 15:52:06.000000000 +0900 +++ uim-el-agent/callback.c 2005-12-09 01:20:18.000000000 +0900 @@ -150,3 +150,17 @@ update_prop_label(ua->prop, str); } + +void +configuration_changed_cb(void *ptr) +{ + + uim_agent_context *ua = (uim_agent_context *)ptr; + + /* configuration of context has changed at uim side */ + debug_printf(DEBUG_NOTE, "configuration_changed_cb\n"); + + update_context_configuration(ua); + +} + diff -ruB /home/compile/uim-el-0.0.6-beta3/uim-el-agent/callback.h uim-el-agent/callback.h --- /home/compile/uim-el-0.0.6-beta3/uim-el-agent/callback.h 2005-11-27 15:33:56.000000000 +0900 +++ uim-el-agent/callback.h 2005-12-08 22:41:56.000000000 +0900 @@ -65,7 +65,9 @@ void candidate_shift_page_cb(void *ptr, int direction); void candidate_deactivate_cb(void *ptr); -void prop_list_update_cb(void *ptr , const char *str); -void prop_label_update_cb(void *ptr , const char *str); +void prop_list_update_cb(void *ptr, const char *str); +void prop_label_update_cb(void *ptr, const char *str); + +void configuration_changed_cb(void *ptr); #endif diff -ruB /home/compile/uim-el-0.0.6-beta3/uim-el-agent/context.c uim-el-agent/context.c --- /home/compile/uim-el-0.0.6-beta3/uim-el-agent/context.c 2005-11-27 15:54:32.000000000 +0900 +++ uim-el-agent/context.c 2005-12-09 01:21:36.000000000 +0900 @@ -42,6 +42,39 @@ uim_agent_context_list *agent_context_list_head = NULL; uim_agent_context_list *agent_context_list_tail = NULL; +static void +update_context_im(uim_agent_context *ua) +{ + debug_printf(DEBUG_NOTE, "update_context_im\n"); + + uim_switch_im(ua->context, ua->im); + + if (ua->im && strcmp(ua->im, uim_get_current_im_name(ua->context)) != 0) { + debug_printf(DEBUG_ERROR, + "update_context_im: failed to switch IM to %s\n", ua->im); + free(ua->im); + ua->im = strdup(uim_get_current_im_name(ua->context)); + } +} + +static void +update_context_encoding(uim_agent_context *ua) +{ + + debug_printf(DEBUG_NOTE, "update_context_encoding\n"); + + /* discard current context */ + clear_candidate(ua->pe->cand); + clear_preedit(ua->pe); + uim_release_context(ua->context); + + ua->context = create_context(ua->encoding, ua); + + update_context_im(ua); + +} + + /* search context */ uim_agent_context * get_uim_agent_context(int id) @@ -71,55 +106,45 @@ return ua; } + if (ua->im) free(ua->im); + + if (im) + ua->im = strdup(im); + else + ua->im = NULL; + if (strcmp(ua->encoding, encoding) == 0) { /* encodings are same */ debug_printf(DEBUG_NOTE, "same encoding %s %s\n", ua->im, im); - if (ua->im) free(ua->im); - - if (im) - ua->im = strdup(im); - else - ua->im = NULL; - - uim_switch_im(ua->context, im); + update_context_im(ua); uim_prop_label_update(ua->context); uim_prop_list_update(ua->context); - return ua; - } else { /* encodings are different */ debug_printf(DEBUG_NOTE, "different encoding %s %s\n", ua->encoding, encoding); - /* discard current context */ - clear_candidate(ua->pe->cand); - clear_preedit(ua->pe); - uim_release_context(ua->context); + if (ua->encoding) free(ua->encoding); + ua->encoding = strdup(encoding); - ua->context = create_context(encoding, ua); + update_context_encoding(ua); - uim_switch_im(ua->context, im); + } - if (ua->im) free(ua->im); + uim_prop_label_update(ua->context); + uim_prop_list_update(ua->context); - ua->im = strdup(uim_get_current_im_name(ua->context)); + return ua; - if (ua->encoding) free(ua->encoding); - - ua->encoding = strdup(encoding); +} - uim_prop_label_update(ua->context); - uim_prop_list_update(ua->context); - return ua; - } -} uim_context @@ -150,6 +175,9 @@ uim_set_prop_label_update_cb(context, prop_label_update_cb); + + uim_set_configuration_changed_cb(context, + configuration_changed_cb); return context; @@ -285,3 +313,28 @@ return -1; } + + +/* handle configuration change */ +void +update_context_configuration(uim_agent_context *ua) +{ + + /* configuration of context has changed at uim side */ + debug_printf(DEBUG_NOTE, "update_context_configuration\n"); + + /* update IM name */ + if (ua->im) free(ua->im); + ua->im = strdup(uim_get_current_im_name(ua->context)); + + debug_printf(DEBUG_NOTE, "ua->im %s\n", ua->im); + + if (ua->encoding) free(ua->encoding); + ua->encoding = strdup(get_im_encoding(ua->im)); + + debug_printf(DEBUG_NOTE, "ua->encoding %s\n", ua->encoding); + + /* switch IM again to update encoding for Emacs...orz */ + update_context_encoding(ua); + +} diff -ruB /home/compile/uim-el-0.0.6-beta3/uim-el-agent/context.h uim-el-agent/context.h --- /home/compile/uim-el-0.0.6-beta3/uim-el-agent/context.h 2005-11-27 15:34:41.000000000 +0900 +++ uim-el-agent/context.h 2005-12-09 01:13:15.000000000 +0900 @@ -49,6 +49,7 @@ #include "preedit.h" #include "im.h" #include "callback.h" +#include "encoding.h" typedef struct uim_agent_context { uim_context context; @@ -78,6 +79,8 @@ uim_agent_context *switch_context_im(uim_agent_context *ua, const char *im, const char *encoding); +void update_context_configuration(uim_agent_context *ua); + /* current focused context */ extern uim_agent_context *current; diff -ruB /home/compile/uim-el-0.0.6-beta3/uim-el-agent/encoding.c uim-el-agent/encoding.c --- /home/compile/uim-el-0.0.6-beta3/uim-el-agent/encoding.c 2005-11-27 15:35:11.000000000 +0900 +++ uim-el-agent/encoding.c 2005-12-09 01:17:19.000000000 +0900 @@ -38,6 +38,7 @@ im_encoding *im_enc_list_head = NULL, *im_enc_list_tail = NULL; +char default_encoding[] = "UTF-8"; /* search encoding entry */ im_encoding * @@ -130,6 +131,7 @@ debug_printf(DEBUG_NOTE, " encoding = %s\n", im_enc->encoding); return im_enc->encoding; } else { - return NULL; + /*return NULL;*/ + return default_encoding; } } diff -ruB /home/compile/uim-el-0.0.6-beta3/uim-el-agent/encoding.h uim-el-agent/encoding.h --- /home/compile/uim-el-0.0.6-beta3/uim-el-agent/encoding.h 2005-11-27 15:35:17.000000000 +0900 +++ uim-el-agent/encoding.h 2005-12-09 01:17:20.000000000 +0900 @@ -52,6 +52,8 @@ extern im_encoding *im_enc_list_head, *im_enc_list_tail; +extern char default_encoding[]; + im_encoding *search_im_encoding(const char *im); im_encoding *new_im_encoding(const char *im, const char *encoding); int set_im_encoding(const char *im, const char *encoding); diff -ruB /home/compile/uim-el-0.0.6-beta3/uim-el-agent/prop.c uim-el-agent/prop.c --- /home/compile/uim-el-0.0.6-beta3/uim-el-agent/prop.c 2005-11-27 15:55:19.000000000 +0900 +++ uim-el-agent/prop.c 2005-12-08 20:58:47.000000000 +0900 @@ -44,6 +44,8 @@ prop->list = strdup(str); + debug_printf(DEBUG_NOTE, "prop->list: %s\n", prop->list); + prop->list_update = 1; } @@ -55,6 +57,8 @@ prop->label = strdup(str); + debug_printf(DEBUG_NOTE, "prop->label: %s\n", prop->label); + prop->label_update = 1; }