[uim-commit] r1180 - in branches/r5rs: . doc fep gtk helper scm test uim xim

tkng at freedesktop.org tkng at freedesktop.org
Thu Aug 11 05:34:45 EST 2005


Author: tkng
Date: 2005-08-10 12:34:32 -0700 (Wed, 10 Aug 2005)
New Revision: 1180

Modified:
   branches/r5rs/
   branches/r5rs/doc/COMPATIBILITY
   branches/r5rs/doc/HELPER-CANDWIN
   branches/r5rs/doc/HELPER-PROTOCOL
   branches/r5rs/fep/README.ja
   branches/r5rs/fep/uim-fep.c
   branches/r5rs/gtk/caret-state-indicator.c
   branches/r5rs/gtk/gtk-im-uim.c
   branches/r5rs/gtk/uim-cand-win-gtk.c
   branches/r5rs/helper/pref-gtk.c
   branches/r5rs/scm/custom-rt.scm
   branches/r5rs/scm/custom.scm
   branches/r5rs/scm/latin.scm
   branches/r5rs/test/test-custom-rt.scm
   branches/r5rs/test/test-custom.scm
   branches/r5rs/uim/uim-custom.c
   branches/r5rs/uim/uim-custom.h
   branches/r5rs/uim/uim-helper-server.c
   branches/r5rs/uim/uim-util.c
   branches/r5rs/uim/uim.c
   branches/r5rs/uim/uim.h
   branches/r5rs/xim/helper.cpp
Log:
 r2810 at t42 (orig r1159):  tkng | 2005-08-08 05:42:12 +0900
 * uim/uim-helper-server.c: This commit aims to refactoring to improve readability.
  -(close_client): Renamed from free_client. close(fd) is also processed here.
  -(write_message): New function.
  -(read_message): New function.
  -(uim_helper_server_process_connection): Simplified with calling write_message
   and read_message.
 
 r2811 at t42 (orig r1160):  tkng | 2005-08-09 04:48:47 +0900
 * uim/uim.c, uim/uim.h
  -(uim_prop_reload_configs): New function to reload configrations.
 
 * uim/uim-custom.c
  -(uim_custom_broadcast): Send custom_reload_notify instead of
   prop_update_custom. This would be faster than prop_update_custom.
 
 * doc/HELPER=PROTOCOL
  - Added description for custom_reload_notify.
 
 r2812 at t42 (orig r1161):  tkng | 2005-08-09 04:50:42 +0900
 * gtk/gtk-im-uim.c:
  -(im_uim_parse_helper_str): Corresponded to custom_reload_notify.
 
 * xim/helper.cpp:
  -(helper_str_parse): Corresponded to custom_reload_notify.
 
 r2813 at t42 (orig r1162):  yamaken | 2005-08-09 05:56:11 +0900
 * This commit reverts the removal of the prop_update_custom message
   functionality committed in r1160 and r1161 because:
 
   - The new message custom_reload_notify cannot replace some
     functionality of the prop_update_custom listed in below:
 
     * alter custom variables without saving files
 
     * alter a single custom variable
 
   - It's broken since the Scheme procedure custom-reload-configs is
     still lacking
 
   Please be conservertive when removing or alter an
   API functionality. Suggestion before such change at the mailinglist
   makes us happy.
 
 * uim/uim-custom.h
   - (uim_custom_broadcast_reload_request): New API function
 * uim/uim-custom.c
   - (uim_custom_broadcast_reload_request): New function
   - (uim_custom_broadcast): Revert the prop_update_custom
     functionality
 * gtk/gtk-im-uim.c
   - (im_uim_parse_helper_str): Ditto
 * xim/helper.cpp
   - (helper_str_parse): Ditto
 * doc/COMPATIBILITY
   - Add a new section "An experimental custom variable reloading API"
 
 r2814 at t42 (orig r1163):  tkng | 2005-08-09 06:37:42 +0900
 * scm/custom-rt.scm:
  -(custom-reload-configs): New procedure.
 
 r2815 at t42 (orig r1164):  tkng | 2005-08-09 08:52:37 +0900
 * uim/uim-custom.c: This commit aims to stop saving config file if nothing
   changed. As a result, we'll be able to avoid needless reloading of config files.
  -(file_content_is_same): New internal function.
  -(uim_custom_save_group): Don't change mtime of the file if nothing has 
    been changed.
 
 r2816 at t42 (orig r1165):  tkng | 2005-08-09 09:04:50 +0900
 * scm/custom-rt.scm: This commit aims avoid needless reloading of config files.
   If a config file is not updated, then it would not be loaded while config reloading.
  -(custom-reload-group-syms): Now this list is an alist. Spec of each element
   is: (symbol-for-config-file . mtime-of-config-file)
   We should rename this variable with more proper name.
  -(prepend-new-reload-group-syms): New procedure.
  -(update-gsym-mtime): New procedure.
  -(custom-load-group-conf, custom-reload-configs): All function which used 
   custom-reload-group-syms somewhile are modified.
   s/custom-reload-group-syms/(map car custom-reload-group-syms)/;
 
 r2817 at t42 (orig r1166):  tkng | 2005-08-09 09:07:30 +0900
 * helper/pref-gtk.c:
  -(ok_button_clicked, apply_button_clicked): Use uim_custom_broadcast_reload_request()
    instead of uim_custom_broadcast();
 
 r2818 at t42 (orig r1167):  yamaken | 2005-08-09 09:19:45 +0900
 * uim/uim-custom.c
   - (uim_custom_broadcast_reload_request): Add the description
 
 * doc/HELPER-PROTOCOL
   - set-fill-column to 78
 
 r2819 at t42 (orig r1168):  tkng | 2005-08-09 09:28:25 +0900
 * uim/uim-util.c: Oops, forgotten to commit this file.
  -(get_file_mtime): New function.
 
 r2820 at t42 (orig r1169):  yamaken | 2005-08-09 10:27:02 +0900
 * This commit reverts the changes of r1163 and replace the procedure
   custom-reload-configs with preexisting custom-reload-configs which
   has same functionality
 
 * scm/custom.scm
   - (custom-call-all-hook-procs, custom-reload-customs): Move to
     custom-rt.scm
 * scm/custom-rt.scm
   - (custom-call-all-hook-procs, custom-reload-customs): Moved from
     custom.scm
   - (custom-file-path): New procedure
   - (custom-load-group-conf):
     * Move currently defined procedure to
       custom-load-updated-group-conf
     * Revert to r1162
     * Simplify with custom-file-path
     * Add a comment
   - (custom-load-updated-group-conf):
     * Renamed from custom-load-group-conf
     * Simplify with custom-file-path
   - (custom-reload-configs):
     * Make definition switcheable between 2 procedures
     * Make custom-reload-customs default
     * Replace custom-load-group-conf with custom-load-updated-group-conf
     * Add a comment about it
 
 * test/test-custom-rt.scm
 * test/test-custom.scm
   - Modify comments
 
 r2821 at t42 (orig r1170):  yamaken | 2005-08-09 10:34:51 +0900
 * uim/uim-util.c
   - (get_file_mtime): Rename to file_mtime() to be consistent with
     other preexisting file-related function names
   - (file_mtime): Renamed from get_file_mtime()
   - (uim_init_util_subrs): Rename get-file-mtime with file-mtime to be
     consistent with other preexisting file-related procedure names
 * scm/custom-rt.scm
   - (update-gsym-mtime, custom-load-updated-group-conf): Replace
     get-file-mtime with file-mtime
 
 r2822 at t42 (orig r1171):  yamaken | 2005-08-09 11:00:21 +0900
 * uim/uim-custom.c
   - (UIM_CUSTOM_EXPERIMENTAL_MTIME_SENSING): New macro
   - (file_content_is_same): Enclose by #ifdef
     UIM_CUSTOM_EXPERIMENTAL_MTIME_SENSING
   - (uim_custom_save_group):
     * Enclose the experimental code added in r1164
     * Add a comment about the code
 
 r2823 at t42 (orig r1172):  ekato | 2005-08-09 15:21:02 +0900
 * doc/HELPER-CANDWIN : Add description about "hide_caret_state".
 
 r2824 at t42 (orig r1173):  ekato | 2005-08-09 15:22:24 +0900
 * doc/HELPER-PROTOCOL : Fix typo.
 
 r2825 at t42 (orig r1174):  yamamoto | 2005-08-10 01:06:48 +0900
  * fep/uim-fep.c (main) :
    change the values of UIM_FEP_SETMODE and UIM_FEP_GETMODE
 
 r2826 at t42 (orig r1175):  tkng | 2005-08-10 07:05:23 +0900
 * gtk/caret-state-indicator.c: Improved the appearance of state-indicator.
  -(caret_state_indicator_paint_window): New callback function to paint
    to dwaw square frame.
  -(caret_state_indicator_new): Connect above callback function.
 
 r2827 at t42 (orig r1176):  tkng | 2005-08-10 07:46:01 +0900
 * gtk/caret-state-indicator.c: This commit aims to handle timout properly.
  -(get_current_time): New function.
  -(caret_state_indicator_timeout): Hide indicator only when time passes enough
    from the recent calling of timeout setting function.
  -(caret_state_indicator_set_timeout): Record called time.
 
 r2828 at t42 (orig r1177):  tkng | 2005-08-10 09:52:47 +0900
 * gtk/uim-cand-win-gtk.c:
  -(uim_cand_win_gtk_init): Frame appended.
 
 r2829 at t42 (orig r1178):  tkng | 2005-08-10 19:51:38 +0900
 * gtk/uim-cand-win-gtk.c:
  -(uim_cand_win_gtk_init): Fontsize has been adjusted to 1.2 times. 
    (Scale factor should be configrable in a few days.)
 
 r2830 at t42 (orig r1179):  tkng | 2005-08-11 04:17:46 +0900
 * scm/latin.scm: Implemented Multi key support.
  -(latin-backspace-key?, latin-commit-key?, latin-multi-key?): New key definitions.
  -(latin-compose-rule): Removed needless "\\".
  -(latin-context-new, latin-context-flush, latin-update-preedit,
    latin-commit-raw, latin-commit, latin-proc-composing-state,
    latin-proc-raw-state, latin-press-key-handler, latin-release-key-handler,
    latin-reset-handler,latin-get-candidate-handler, latin-set-candidate-index-handler):
    New functions.
 



Property changes on: branches/r5rs
___________________________________________________________________
Name: svk:merge
   - fb73e508-85ea-0310-95c3-a85c473e0941:/trunk:1154
   + fb73e508-85ea-0310-95c3-a85c473e0941:/trunk:1179

Modified: branches/r5rs/doc/COMPATIBILITY
===================================================================
--- branches/r5rs/doc/COMPATIBILITY	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/doc/COMPATIBILITY	2005-08-10 19:34:32 UTC (rev 1180)
@@ -58,6 +58,19 @@
 The changes are described below in most recently updated order.
 
 ------------------------------------------------------------------------------
+Summary: An experimental custom variable reloading API
+Affects: Helper program developers, Bridge developers
+Updates: C API, Helper protocol
+Version: 0.5
+Revision: ac1160, ac1161, ac1162
+Date: 2005-08-09
+Modifier: TOKUNAGA Hiroyuki, YamaKen
+Related: bug #3620
+URL:
+Changes:
+  (new) uim_custom_broadcast_reload_request()
+Description:
+------------------------------------------------------------------------------
 Summary: default IM switching responsibility separation from uim_switch_im()
 Affects: Bridge developers
 Updates: C API

Modified: branches/r5rs/doc/HELPER-CANDWIN
===================================================================
--- branches/r5rs/doc/HELPER-CANDWIN	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/doc/HELPER-CANDWIN	2005-08-10 19:34:32 UTC (rev 1180)
@@ -22,7 +22,8 @@
 	      hide       |
 	      deactivate |
 	      show_caret_state |
-	      update_caret_state) "\n"
+	      update_caret_state |
+	      hide_caret_state) "\n"
   charset_specifier = "charset=" charset "\n"
   charset = "UTF-8" | "EUC-JP" | "GB18030" |
             <or any name that can be specified as iconv_open(3) argument>
@@ -82,6 +83,11 @@
 
     update_caret_state = "update_caret_state" "\n"
 
+  9. hide_caret_state
+    Hide caret state of the input mode
+
+    hide_caret_state = "hide_caret_state" "\n"
+
 Sending Message format BNF
   session  = messages
   messages = messages message | message

Modified: branches/r5rs/doc/HELPER-PROTOCOL
===================================================================
--- branches/r5rs/doc/HELPER-PROTOCOL	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/doc/HELPER-PROTOCOL	2005-08-10 19:34:32 UTC (rev 1180)
@@ -92,6 +92,7 @@
               im_change_whole_desktop         |
               im_change_this_application_only |
               prop_update_custom  |
+              custom_reload_notify |
               commit_string) "\n"
 
   charset_specifier = "charset=" charset "\n"
@@ -328,6 +329,14 @@
     custom_sym = /^[-\?a-zA-Z0-9]+$/
     custom_value = <valid S-expression>
 
+  - custom_reload_notify
+
+    This is a notification message to reload configrations. If a process
+    receive this message, the process should reload configrations
+    somehow. This message maybe needless in the future.
+
+    custom_reload_notify = "custom_reload_notify\n"
+
   - commit_string
 
     This message commits a string to currently focused context. See also
@@ -335,3 +344,9 @@
     
     commit_string = "commit_string\n" str_to_commit "\n"
     str_to_commit = /^[^\n]+$/
+
+
+Local Variables:
+mode: indented-text
+fill-column: 78
+End:

Modified: branches/r5rs/fep/README.ja
===================================================================
--- branches/r5rs/fep/README.ja	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/fep/README.ja	2005-08-10 19:34:32 UTC (rev 1180)
@@ -159,13 +159,23 @@
   o -S
     GNU screen¤Ç¥Õ¥£¥ë¥¿¤È¤·¤Æ»È¤¨¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£(GNU screen 4.0.2°Ê¹ß)
     Î㤨¤Ð¡¢~/.screenrc¤Ë
+
     bind J exec | uim-fep -S
     bind K eval 'exec cat' kill redisplay
+
     ¤³¤Î¤è¤¦¤Ë½ñ¤±¤Ð¡¢C-a J¤Çuim-fep¤ò¥Õ¥£¥ë¥¿¤È¤·¤Æµ¯Æ°¤·¡¢C-a K
     ¤Ç½ªÎ»¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
+
     -s¥ª¥×¥·¥ç¥ó¤Ë¤«¤«¤ï¤é¤º¥â¡¼¥Éɽ¼¨¤Ë¤Ï
     backtick¤¬»È¤ï¤ì¤Þ¤¹¡£
 
+    UIM_FEP_SETMODE, UIM_FEP_GETMODE¤ÎÃͤÏ
+    $TMP/uim-fep-setmode-$STY-$WINDOW
+    $TMP/uim-fep-getmode-$STY-$WINDOW
+    ¤Ë¤Ê¤ê¤Þ¤¹¡£
+    ($TMP¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï/tmp¤¬»È¤ï¤ì¤ë)
+
+
   o -d
     ¸õÊä°ìÍ÷¤Îɽ¼¨¥¹¥¿¥¤¥ë¤òddskk¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£
 

Modified: branches/r5rs/fep/uim-fep.c
===================================================================
--- branches/r5rs/fep/uim-fep.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/fep/uim-fep.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -224,6 +224,9 @@
     UNDEFINED  /* background */
   };
   FILE *fp;
+  const char *tmp_dir;
+  const char *sty_str;
+  const char *win_str;
 
   int op;
 
@@ -371,18 +374,24 @@
   tcgetattr(g_win_in, &s_save_tios);
   setupterm(NULL, g_win_out, NULL);
 
-  if (getenv("TMP")) {
-    struct passwd *pw = getpwuid(getuid());
-    /* Generate get mode filepath */
-    snprintf(s_path_getmode, sizeof(s_path_getmode), "%s/uim-fep-%s-%d-getmode", getenv("TMP"), pw->pw_name, getpid());
-    /* Generate set mode filepath */
-    snprintf(s_path_setmode, sizeof(s_path_setmode), "%s/uim-fep-%s-%d-setmode", getenv("TMP"), pw->pw_name, getpid());
+  if ((tmp_dir = getenv("TMP")) == NULL) {
+    tmp_dir = "/tmp";
+  }
+
+  if (gnu_screen && (sty_str = getenv("STY")) != NULL && (win_str = getenv("WINDOW")) != NULL) {
+    snprintf(s_path_getmode, sizeof(s_path_getmode), "%s/uim-fep-getmode-%s-%s", tmp_dir, sty_str, win_str);
+    snprintf(s_path_setmode, sizeof(s_path_setmode), "%s/uim-fep-setmode-%s-%s", tmp_dir, sty_str, win_str);
   } else {
-    struct passwd *pw = getpwuid(getuid());
-    /* Generate get mode filepath */
-    snprintf(s_path_getmode, sizeof(s_path_getmode), "/tmp/uim-fep-%s-%d-getmode", pw->pw_name, getpid());
-    /* Generate set mode filepath */
-    snprintf(s_path_setmode, sizeof(s_path_setmode), "/tmp/uim-fep-%s-%d-setmode", pw->pw_name, getpid());
+    struct stat stat_buf;
+    int file_suffix = 1;
+
+    snprintf(s_path_getmode, sizeof(s_path_getmode), "%s/uim-fep-getmode-%d", tmp_dir, getpid());
+    snprintf(s_path_setmode, sizeof(s_path_setmode), "%s/uim-fep-setmode-%d", tmp_dir, getpid());
+    while (stat(s_path_getmode, &stat_buf) == 0 && stat(s_path_setmode, &stat_buf) == 0) {
+      snprintf(s_path_getmode, sizeof(s_path_getmode), "%s/uim-fep-getmode-%d-%d", tmp_dir, getpid(), file_suffix);
+      snprintf(s_path_setmode, sizeof(s_path_setmode), "%s/uim-fep-setmode-%d-%d", tmp_dir, getpid(), file_suffix);
+      file_suffix++;
+    }
   }
 
   env_buf = malloc(30);
@@ -882,6 +891,10 @@
   if (g_opt.status_type == LASTLINE) {
     win->ws_row--;
   }
+#ifdef PTY_TEST
+  win->ws_col = 140;
+  win->ws_row = 50;
+#endif
   return win;
 }
 

Modified: branches/r5rs/gtk/caret-state-indicator.c
===================================================================
--- branches/r5rs/gtk/caret-state-indicator.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/gtk/caret-state-indicator.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -42,9 +42,50 @@
  * caret state indicator is a state indicator nearby the caret.
  */
 
+#define DEFAULT_WINDOW_WIDTH  20
+#define DEFAULT_WINDOW_HEIGHT 20
+
 static gint
+get_current_time(void);
+static gint
 caret_state_indicator_timeout(gpointer data);
 
+/* This function is not correct, size of tv_sec is glong, not gint */
+static gint
+get_current_time(void)
+{
+  GTimeVal result;
+  g_get_current_time(&result);
+  return result.tv_sec;
+}
+
+static gint
+caret_state_indicator_timeout(gpointer data)
+{
+  GtkWidget *window = GTK_WIDGET(data);
+  gint timeout      = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(window), "timeout"));
+  gint called_time  = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(window), "called_time"));
+  gint current_time = get_current_time();
+  if((current_time - called_time)*1000 >= timeout) {
+    gtk_widget_hide(window);
+  }
+  return 0;
+}
+
+static gint
+caret_state_indicator_paint_window (GtkWidget *window)
+{
+  GtkRequisition req;
+
+  gtk_widget_size_request (window, &req);
+  gtk_paint_flat_box (window->style, window->window,
+		      GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+		      NULL, GTK_WIDGET(window), "tooltip",
+		      0, 0, DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT);
+
+  return FALSE;
+}
+
 GtkWidget *
 caret_state_indicator_new(void)
 {
@@ -55,9 +96,19 @@
   label  = gtk_label_new("");
   gtk_container_add(GTK_CONTAINER(window), label);
 
-  gtk_window_set_default_size(GTK_WINDOW(window), 20, 20);
+  gtk_window_set_default_size(GTK_WINDOW(window),
+			      DEFAULT_WINDOW_WIDTH,
+			      DEFAULT_WINDOW_HEIGHT);
+    gtk_widget_set_app_paintable (window, TRUE);
 
+    g_signal_connect(window, "expose_event",
+		     G_CALLBACK (caret_state_indicator_paint_window), 
+		     NULL);
+
+  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
+
   g_object_set_data(G_OBJECT(window), "label", label);
+
   return window;
 }
 
@@ -92,13 +143,10 @@
 void
 caret_state_indicator_set_timeout(GtkWidget *window, gint timeout)
 {
+  gint current_time = get_current_time();
+
   g_timeout_add(timeout, caret_state_indicator_timeout, (gpointer)window);
+  g_object_set_data(G_OBJECT(window), "timeout", GINT_TO_POINTER(timeout));
+  g_object_set_data(G_OBJECT(window), "called_time", GINT_TO_POINTER(current_time));
+  /* "called_time" stores the time of last calling of this function */
 }
-
-static gint
-caret_state_indicator_timeout(gpointer data)
-{
-  GtkWidget *window = GTK_WIDGET(data);
-  gtk_widget_hide(window);
-  return 0;
-}

Modified: branches/r5rs/gtk/gtk-im-uim.c
===================================================================
--- branches/r5rs/gtk/gtk-im-uim.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/gtk/gtk-im-uim.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -995,6 +995,8 @@
       }
       g_strfreev(lines);
     }
+  } else if (g_str_has_prefix(str, "custom_reload_notify") == TRUE) {
+    uim_prop_reload_configs();
   } else if (focused_context && !disable_focused_context) {
     if (g_str_has_prefix(str, "prop_list_get") == TRUE) {
       uim_prop_list_update(focused_context->uc);

Modified: branches/r5rs/gtk/uim-cand-win-gtk.c
===================================================================
--- branches/r5rs/gtk/uim-cand-win-gtk.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/gtk/uim-cand-win-gtk.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -139,6 +139,7 @@
 {
   GtkCellRenderer *renderer;
   GtkTreeViewColumn *column;
+  GtkWidget *frame;
   GtkWidget *vbox;
   GtkTreeSelection *selection;
 
@@ -173,9 +174,12 @@
   gtk_container_add(GTK_CONTAINER(cwin->scrolled_window), cwin->view);
   gtk_box_pack_start(GTK_BOX(vbox), cwin->num_label, FALSE, FALSE, 0);
 
-  gtk_container_add(GTK_CONTAINER(cwin), vbox);
-  gtk_container_set_border_width(GTK_CONTAINER(cwin), 1);
+  frame = gtk_frame_new(NULL);
 
+  gtk_container_add(GTK_CONTAINER(frame), vbox);
+  gtk_container_add(GTK_CONTAINER(cwin), frame);
+  gtk_container_set_border_width(GTK_CONTAINER(cwin), 0);
+
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(cwin->view));
 
   gtk_tree_selection_set_select_function(selection,
@@ -186,6 +190,8 @@
 		    G_CALLBACK(tree_selection_changed), cwin);
 
   renderer = gtk_cell_renderer_text_new();
+  g_object_set(renderer, "scale", 1.2, NULL);
+
   column = gtk_tree_view_column_new_with_attributes("No",
 						    renderer,
 						    "text", COLUMN_HEADING,
@@ -194,6 +200,8 @@
   gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
 
   renderer = gtk_cell_renderer_text_new();
+  g_object_set(renderer, "scale", 1.2, NULL);
+  /*  g_object_set(renderer, "size-points", 20.0, NULL); */
   column = gtk_tree_view_column_new_with_attributes("Text",
 						    renderer,
 						    "text", COLUMN_CANDIDATE,
@@ -214,6 +222,7 @@
   gtk_widget_show(cwin->view);
   gtk_widget_show(cwin->num_label);
   gtk_widget_show(vbox);
+  gtk_widget_show(frame);
 
   gtk_widget_set_size_request(cwin->num_label, DEFAULT_MIN_WINDOW_WIDTH, -1);
   gtk_window_set_default_size(GTK_WINDOW(cwin), DEFAULT_MIN_WINDOW_WIDTH, -1);

Modified: branches/r5rs/helper/pref-gtk.c
===================================================================
--- branches/r5rs/helper/pref-gtk.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/helper/pref-gtk.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -269,7 +269,7 @@
 
   if (uim_pref_gtk_value_changed) {
     uim_custom_save();
-    uim_custom_broadcast();
+    uim_custom_broadcast_reload_request();
     uim_pref_gtk_value_changed = FALSE;
   }
 
@@ -283,7 +283,7 @@
 
   if (uim_pref_gtk_value_changed) {
     uim_custom_save();
-    uim_custom_broadcast();
+    uim_custom_broadcast_reload_request();
     uim_pref_gtk_value_changed = FALSE;
   }
 }
@@ -443,7 +443,7 @@
 
   pref_window = window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   
-  icon = gdk_pixbuf_new_from_file(UIM_PIXMAPSDIR "/uim-icon.png", NULL);
+  icon = gdk_pixbuf_new_from_file(UIM_PIXMAPSDIR"/uim-icon.png", NULL);
   gtk_window_set_icon(GTK_WINDOW(pref_window), icon);
 
   g_signal_connect(G_OBJECT (window), "delete_event",

Modified: branches/r5rs/scm/custom-rt.scm
===================================================================
--- branches/r5rs/scm/custom-rt.scm	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/scm/custom-rt.scm	2005-08-10 19:34:32 UTC (rev 1180)
@@ -51,20 +51,53 @@
     (desc  "")))
 
 (define custom-required-custom-files ())
+(define custom-reload-group-syms ())
 (define custom-rt-primary-groups ())
 (define custom-set-hooks ())
 
-;; full implementation
-(define custom-load-group-conf
+(define custom-file-path
   (lambda (gsym)
     (let* ((group-name (symbol->string gsym))
 	   (path (string-append (getenv "HOME")
 				"/.uim.d/customs/custom-"
 				group-name
 				".scm")))
-      (try-load path))))
+      path)))
 
+(define prepend-new-reload-group-syms
+  (lambda (gsym path)
+    (set! custom-reload-group-syms
+	  (cons (cons gsym 0) custom-reload-group-syms))))
+
+(define update-gsym-mtime
+  (lambda (gsym path)
+    (set-cdr! (assq gsym custom-reload-group-syms)
+	      (file-mtime path))
+	      #t))
+
+(define custom-load-updated-group-conf
+  (lambda (gsym)
+    (let ((path (custom-file-path gsym)))
+      (if (not (memq gsym (map (lambda (x) (car x)) custom-reload-group-syms)))
+	  (prepend-new-reload-group-syms gsym path))
+      (if (= (file-mtime path)
+	     (cdr (assq gsym custom-reload-group-syms)))
+	  #t ; File isn't modified, no need to reload. 
+	  (if (try-load path)
+	      (update-gsym-mtime gsym path)
+	      #f)))))
+
 ;; full implementation
+;; This proc is existing for DUMB loading. No more processing such as
+;; mtime comparation or history recording must not be added. Please
+;; keep in mind responsibility separation, and don't alter an API
+;; specification previously stabilized without discussion.
+;;   -- YamaKen 2005-08-09
+(define custom-load-group-conf
+  (lambda (gsym)
+    (try-load (custom-file-path gsym))))
+
+;; full implementation
 (define require-custom
   (lambda (filename)
     (let ((pre-groups (custom-list-primary-groups)))
@@ -79,6 +112,12 @@
 		      (reverse new-groups)))))))
 
 ;; full implementation
+(define custom-reload-customs
+  (lambda ()
+    (for-each load (reverse custom-required-custom-files))
+    (custom-call-all-hook-procs custom-set-hooks)))
+
+;; full implementation
 (define custom-modify-key-predicate-names
   (lambda (keys)
     (map (lambda (key)
@@ -122,6 +161,14 @@
       (if proc
 	  ((cdr proc))))))
 
+;; TODO: write test
+;; full implementation
+(define custom-call-all-hook-procs
+  (lambda (hook)
+    (for-each (lambda (pair)
+		((cdr pair)))
+	      hook)))
+
 ;; lightweight implementation
 (define define-custom-group
   (lambda (gsym label desc)
@@ -195,3 +242,26 @@
 (define custom-prop-update-custom-handler
   (lambda (context custom-sym val)
     (custom-set-value! custom-sym val)))
+
+;; custom-reload-configs can switch its procedure definition from 2
+;; implementations. custom-reload-customs is selectable since the
+;; latter new code breaks the semantics of custom variable
+;; broadcasting.
+;;
+;; For example, an arbitrary uim-enabled process can update a custom
+;; variable by its own code without any helper message passing. In
+;; such case, the previously defined broadcasting behavior overwrites
+;; the variable locally modified even if the corresponding custom file
+;; is not updated.
+;;
+;; To make the latter code default, a discussion is required.
+;;   -- YamaKen 2005-08-09
+(define custom-reload-configs
+  (if #f
+      custom-reload-customs  ;; original behavior
+      (lambda ()
+	(let ((group-syms (map (lambda (x) (car x)) custom-reload-group-syms)))
+	  (if (null? group-syms)
+	      #f ;; No file should be loaded.
+	      (for-each custom-load-updated-group-conf
+			(reverse group-syms)))))))

Modified: branches/r5rs/scm/custom.scm
===================================================================
--- branches/r5rs/scm/custom.scm	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/scm/custom.scm	2005-08-10 19:34:32 UTC (rev 1180)
@@ -481,13 +481,6 @@
 	     (proc))
 	   procs))))
 
-;; TODO: write test
-(define custom-call-all-hook-procs
-  (lambda (hook)
-    (for-each (lambda (pair)
-		((cdr pair)))
-	      hook)))
-
 (define-record 'custom-rec
   '((sym     #f)
     (default #f)
@@ -744,11 +737,6 @@
 	 (let ((cb (lambda () (gate-func func ptr custom-sym))))
 	   (custom-add-hook custom-sym hook cb)))))
 
-(define custom-reload-customs
-  (lambda ()
-    (for-each load (reverse custom-required-custom-files))
-    (custom-call-all-hook-procs custom-set-hooks)))
-
 (define-custom-group 'main
 		     (_ "-")
 		     (_ "Main settings of this group"))

Modified: branches/r5rs/scm/latin.scm
===================================================================
--- branches/r5rs/scm/latin.scm	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/scm/latin.scm	2005-08-10 19:34:32 UTC (rev 1180)
@@ -30,540 +30,547 @@
 
 ;; Charset of this file is UTF-8
 
+(require "util.scm")
+(require "rk.scm")
 (require "generic.scm")
 
+(define-key latin-backspace-key? '("backspace" "<Control>h"))
+(define-key latin-commit-key? "return" 32)  ; 32 = space
+(define-key latin-multi-key? '("Multi_key"))
+
 (define latin-compose-rule '(
-((("\\" " " " " ))(" "))
-((("\\" " " "'" ))("'"))
-((("\\" " " "(" ))("˘"))
-((("\\" " " "-" ))("~"))
-((("\\" " " "<" ))("ˇ"))
-((("\\" " " ">" ))("^"))
-((("\\" " " "^" ))("^"))
-((("\\" " " "`" ))("`"))
-((("\\" " " "~" ))("~"))
-((("\\" "!" "!" ))("¡"))
-((("\\" "!" "P" ))("¶"))
-((("\\" "!" "S" ))("§"))
-((("\\" "!" "p" ))("¶"))
-((("\\" "!" "s" ))("§"))
-((("\\" "\"" "\"" ))("¨"))
-((("\\" "\"" "A" ))("Ä"))
-((("\\" "\"" "E" ))("Ë"))
-((("\\" "\"" "I" ))("Ï"))
-((("\\" "\"" "O" ))("Ö"))
-((("\\" "\"" "U" ))("Ü"))
-((("\\" "\"" "Y" ))("Ÿ"))
-((("\\" "\"" "a" ))("ä"))
-((("\\" "\"" "e" ))("ë"))
-((("\\" "\"" "i" ))("ï"))
-((("\\" "\"" "o" ))("ö"))
-((("\\" "\"" "u" ))("ü"))
-((("\\" "\"" "y" ))("ÿ"))
-((("\\" "'" " " ))("'"))
-((("\\" "'" "'" ))("´"))
-((("\\" "'" "A" ))("Á"))
-((("\\" "'" "C" ))("Ć"))
-((("\\" "'" "E" ))("É"))
-((("\\" "'" "I" ))("Í"))
-((("\\" "'" "L" ))("Ĺ"))
-((("\\" "'" "N" ))("Ń"))
-((("\\" "'" "O" ))("Ó"))
-((("\\" "'" "R" ))("Å”"))
-((("\\" "'" "S" ))("Åš"))
-((("\\" "'" "U" ))("Ú"))
-((("\\" "'" "Y" ))("Ý"))
-((("\\" "'" "Z" ))("Ź"))
-((("\\" "'" "a" ))("á"))
-((("\\" "'" "c" ))("ć"))
-((("\\" "'" "e" ))("é"))
-((("\\" "'" "i" ))("í"))
-((("\\" "'" "l" ))("ĺ"))
-((("\\" "'" "n" ))("Å„"))
-((("\\" "'" "o" ))("ó"))
-((("\\" "'" "r" ))("Å•"))
-((("\\" "'" "s" ))("Å›"))
-((("\\" "'" "u" ))("ú"))
-((("\\" "'" "y" ))("ý"))
-((("\\" "'" "z" ))("ź"))
-((("\\" "(" " " ))("˘"))
-((("\\" "(" "(" ))("["))
-((("\\" "(" "-" ))("{"))
-((("\\" "(" "A" ))("Ä‚"))
-((("\\" "(" "G" ))("Äž"))
-((("\\" "(" "c" ))("©"))
-((("\\" "(" "a" ))("ă"))
-((("\\" "(" "g" ))("ÄŸ"))
-((("\\" "(" "r" ))("®"))
-((("\\" ")" ")" ))("]"))
-((("\\" ")" "-" ))("}"))
-((("\\" "*" "0" ))("°"))
-((("\\" "*" "A" ))("Ã…"))
-((("\\" "*" "U" ))("Å®"))
-((("\\" "*" "a" ))("Ã¥"))
-((("\\" "*" "u" ))("ů"))
-((("\\" "+" "+" ))("#"))
-((("\\" "+" "-" ))("±"))
-((("\\" "," "," ))("¸"))
-((("\\" "," "-" ))("¬"))
-((("\\" "," "A" ))("Ä„"))
-((("\\" "," "C" ))("Ç"))
-((("\\" "," "E" ))("Ę"))
-((("\\" "," "G" ))("Ä¢"))
-((("\\" "," "I" ))("Ä®"))
-((("\\" "," "K" ))("Ķ"))
-((("\\" "," "L" ))("Ä»"))
-((("\\" "," "N" ))("Å…"))
-((("\\" "," "R" ))("Å–"))
-((("\\" "," "S" ))("Åž"))
-((("\\" "," "U" ))("Ų"))
-((("\\" "," "a" ))("Ä…"))
-((("\\" "," "c" ))("ç"))
-((("\\" "," "e" ))("Ä™"))
-((("\\" "," "g" ))("Ä£"))
-((("\\" "," "i" ))("į"))
-((("\\" "," "k" ))("Ä·"))
-((("\\" "," "l" ))("ļ"))
-((("\\" "," "n" ))("ņ"))
-((("\\" "," "r" ))("Å—"))
-((("\\" "," "s" ))("ÅŸ"))
-((("\\" "," "u" ))("ų"))
-((("\\" "-" " " ))("~"))
-((("\\" "-" "(" ))("{"))
-((("\\" "-" ")" ))("}"))
-((("\\" "-" "+" ))("±"))
-((("\\" "-" "," ))("¬"))
-((("\\" "-" "-" ))("­"))
-((("\\" "-" ":" ))("÷"))
-((("\\" "-" "A" ))("Ã"))
-((("\\" "-" "D" ))("Đ"))
-((("\\" "-" "E" ))("Ä’"))
-((("\\" "-" "I" ))("Ī"))
-((("\\" "-" "L" ))("£"))
-((("\\" "-" "N" ))("Ñ"))
-((("\\" "-" "O" ))("Õ"))
-((("\\" "-" "U" ))("Ū"))
-((("\\" "-" "Y" ))("Â¥"))
-((("\\" "-" "^" ))("¯"))
-((("\\" "-" "a" ))("ã"))
-((("\\" "-" "d" ))("Ä‘"))
-((("\\" "-" "e" ))("Ä“"))
-((("\\" "-" "i" ))("Ä«"))
-((("\\" "-" "l" ))("£"))
-((("\\" "-" "n" ))("ñ"))
-((("\\" "-" "o" ))("õ"))
-((("\\" "-" "u" ))("Å«"))
-((("\\" "-" "y" ))("Â¥"))
-((("\\" "." "." ))("Ë™"))
-((("\\" "." "B" ))("Ḃ"))
-((("\\" "." "C" ))("ÄŠ"))
-((("\\" "." "D" ))("Ḋ"))
-((("\\" "." "E" ))("Ä–"))
-((("\\" "." "F" ))("Ḟ"))
-((("\\" "." "G" ))("Ä "))
-((("\\" "." "I" ))("Ä°"))
-((("\\" "." "M" ))("á¹€"))
-((("\\" "." "P" ))("á¹–"))
-((("\\" "." "S" ))("á¹ "))
-((("\\" "." "T" ))("Ṫ"))
-((("\\" "." "Z" ))("Å»"))
-((("\\" "." "^" ))("·"))
-((("\\" "." "b" ))("ḃ"))
-((("\\" "." "c" ))("Ä‹"))
-((("\\" "." "d" ))("ḋ"))
-((("\\" "." "e" ))("Ä—"))
-((("\\" "." "f" ))("ḟ"))
-((("\\" "." "g" ))("Ä¡"))
-((("\\" "." "i" ))("ı"))
-((("\\" "." "m" ))("ṁ"))
-((("\\" "." "p" ))("á¹—"))
-((("\\" "." "s" ))("ṡ"))
-((("\\" "." "t" ))("ṫ"))
-((("\\" "." "z" ))("ż"))
-((("\\" "/" "/" ))("\\"))
-((("\\" "/" "<" ))("\\"))
-((("\\" "/" "C" ))("¢"))
-((("\\" "/" "O" ))("Ø"))
-((("\\" "/" "T" ))("Ŧ"))
-((("\\" "/" "U" ))("µ"))
-((("\\" "/" "^" ))("|"))
-((("\\" "/" "c" ))("¢"))
-((("\\" "/" "o" ))("ø"))
-((("\\" "/" "t" ))("ŧ"))
-((("\\" "/" "u" ))("µ"))
-((("\\" "0" "*" ))("°"))
-((("\\" "0" "C" ))("©"))
-((("\\" "0" "S" ))("§"))
-((("\\" "0" "X" ))("¤"))
-((("\\" "0" "^" ))("°"))
-((("\\" "0" "c" ))("©"))
-((("\\" "0" "s" ))("§"))
-((("\\" "0" "x" ))("¤"))
-((("\\" "1" "S" ))("¹"))
-((("\\" "1" "^" ))("¹"))
-((("\\" "1" "s" ))("¹"))
-((("\\" "2" "S" ))("²"))
-((("\\" "2" "^" ))("²"))
-((("\\" "2" "s" ))("²"))
-((("\\" "3" "S" ))("³"))
-((("\\" "3" "^" ))("³"))
-((("\\" "3" "s" ))("³"))
-((("\\" ":" "-" ))("÷"))
-((("\\" "<" " " ))("ˇ"))
-((("\\" "<" "/" ))("\\"))
-((("\\" "<" "<" ))("«"))
-((("\\" "<" "C" ))("Č"))
-((("\\" "<" "D" ))("ÄŽ"))
-((("\\" "<" "E" ))("Äš"))
-((("\\" "<" "L" ))("Ľ"))
-((("\\" "<" "N" ))("Ň"))
-((("\\" "<" "R" ))("Ř"))
-((("\\" "<" "S" ))("Å "))
-((("\\" "<" "T" ))("Ť"))
-((("\\" "<" "Z" ))("Ž"))
-((("\\" "<" "c" ))("č"))
-((("\\" "<" "d" ))("ď"))
-((("\\" "<" "e" ))("Ä›"))
-((("\\" "<" "l" ))("ľ"))
-((("\\" "<" "n" ))("ň"))
-((("\\" "<" "r" ))("Å™"))
-((("\\" "<" "s" ))("Å¡"))
-((("\\" "<" "t" ))("Å¥"))
-((("\\" "<" "z" ))("ž"))
-((("\\" "=" "C" ))("€"))
-((("\\" "=" "L" ))("£"))
-((("\\" "=" "Y" ))("Â¥"))
-((("\\" "=" "e" ))("€"))
-((("\\" "=" "l" ))("£"))
-((("\\" "=" "y" ))("Â¥"))
-((("\\" ">" " " ))("^"))
-((("\\" ">" ">" ))("»"))
-((("\\" ">" "A" ))("Â"))
-((("\\" ">" "E" ))("Ê"))
-((("\\" ">" "I" ))("ÃŽ"))
-((("\\" ">" "O" ))("Ô"))
-((("\\" ">" "U" ))("Û"))
-((("\\" ">" "a" ))("â"))
-((("\\" ">" "e" ))("ê"))
-((("\\" ">" "i" ))("î"))
-((("\\" ">" "o" ))("ô"))
-((("\\" ">" "u" ))("û"))
-((("\\" "?" "?" ))("¿"))
-((("\\" "A" "\"" ))("Ä"))
-((("\\" "A" "'" ))("Á"))
-((("\\" "A" "(" ))("Ä‚"))
-((("\\" "A" "*" ))("Ã…"))
-((("\\" "A" "," ))("Ä„"))
-((("\\" "A" "-" ))("Ã"))
-((("\\" "A" ">" ))("Â"))
-((("\\" "A" "A" ))("Ã…"))
-((("\\" "A" "E" ))("Æ"))
-((("\\" "A" "^" ))("Â"))
-((("\\" "A" "_" ))("ª"))
-((("\\" "A" "`" ))("À"))
-((("\\" "A" "~" ))("Ã"))
-((("\\" "B" "." ))("Ḃ"))
-((("\\" "C" "'" ))("Ć"))
-((("\\" "C" "," ))("Ç"))
-((("\\" "C" "." ))("ÄŠ"))
-((("\\" "C" "/" ))("¢"))
-((("\\" "C" "<" ))("Č"))
-((("\\" "C" "=" ))("€"))
-((("\\" "C" "0" ))("©"))
-((("\\" "C" "O" ))("©"))
-((("\\" "C" "o" ))("©"))
-((("\\" "C" "|" ))("¢"))
-((("\\" "D" "-" ))("Đ"))
-((("\\" "D" "." ))("Ḋ"))
-((("\\" "D" "<" ))("ÄŽ"))
-((("\\" "E" "\"" ))("Ë"))
-((("\\" "E" "'" ))("É"))
-((("\\" "E" "," ))("Ę"))
-((("\\" "E" "-" ))("Ä’"))
-((("\\" "E" "." ))("Ä–"))
-((("\\" "E" "<" ))("Äš"))
-((("\\" "E" ">" ))("Ê"))
-((("\\" "E" "^" ))("Ê"))
-((("\\" "E" "_" ))("Ä’"))
-((("\\" "E" "`" ))("È"))
-((("\\" "F" "." ))("Ḟ"))
-((("\\" "G" "(" ))("Äž"))
-((("\\" "G" "," ))("Ä¢"))
-((("\\" "G" "." ))("Ä "))
-((("\\" "G" "U" ))("Äž"))
-((("\\" "I" "\"" ))("Ï"))
-((("\\" "I" "'" ))("Í"))
-((("\\" "I" "," ))("Ä®"))
-((("\\" "I" "-" ))("Ī"))
-((("\\" "I" "." ))("Ä°"))
-((("\\" "I" ">" ))("ÃŽ"))
-((("\\" "I" "^" ))("ÃŽ"))
-((("\\" "I" "_" ))("Ī"))
-((("\\" "I" "`" ))("Ì"))
-((("\\" "I" "~" ))("Ĩ"))
-((("\\" "K" "," ))("Ķ"))
-((("\\" "L" "'" ))("Ĺ"))
-((("\\" "L" "," ))("Ä»"))
-((("\\" "L" "-" ))("£"))
-((("\\" "L" "<" ))("Ľ"))
-((("\\" "L" "=" ))("£"))
-((("\\" "L" "V" ))("|"))
-((("\\" "M" "." ))("á¹€"))
-((("\\" "N" "'" ))("Ń"))
-((("\\" "N" "," ))("Å…"))
-((("\\" "N" "-" ))("Ñ"))
-((("\\" "N" "<" ))("Ň"))
-((("\\" "N" "G" ))("ÅŠ"))
-((("\\" "N" "~" ))("Ñ"))
-((("\\" "O" "\"" ))("Ö"))
-((("\\" "O" "'" ))("Ó"))
-((("\\" "O" "-" ))("Õ"))
-((("\\" "O" "/" ))("Ø"))
-((("\\" "O" ">" ))("Ô"))
-((("\\" "O" "C" ))("©"))
-((("\\" "O" "E" ))("Å’"))
-((("\\" "O" "R" ))("®"))
-((("\\" "O" "S" ))("§"))
-((("\\" "O" "X" ))("¤"))
-((("\\" "O" "^" ))("Ô"))
-((("\\" "O" "_" ))("º"))
-((("\\" "O" "`" ))("Ã’"))
-((("\\" "O" "c" ))("©"))
-((("\\" "O" "x" ))("¤"))
-((("\\" "O" "~" ))("Õ"))
-((("\\" "P" "!" ))("¶"))
-((("\\" "P" "." ))("á¹–"))
-((("\\" "R" "'" ))("Å”"))
-((("\\" "R" "," ))("Å–"))
-((("\\" "R" "<" ))("Ř"))
-((("\\" "R" "O" ))("®"))
-((("\\" "S" "!" ))("§"))
-((("\\" "S" "'" ))("Åš"))
-((("\\" "S" "," ))("Åž"))
-((("\\" "S" "." ))("á¹ "))
-((("\\" "S" "0" ))("§"))
-((("\\" "S" "1" ))("¹"))
-((("\\" "S" "2" ))("²"))
-((("\\" "S" "3" ))("³"))
-((("\\" "S" "<" ))("Å "))
-((("\\" "S" "O" ))("§"))
-((("\\" "T" "-" ))("Ŧ"))
-((("\\" "T" "." ))("Ṫ"))
-((("\\" "T" "/" ))("Ŧ"))
-((("\\" "t" "<" ))("Å¥"))
-((("\\" "T" "H" ))("Þ"))
-((("\\" "U" "\"" ))("Ü"))
-((("\\" "U" "'" ))("Ú"))
-((("\\" "U" "*" ))("Å®"))
-((("\\" "U" "," ))("Ų"))
-((("\\" "U" "-" ))("Å«"))
-((("\\" "U" "/" ))("µ"))
-((("\\" "U" ">" ))("Û"))
-((("\\" "U" "^" ))("Û"))
-((("\\" "U" "_" ))("Å«"))
-((("\\" "U" "`" ))("Ù"))
-((("\\" "U" "~" ))("Ũ"))
-((("\\" "V" "L" ))("|"))
-((("\\" "W" "^" ))("Å´"))
-((("\\" "X" "0" ))("¤"))
-((("\\" "X" "O" ))("¤"))
-((("\\" "X" "o" ))("¤"))
-((("\\" "Y" "\"" ))("Ÿ"))
-((("\\" "Y" "'" ))("Ý"))
-((("\\" "Y" "-" ))("Â¥"))
-((("\\" "Y" "=" ))("Â¥"))
-((("\\" "Y" "^" ))("Ŷ"))
-((("\\" "Z" "'" ))("Ź"))
-((("\\" "Z" "." ))("Å»"))
-((("\\" "Z" "<" ))("Ž"))
-((("\\" "^" " " ))("^"))
-((("\\" "^" "-" ))("¯"))
-((("\\" "^" "." ))("·"))
-((("\\" "^" "/" ))("|"))
-((("\\" "^" "0" ))("°"))
-((("\\" "^" "1" ))("¹"))
-((("\\" "^" "2" ))("²"))
-((("\\" "^" "3" ))("³"))
-((("\\" "^" "A" ))("Â"))
-((("\\" "^" "E" ))("Ê"))
-((("\\" "^" "I" ))("ÃŽ"))
-((("\\" "^" "O" ))("Ô"))
-((("\\" "^" "U" ))("Û"))
-((("\\" "^" "W" ))("Å´"))
-((("\\" "^" "Y" ))("Ŷ"))
-((("\\" "^" "_" ))("¯"))
-((("\\" "^" "a" ))("â"))
-((("\\" "^" "e" ))("ê"))
-((("\\" "^" "i" ))("î"))
-((("\\" "^" "o" ))("ô"))
-((("\\" "^" "u" ))("û"))
-((("\\" "^" "w" ))("ŵ"))
-((("\\" "^" "y" ))("Å·"))
-((("\\" "_" "A" ))("ª"))
-((("\\" "_" "E" ))("Ä’"))
-((("\\" "_" "I" ))("Ī"))
-((("\\" "_" "O" ))("º"))
-((("\\" "_" "U" ))("Ū"))
-((("\\" "_" "^" ))("¯"))
-((("\\" "_" "_" ))("¯"))
-((("\\" "_" "a" ))("ª"))
-((("\\" "_" "e" ))("Ä“"))
-((("\\" "_" "i" ))("Ä«"))
-((("\\" "_" "o" ))("º"))
-((("\\" "_" "u" ))("Å«"))
-((("\\" "`" " " ))("`"))
-((("\\" "`" "A" ))("À"))
-((("\\" "`" "E" ))("È"))
-((("\\" "`" "I" ))("Ì"))
-((("\\" "`" "O" ))("Ã’"))
-((("\\" "`" "U" ))("Ù"))
-((("\\" "`" "a" ))("à"))
-((("\\" "`" "e" ))("è"))
-((("\\" "`" "i" ))("ì"))
-((("\\" "`" "o" ))("ò"))
-((("\\" "`" "u" ))("ù"))
-((("\\" "a" "\"" ))("ä"))
-((("\\" "a" "'" ))("á"))
-((("\\" "a" "(" ))("ă"))
-((("\\" "a" "*" ))("Ã¥"))
-((("\\" "a" "," ))("Ä…"))
-((("\\" "a" "-" ))("ã"))
-((("\\" "a" ">" ))("â"))
-((("\\" "a" "^" ))("â"))
-((("\\" "a" "_" ))("ª"))
-((("\\" "a" "`" ))("à"))
-((("\\" "a" "a" ))("Ã¥"))
-((("\\" "a" "e" ))("æ"))
-((("\\" "a" "~" ))("ã"))
-((("\\" "b" "." ))("ḃ"))
-((("\\" "c" "," ))("ç"))
-((("\\" "c" "." ))("Ä‹"))
-((("\\" "c" "/" ))("¢"))
-((("\\" "c" "0" ))("©"))
-((("\\" "c" "<" ))("č"))
-((("\\" "c" "O" ))("©"))
-((("\\" "c" "o" ))("©"))
-((("\\" "c" "|" ))("¢"))
-((("\\" "d" "-" ))("Ä‘"))
-((("\\" "d" "." ))("ḋ"))
-((("\\" "d" "<" ))("ď"))
-((("\\" "e" "\"" ))("ë"))
-((("\\" "e" "'" ))("é"))
-((("\\" "e" "," ))("Ä™"))
-((("\\" "e" "-" ))("Ä“"))
-((("\\" "e" "." ))("Ä—"))
-((("\\" "e" "=" ))("€"))
-((("\\" "e" "<" ))("Ä›"))
-((("\\" "e" ">" ))("ê"))
-((("\\" "e" "^" ))("ê"))
-((("\\" "e" "_" ))("Ä“"))
-((("\\" "e" "`" ))("è"))
-((("\\" "f" "." ))("ḟ"))
-((("\\" "g" "(" ))("ÄŸ"))
-((("\\" "g" "," ))("Ä£"))
-((("\\" "g" "." ))("Ä¡"))
-((("\\" "g" "U" ))("ÄŸ"))
-((("\\" "i" "\"" ))("ï"))
-((("\\" "i" "'" ))("í"))
-((("\\" "i" "," ))("į"))
-((("\\" "i" "-" ))("Ä«"))
-((("\\" "i" "." ))("ı"))
-((("\\" "i" ">" ))("î"))
-((("\\" "i" "^" ))("î"))
-((("\\" "i" "_" ))("Ä«"))
-((("\\" "i" "`" ))("ì"))
-((("\\" "i" "~" ))("Ä©"))
-((("\\" "k" "," ))("Ä·"))
-((("\\" "k" "k" ))("ĸ"))
-((("\\" "l" "'" ))("ĺ"))
-((("\\" "l" "," ))("ļ"))
-((("\\" "l" "-" ))("£"))
-((("\\" "l" "<" ))("ľ"))
-((("\\" "l" "=" ))("£"))
-((("\\" "l" "v" ))("|"))
-((("\\" "m" "." ))("ṁ"))
-((("\\" "n" "'" ))("Å„"))
-((("\\" "n" "," ))("ņ"))
-((("\\" "n" "-" ))("ñ"))
-((("\\" "n" "<" ))("ň"))
-((("\\" "n" "g" ))("Å‹"))
-((("\\" "n" "~" ))("ñ"))
-((("\\" "o" "\"" ))("ö"))
-((("\\" "o" "'" ))("ó"))
-((("\\" "o" "-" ))("õ"))
-((("\\" "o" "/" ))("ø"))
-((("\\" "o" ">" ))("ô"))
-((("\\" "o" "C" ))("©"))
-((("\\" "o" "X" ))("¤"))
-((("\\" "o" "^" ))("ô"))
-((("\\" "o" "_" ))("º"))
-((("\\" "o" "`" ))("ò"))
-((("\\" "o" "c" ))("©"))
-((("\\" "o" "e" ))("Å“"))
-((("\\" "o" "s" ))("§"))
-((("\\" "o" "x" ))("¤"))
-((("\\" "o" "~" ))("õ"))
-((("\\" "p" "!" ))("¶"))
-((("\\" "p" "." ))("á¹—"))
-((("\\" "r" "'" ))("Å•"))
-((("\\" "r" "," ))("Å—"))
-((("\\" "r" "<" ))("Å™"))
-((("\\" "s" "!" ))("§"))
-((("\\" "s" "'" ))("Å›"))
-((("\\" "s" "," ))("ÅŸ"))
-((("\\" "s" "." ))("ṡ"))
-((("\\" "s" "0" ))("§"))
-((("\\" "s" "1" ))("¹"))
-((("\\" "s" "2" ))("²"))
-((("\\" "s" "3" ))("³"))
-((("\\" "s" "<" ))("Å¡"))
-((("\\" "s" "o" ))("§"))
-((("\\" "s" "s" ))("ß"))
-((("\\" "t" "-" ))("ŧ"))
-((("\\" "t" "." ))("ṫ"))
-((("\\" "t" "/" ))("ŧ"))
-((("\\" "t" "<" ))("Å¥"))
-((("\\" "t" "h" ))("þ"))
-((("\\" "u" "\"" ))("ü"))
-((("\\" "u" "'" ))("ú"))
-((("\\" "u" "*" ))("ů"))
-((("\\" "u" "," ))("ų"))
-((("\\" "u" "-" ))("Å«"))
-((("\\" "u" "/" ))("µ"))
-((("\\" "u" ">" ))("û"))
-((("\\" "u" "^" ))("û"))
-((("\\" "u" "_" ))("Å«"))
-((("\\" "u" "`" ))("ù"))
-((("\\" "u" "~" ))("Å©"))
-((("\\" "v" "Z" ))("Ž"))
-((("\\" "v" "l" ))("|"))
-((("\\" "v" "z" ))("ž"))
-((("\\" "w" "^" ))("ŵ"))
-((("\\" "x" "0" ))("¤"))
-((("\\" "x" "O" ))("¤"))
-((("\\" "x" "o" ))("¤"))
-((("\\" "x" "x" ))("×"))
-((("\\" "y" "\"" ))("ÿ"))
-((("\\" "y" "'" ))("ý"))
-((("\\" "y" "-" ))("Â¥"))
-((("\\" "y" "=" ))("Â¥"))
-((("\\" "y" "^" ))("Å·"))
-((("\\" "z" "'" ))("ź"))
-((("\\" "z" "." ))("ż"))
-((("\\" "z" "<" ))("ž"))
-((("\\" "|" "C" ))("¢"))
-((("\\" "|" "c" ))("¢"))
-((("\\" "~" " " ))("~"))
-((("\\" "~" "A" ))("Ã"))
-((("\\" "~" "I" ))("Ĩ"))
-((("\\" "~" "N" ))("Ñ"))
-((("\\" "~" "O" ))("Õ"))
-((("\\" "~" "U" ))("Ũ"))
-((("\\" "~" "a" ))("ã"))
-((("\\" "~" "i" ))("Ä©"))
-((("\\" "~" "n" ))("ñ"))
-((("\\" "~" "o" ))("õ"))
-((("\\" "~" "u" ))("Å©"))
+((("\\" "\\"))("\\"))
+(((" " " "))(" "))
+(((" " "'"))("'"))
+(((" " "("))("˘"))
+(((" " "-"))("~"))
+(((" " "<"))("ˇ"))
+(((" " ">"))("^"))
+(((" " "^"))("^"))
+(((" " "`"))("`"))
+(((" " "~"))("~"))
+((("!" "!"))("¡"))
+((("!" "P"))("¶"))
+((("!" "S"))("§"))
+((("!" "p"))("¶"))
+((("!" "s"))("§"))
+((("\"" "\""))("¨"))
+((("\"" "A"))("Ä"))
+((("\"" "E"))("Ë"))
+((("\"" "I"))("Ï"))
+((("\"" "O"))("Ö"))
+((("\"" "U"))("Ü"))
+((("\"" "Y"))("Ÿ"))
+((("\"" "a"))("ä"))
+((("\"" "e"))("ë"))
+((("\"" "i"))("ï"))
+((("\"" "o"))("ö"))
+((("\"" "u"))("ü"))
+((("\"" "y"))("ÿ"))
+((("'" " " ))("'"))
+((("'" "'" ))("´"))
+((("'" "A" ))("Á"))
+((("'" "C" ))("Ć"))
+((("'" "E" ))("É"))
+((("'" "I" ))("Í"))
+((("'" "L" ))("Ĺ"))
+((("'" "N" ))("Ń"))
+((("'" "O" ))("Ó"))
+((("'" "R" ))("Å”"))
+((("'" "S" ))("Åš"))
+((("'" "U" ))("Ú"))
+((("'" "Y" ))("Ý"))
+((("'" "Z" ))("Ź"))
+((("'" "a" ))("á"))
+((("'" "c" ))("ć"))
+((("'" "e" ))("é"))
+((("'" "i" ))("í"))
+((("'" "l" ))("ĺ"))
+((("'" "n" ))("Å„"))
+((("'" "o" ))("ó"))
+((("'" "r" ))("Å•"))
+((("'" "s" ))("Å›"))
+((("'" "u" ))("ú"))
+((("'" "y" ))("ý"))
+((("'" "z" ))("ź"))
+((("(" " " ))("˘"))
+((("(" "(" ))("["))
+((("(" "-" ))("{"))
+((("(" "A" ))("Ä‚"))
+((("(" "G" ))("Äž"))
+((("(" "c" ))("©"))
+((("(" "a" ))("ă"))
+((("(" "g" ))("ÄŸ"))
+((("(" "r" ))("®"))
+(((")" ")" ))("]"))
+(((")" "-" ))("}"))
+((("*" "0" ))("°"))
+((("*" "A" ))("Ã…"))
+((("*" "U" ))("Å®"))
+((("*" "a" ))("Ã¥"))
+((("*" "u" ))("ů"))
+((("+" "+" ))("#"))
+((("+" "-" ))("±"))
+((("," "," ))("¸"))
+((("," "-" ))("¬"))
+((("," "A" ))("Ä„"))
+((("," "C" ))("Ç"))
+((("," "E" ))("Ę"))
+((("," "G" ))("Ä¢"))
+((("," "I" ))("Ä®"))
+((("," "K" ))("Ķ"))
+((("," "L" ))("Ä»"))
+((("," "N" ))("Å…"))
+((("," "R" ))("Å–"))
+((("," "S" ))("Åž"))
+((("," "U" ))("Ų"))
+((("," "a" ))("Ä…"))
+((("," "c" ))("ç"))
+((("," "e" ))("Ä™"))
+((("," "g" ))("Ä£"))
+((("," "i" ))("į"))
+((("," "k" ))("Ä·"))
+((("," "l" ))("ļ"))
+((("," "n" ))("ņ"))
+((("," "r" ))("Å—"))
+((("," "s" ))("ÅŸ"))
+((("," "u" ))("ų"))
+((("-" " " ))("~"))
+((("-" "(" ))("{"))
+((("-" ")" ))("}"))
+((("-" "+" ))("±"))
+((("-" "," ))("¬"))
+((("-" "-" ))("­"))
+((("-" ":" ))("÷"))
+((("-" "A" ))("Ã"))
+((("-" "D" ))("Đ"))
+((("-" "E" ))("Ä’"))
+((("-" "I" ))("Ī"))
+((("-" "L" ))("£"))
+((("-" "N" ))("Ñ"))
+((("-" "O" ))("Õ"))
+((("-" "U" ))("Ū"))
+((("-" "Y" ))("Â¥"))
+((("-" "^" ))("¯"))
+((("-" "a" ))("ã"))
+((("-" "d" ))("Ä‘"))
+((("-" "e" ))("Ä“"))
+((("-" "i" ))("Ä«"))
+((("-" "l" ))("£"))
+((("-" "n" ))("ñ"))
+((("-" "o" ))("õ"))
+((("-" "u" ))("Å«"))
+((("-" "y" ))("Â¥"))
+((("." "." ))("Ë™"))
+((("." "B" ))("Ḃ"))
+((("." "C" ))("ÄŠ"))
+((("." "D" ))("Ḋ"))
+((("." "E" ))("Ä–"))
+((("." "F" ))("Ḟ"))
+((("." "G" ))("Ä "))
+((("." "I" ))("Ä°"))
+((("." "M" ))("á¹€"))
+((("." "P" ))("á¹–"))
+((("." "S" ))("á¹ "))
+((("." "T" ))("Ṫ"))
+((("." "Z" ))("Å»"))
+((("." "^" ))("·"))
+((("." "b" ))("ḃ"))
+((("." "c" ))("Ä‹"))
+((("." "d" ))("ḋ"))
+((("." "e" ))("Ä—"))
+((("." "f" ))("ḟ"))
+((("." "g" ))("Ä¡"))
+((("." "i" ))("ı"))
+((("." "m" ))("ṁ"))
+((("." "p" ))("á¹—"))
+((("." "s" ))("ṡ"))
+((("." "t" ))("ṫ"))
+((("." "z" ))("ż"))
+((("/" "/" ))("\\"))
+((("/" "<" ))("\\"))
+((("/" "C" ))("¢"))
+((("/" "O" ))("Ø"))
+((("/" "T" ))("Ŧ"))
+((("/" "U" ))("µ"))
+((("/" "^" ))("|"))
+((("/" "c" ))("¢"))
+((("/" "o" ))("ø"))
+((("/" "t" ))("ŧ"))
+((("/" "u" ))("µ"))
+((("0" "*" ))("°"))
+((("0" "C" ))("©"))
+((("0" "S" ))("§"))
+((("0" "X" ))("¤"))
+((("0" "^" ))("°"))
+((("0" "c" ))("©"))
+((("0" "s" ))("§"))
+((("0" "x" ))("¤"))
+((("1" "S" ))("¹"))
+((("1" "^" ))("¹"))
+((("1" "s" ))("¹"))
+((("2" "S" ))("²"))
+((("2" "^" ))("²"))
+((("2" "s" ))("²"))
+((("3" "S" ))("³"))
+((("3" "^" ))("³"))
+((("3" "s" ))("³"))
+(((":" "-" ))("÷"))
+((("<" " " ))("ˇ"))
+((("<" "/" ))("\\"))
+((("<" "<" ))("«"))
+((("<" "C" ))("Č"))
+((("<" "D" ))("ÄŽ"))
+((("<" "E" ))("Äš"))
+((("<" "L" ))("Ľ"))
+((("<" "N" ))("Ň"))
+((("<" "R" ))("Ř"))
+((("<" "S" ))("Å "))
+((("<" "T" ))("Ť"))
+((("<" "Z" ))("Ž"))
+((("<" "c" ))("č"))
+((("<" "d" ))("ď"))
+((("<" "e" ))("Ä›"))
+((("<" "l" ))("ľ"))
+((("<" "n" ))("ň"))
+((("<" "r" ))("Å™"))
+((("<" "s" ))("Å¡"))
+((("<" "t" ))("Å¥"))
+((("<" "z" ))("ž"))
+((("=" "C" ))("€"))
+((("=" "L" ))("£"))
+((("=" "Y" ))("Â¥"))
+((("=" "e" ))("€"))
+((("=" "l" ))("£"))
+((("=" "y" ))("Â¥"))
+(((">" " " ))("^"))
+(((">" ">" ))("»"))
+(((">" "A" ))("Â"))
+(((">" "E" ))("Ê"))
+(((">" "I" ))("ÃŽ"))
+(((">" "O" ))("Ô"))
+(((">" "U" ))("Û"))
+(((">" "a" ))("â"))
+(((">" "e" ))("ê"))
+(((">" "i" ))("î"))
+(((">" "o" ))("ô"))
+(((">" "u" ))("û"))
+((("?" "?" ))("¿"))
+((("A" "\"" ))("Ä"))
+((("A" "'" ))("Á"))
+((("A" "(" ))("Ä‚"))
+((("A" "*" ))("Ã…"))
+((("A" "," ))("Ä„"))
+((("A" "-" ))("Ã"))
+((("A" ">" ))("Â"))
+((("A" "A" ))("Ã…"))
+((("A" "E" ))("Æ"))
+((("A" "^" ))("Â"))
+((("A" "_" ))("ª"))
+((("A" "`" ))("À"))
+((("A" "~" ))("Ã"))
+((("B" "." ))("Ḃ"))
+((("C" "'" ))("Ć"))
+((("C" "," ))("Ç"))
+((("C" "." ))("ÄŠ"))
+((("C" "/" ))("¢"))
+((("C" "<" ))("Č"))
+((("C" "=" ))("€"))
+((("C" "0" ))("©"))
+((("C" "O" ))("©"))
+((("C" "o" ))("©"))
+((("C" "|" ))("¢"))
+((("D" "-" ))("Đ"))
+((("D" "." ))("Ḋ"))
+((("D" "<" ))("ÄŽ"))
+((("E" "\"" ))("Ë"))
+((("E" "'" ))("É"))
+((("E" "," ))("Ę"))
+((("E" "-" ))("Ä’"))
+((("E" "." ))("Ä–"))
+((("E" "<" ))("Äš"))
+((("E" ">" ))("Ê"))
+((("E" "^" ))("Ê"))
+((("E" "_" ))("Ä’"))
+((("E" "`" ))("È"))
+((("F" "." ))("Ḟ"))
+((("G" "(" ))("Äž"))
+((("G" "," ))("Ä¢"))
+((("G" "." ))("Ä "))
+((("G" "U" ))("Äž"))
+((("I" "\"" ))("Ï"))
+((("I" "'" ))("Í"))
+((("I" "," ))("Ä®"))
+((("I" "-" ))("Ī"))
+((("I" "." ))("Ä°"))
+((("I" ">" ))("ÃŽ"))
+((("I" "^" ))("ÃŽ"))
+((("I" "_" ))("Ī"))
+((("I" "`" ))("Ì"))
+((("I" "~" ))("Ĩ"))
+((("K" "," ))("Ķ"))
+((("L" "'" ))("Ĺ"))
+((("L" "," ))("Ä»"))
+((("L" "-" ))("£"))
+((("L" "<" ))("Ľ"))
+((("L" "=" ))("£"))
+((("L" "V" ))("|"))
+((("M" "." ))("á¹€"))
+((("N" "'" ))("Ń"))
+((("N" "," ))("Å…"))
+((("N" "-" ))("Ñ"))
+((("N" "<" ))("Ň"))
+((("N" "G" ))("ÅŠ"))
+((("N" "~" ))("Ñ"))
+((("O" "\"" ))("Ö"))
+((("O" "'" ))("Ó"))
+((("O" "-" ))("Õ"))
+((("O" "/" ))("Ø"))
+((("O" ">" ))("Ô"))
+((("O" "C" ))("©"))
+((("O" "E" ))("Å’"))
+((("O" "R" ))("®"))
+((("O" "S" ))("§"))
+((("O" "X" ))("¤"))
+((("O" "^" ))("Ô"))
+((("O" "_" ))("º"))
+((("O" "`" ))("Ã’"))
+((("O" "c" ))("©"))
+((("O" "x" ))("¤"))
+((("O" "~" ))("Õ"))
+((("P" "!" ))("¶"))
+((("P" "." ))("á¹–"))
+((("R" "'" ))("Å”"))
+((("R" "," ))("Å–"))
+((("R" "<" ))("Ř"))
+((("R" "O" ))("®"))
+((("S" "!" ))("§"))
+((("S" "'" ))("Åš"))
+((("S" "," ))("Åž"))
+((("S" "." ))("á¹ "))
+((("S" "0" ))("§"))
+((("S" "1" ))("¹"))
+((("S" "2" ))("²"))
+((("S" "3" ))("³"))
+((("S" "<" ))("Å "))
+((("S" "O" ))("§"))
+((("T" "-" ))("Ŧ"))
+((("T" "." ))("Ṫ"))
+((("T" "/" ))("Ŧ"))
+((("t" "<" ))("Å¥"))
+((("T" "H" ))("Þ"))
+((("U" "\"" ))("Ü"))
+((("U" "'" ))("Ú"))
+((("U" "*" ))("Å®"))
+((("U" "," ))("Ų"))
+((("U" "-" ))("Å«"))
+((("U" "/" ))("µ"))
+((("U" ">" ))("Û"))
+((("U" "^" ))("Û"))
+((("U" "_" ))("Å«"))
+((("U" "`" ))("Ù"))
+((("U" "~" ))("Ũ"))
+((("V" "L" ))("|"))
+((("W" "^" ))("Å´"))
+((("X" "0" ))("¤"))
+((("X" "O" ))("¤"))
+((("X" "o" ))("¤"))
+((("Y" "\"" ))("Ÿ"))
+((("Y" "'" ))("Ý"))
+((("Y" "-" ))("Â¥"))
+((("Y" "=" ))("Â¥"))
+((("Y" "^" ))("Ŷ"))
+((("Z" "'" ))("Ź"))
+((("Z" "." ))("Å»"))
+((("Z" "<" ))("Ž"))
+((("^" " " ))("^"))
+((("^" "-" ))("¯"))
+((("^" "." ))("·"))
+((("^" "/" ))("|"))
+((("^" "0" ))("°"))
+((("^" "1" ))("¹"))
+((("^" "2" ))("²"))
+((("^" "3" ))("³"))
+((("^" "A" ))("Â"))
+((("^" "E" ))("Ê"))
+((("^" "I" ))("ÃŽ"))
+((("^" "O" ))("Ô"))
+((("^" "U" ))("Û"))
+((("^" "W" ))("Å´"))
+((("^" "Y" ))("Ŷ"))
+((("^" "_" ))("¯"))
+((("^" "a" ))("â"))
+((("^" "e" ))("ê"))
+((("^" "i" ))("î"))
+((("^" "o" ))("ô"))
+((("^" "u" ))("û"))
+((("^" "w" ))("ŵ"))
+((("^" "y" ))("Å·"))
+((("_" "A" ))("ª"))
+((("_" "E" ))("Ä’"))
+((("_" "I" ))("Ī"))
+((("_" "O" ))("º"))
+((("_" "U" ))("Ū"))
+((("_" "^" ))("¯"))
+((("_" "_" ))("¯"))
+((("_" "a" ))("ª"))
+((("_" "e" ))("Ä“"))
+((("_" "i" ))("Ä«"))
+((("_" "o" ))("º"))
+((("_" "u" ))("Å«"))
+((("`" " " ))("`"))
+((("`" "A" ))("À"))
+((("`" "E" ))("È"))
+((("`" "I" ))("Ì"))
+((("`" "O" ))("Ã’"))
+((("`" "U" ))("Ù"))
+((("`" "a" ))("à"))
+((("`" "e" ))("è"))
+((("`" "i" ))("ì"))
+((("`" "o" ))("ò"))
+((("`" "u" ))("ù"))
+((("a" "\""))("ä"))
+((("a" "'" ))("á"))
+((("a" "(" ))("ă"))
+((("a" "*" ))("Ã¥"))
+((("a" "," ))("Ä…"))
+((("a" "-" ))("ã"))
+((("a" ">" ))("â"))
+((("a" "^" ))("â"))
+((("a" "_" ))("ª"))
+((("a" "`" ))("à"))
+((("a" "a" ))("Ã¥"))
+((("a" "e" ))("æ"))
+((("a" "~" ))("ã"))
+((("b" "." ))("ḃ"))
+((("c" "," ))("ç"))
+((("c" "." ))("Ä‹"))
+((("c" "/" ))("¢"))
+((("c" "0" ))("©"))
+((("c" "<" ))("č"))
+((("c" "O" ))("©"))
+((("c" "o" ))("©"))
+((("c" "|" ))("¢"))
+((("d" "-" ))("Ä‘"))
+((("d" "." ))("ḋ"))
+((("d" "<" ))("ď"))
+((("e" "\"" ))("ë"))
+((("e" "'" ))("é"))
+((("e" "," ))("Ä™"))
+((("e" "-" ))("Ä“"))
+((("e" "." ))("Ä—"))
+((("e" "=" ))("€"))
+((("e" "<" ))("Ä›"))
+((("e" ">" ))("ê"))
+((("e" "^" ))("ê"))
+((("e" "_" ))("Ä“"))
+((("e" "`" ))("è"))
+((("f" "." ))("ḟ"))
+((("g" "(" ))("ÄŸ"))
+((("g" "," ))("Ä£"))
+((("g" "." ))("Ä¡"))
+((("g" "U" ))("ÄŸ"))
+((("i" "\""))("ï"))
+((("i" "'" ))("í"))
+((("i" "," ))("į"))
+((("i" "-" ))("Ä«"))
+((("i" "." ))("ı"))
+((("i" ">" ))("î"))
+((("i" "^" ))("î"))
+((("i" "_" ))("Ä«"))
+((("i" "`" ))("ì"))
+((("i" "~" ))("Ä©"))
+((("k" "," ))("Ä·"))
+((("k" "k" ))("ĸ"))
+((("l" "'" ))("ĺ"))
+((("l" "," ))("ļ"))
+((("l" "-" ))("£"))
+((("l" "<" ))("ľ"))
+((("l" "=" ))("£"))
+((("l" "v" ))("|"))
+((("m" "." ))("ṁ"))
+((("n" "'" ))("Å„"))
+((("n" "," ))("ņ"))
+((("n" "-" ))("ñ"))
+((("n" "<" ))("ň"))
+((("n" "g" ))("Å‹"))
+((("n" "~" ))("ñ"))
+((("o" "\""))("ö"))
+((("o" "'" ))("ó"))
+((("o" "-" ))("õ"))
+((("o" "/" ))("ø"))
+((("o" ">" ))("ô"))
+((("o" "C" ))("©"))
+((("o" "X" ))("¤"))
+((("o" "^" ))("ô"))
+((("o" "_" ))("º"))
+((("o" "`" ))("ò"))
+((("o" "c" ))("©"))
+((("o" "e" ))("Å“"))
+((("o" "s" ))("§"))
+((("o" "x" ))("¤"))
+((("o" "~" ))("õ"))
+((("p" "!" ))("¶"))
+((("p" "." ))("á¹—"))
+((("r" "'" ))("Å•"))
+((("r" "," ))("Å—"))
+((("r" "<" ))("Å™"))
+((("s" "!" ))("§"))
+((("s" "'" ))("Å›"))
+((("s" "," ))("ÅŸ"))
+((("s" "." ))("ṡ"))
+((("s" "0" ))("§"))
+((("s" "1" ))("¹"))
+((("s" "2" ))("²"))
+((("s" "3" ))("³"))
+((("s" "<" ))("Å¡"))
+((("s" "o" ))("§"))
+((("s" "s" ))("ß"))
+((("t" "-" ))("ŧ"))
+((("t" "." ))("ṫ"))
+((("t" "/" ))("ŧ"))
+((("t" "<" ))("Å¥"))
+((("t" "h" ))("þ"))
+((("u" "\""))("ü"))
+((("u" "'" ))("ú"))
+((("u" "*" ))("ů"))
+((("u" "," ))("ų"))
+((("u" "-" ))("Å«"))
+((("u" "/" ))("µ"))
+((("u" ">" ))("û"))
+((("u" "^" ))("û"))
+((("u" "_" ))("Å«"))
+((("u" "`" ))("ù"))
+((("u" "~" ))("Å©"))
+((("v" "Z" ))("Ž"))
+((("v" "l" ))("|"))
+((("v" "z" ))("ž"))
+((("w" "^" ))("ŵ"))
+((("x" "0" ))("¤"))
+((("x" "O" ))("¤"))
+((("x" "o" ))("¤"))
+((("x" "x" ))("×"))
+((("y" "\""))("ÿ"))
+((("y" "'" ))("ý"))
+((("y" "-" ))("Â¥"))
+((("y" "=" ))("Â¥"))
+((("y" "^" ))("Å·"))
+((("z" "'" ))("ź"))
+((("z" "." ))("ż"))
+((("z" "<" ))("ž"))
+((("|" "C" ))("¢"))
+((("|" "c" ))("¢"))
+((("~" " " ))("~"))
+((("~" "A" ))("Ã"))
+((("~" "I" ))("Ĩ"))
+((("~" "N" ))("Ñ"))
+((("~" "O" ))("Õ"))
+((("~" "U" ))("Ũ"))
+((("~" "a" ))("ã"))
+((("~" "i" ))("Ä©"))
+((("~" "n" ))("ñ"))
+((("~" "o" ))("õ"))
+((("~" "u" ))("Å©"))
 ))
 
 (define latin-im-rule
@@ -571,14 +578,155 @@
 
 (define latin-init-handler
   (lambda (id im arg)
-    (generic-context-new id im latin-im-rule #f)))
+    (latin-context-new id im)))
 
-(generic-register-im
+;;; implementations
+
+(define ascii-rule
+  (map (compose (lambda (entry)
+		  (list (list entry) entry))
+		list
+		charcode->string)
+       (iota 127 32)))
+
+(define latin-context-rec-spec
+  (append
+   context-rec-spec
+   '((rk-context         #f)
+     (rk-nth             0)
+     (composing?         #f)
+     (on                 #f)
+     (raw-commit         #f)
+     (converting         #f))))
+(define-record 'latin-context latin-context-rec-spec)
+(define latin-context-new-internal latin-context-new)
+
+(define latin-context-new
+  (lambda (id im)
+    (let ((gc (latin-context-new-internal id im))
+	  (rkc (rk-context-new latin-im-rule #f #f)))
+      (latin-context-set-rk-context! gc rkc)
+      gc)))
+
+(define latin-context-flush
+  (lambda (pc)
+    (latin-context-set-rk-nth! pc 0)
+    (latin-context-set-converting! pc #f)))
+
+(define latin-update-preedit
+  (lambda (pc)
+    (let* ((rkc (latin-context-rk-context pc))
+	   (cs (rk-current-seq rkc))
+	   (n (latin-context-rk-nth pc)))
+      (im-clear-preedit pc)
+      (im-pushback-preedit
+       pc preedit-underline
+       (if cs
+	   (nth n (cadr cs))
+	   (rk-pending rkc)))
+      (im-pushback-preedit
+       pc preedit-cursor "")
+
+      (im-update-preedit pc))))
+
+(define latin-commit-raw
+  (lambda (pc)
+    (im-commit-raw pc)
+    (latin-context-set-raw-commit! pc #t)))
+
+(define latin-commit
+  (lambda (pc)
+    (let* ((rkc (latin-context-rk-context pc))
+	   (cs (rk-current-seq rkc)))
+      (if (= (length (cadr cs)) 1)
+	  (begin
+	    (im-commit pc (car (cadr cs)))
+	    (latin-context-set-composing?! pc #f)
+	    (rk-flush rkc))))))
+
+(define latin-proc-composing-state
+  (lambda (pc key state)
+    (let* ((rkc (latin-context-rk-context pc))
+	   (n (latin-context-rk-nth pc))
+	   (cs (cadr (rk-current-seq rkc)))
+	   (res))
+      (cond
+
+       ((latin-backspace-key? key state)
+	(if (not (rk-backspace rkc))
+	    (latin-commit-raw pc)))
+       
+       ((latin-commit-key? key state)
+	(latin-commit pc))
+       
+       ((or (symbol? key)
+	    (= 32 key)) ; space
+	(latin-commit-raw pc)
+	(latin-context-flush pc))
+
+       (else
+	(let ((res (rk-push-key! rkc (charcode->string key))))
+	  (if (not (rk-partial? rkc))
+	      (let ((cs (rk-current-seq rkc)))
+		(if (= (length (cadr cs)) 1)
+		    (latin-commit pc))))
+	  (if res
+	      (begin
+		(print res)
+		(im-commit pc (list-ref res 0))
+		(latin-context-set-composing?! pc #f)
+		(rk-flush rkc)))
+	  ))))))
+
+(define latin-proc-raw-state
+  (lambda (pc key state)
+    (if (latin-multi-key? key state)
+	(latin-context-set-composing?! pc #t)
+	(latin-commit-raw pc))))
+
+(define latin-press-key-handler
+  (lambda (pc key state)
+    (if (control-char? key)
+	(im-commit-raw pc)
+	(if (latin-context-composing? pc)
+	    (latin-proc-composing-state pc key state)
+	    (latin-proc-raw-state pc key state)))
+    (latin-update-preedit pc)))
+
+(define latin-release-key-handler
+  (lambda (pc key state)
+    (if (or (control-char? key)
+	    (not (latin-context-on pc)))
+	;; don't discard key release event for apps
+	(latin-commit-raw pc))))
+
+(define latin-reset-handler
+  (lambda (pc)
+    (let ((rkc (latin-context-rk-context pc)))
+      (rk-flush rkc))))
+
+(define latin-get-candidate-handler
+  (lambda (pc idx accel-enum-hint)
+    ()))
+
+(define latin-set-candidate-index-handler
+  (lambda (pc idx)
+    ()))
+
+(register-im
  'latin
  ""
  "UTF-8"
- ;; I think that the name "euro" is not appropriate since it
- ;; represents nation or geographic region.  -- YamaKen 2005-01-29
  (N_ "Latin characters")
  (N_ "Latin characters mainly used for Latin and German languages")
- latin-init-handler)
+ #f
+ latin-init-handler
+ #f
+ context-mode-handler
+ latin-press-key-handler
+ latin-release-key-handler
+ latin-reset-handler
+ #f
+ #f
+ context-prop-activate-handler
+)

Modified: branches/r5rs/test/test-custom-rt.scm
===================================================================
--- branches/r5rs/test/test-custom-rt.scm	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/test/test-custom-rt.scm	2005-08-10 19:34:32 UTC (rev 1180)
@@ -29,6 +29,10 @@
 ;;; SUCH DAMAGE.
 ;;;;
 
+;; TODO:
+;;
+;; custom-reload-customs
+
 (use test.unit)
 
 (require "test/uim-test-utils")

Modified: branches/r5rs/test/test-custom.scm
===================================================================
--- branches/r5rs/test/test-custom.scm	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/test/test-custom.scm	2005-08-10 19:34:32 UTC (rev 1180)
@@ -33,9 +33,7 @@
 
 ;; TODO:
 ;;
-;; custom-reload-customs
 ;; custom-broadcast-customs
-;; custom-broadcast-customs
 
 (use test.unit)
 

Modified: branches/r5rs/uim/uim-custom.c
===================================================================
--- branches/r5rs/uim/uim-custom.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/uim/uim-custom.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -55,6 +55,10 @@
 #include "context.h"
 #include "uim-helper.h"
 
+#if 1
+/* TODO: make stable */
+#define UIM_CUSTOM_EXPERIMENTAL_MTIME_SENSING
+#endif
 
 typedef void (*uim_custom_cb_update_cb_t)(void *ptr, const char *custom_sym);
 typedef void (*uim_custom_global_cb_update_cb_t)(void *ptr);
@@ -829,7 +833,35 @@
   return for_each_primary_groups(uim_custom_load_group);
 }
 
+#ifdef UIM_CUSTOM_EXPERIMENTAL_MTIME_SENSING
 static uim_bool
+file_content_is_same(const char *a_path, const char *b_path)
+{
+  FILE *a, *b;
+  char a_buf[4096], b_buf[4096];
+
+  a = fopen(a_path, "r");
+  b = fopen(b_path, "r");
+
+  while(1) {
+    char *a_eof, *b_eof;
+    a_eof = fgets(a_buf, sizeof(a_buf), a);
+    b_eof = fgets(b_buf, sizeof(b_buf), b);
+
+    if(!a_eof && !b_eof)
+      break;
+    if((!a_eof && b_eof) || (a_eof && !b_eof))
+      return UIM_FALSE;
+
+    if(strcmp(a_buf, b_buf) != 0)
+      return UIM_FALSE;
+  }
+
+  return UIM_TRUE;
+}
+#endif
+
+static uim_bool
 uim_custom_save_group(const char *group)
 {
   uim_bool succeeded = UIM_FALSE;
@@ -868,10 +900,26 @@
 
   if (fclose(file) < 0)
     goto error;
+
   /* rename prepared temporary file to proper name */
   file_path = custom_file_path(group, 0);
+#ifdef UIM_CUSTOM_EXPERIMENTAL_MTIME_SENSING
+  /*
+   * Avoiding a file saving at here by such method is a layer
+   * violation. Observing updated group is recommended way.
+   *   -- YamaKen 2005-08-09
+   */
+  if(file_content_is_same(tmp_file_path, file_path)) {
+    succeeded = UIM_TRUE;
+    remove(tmp_file_path);
+  } else {
+    succeeded = (rename(tmp_file_path, file_path) == 0);
+  }
+#else
   succeeded = (rename(tmp_file_path, file_path) == 0);
+#endif
   free(file_path);
+
  error:
   free(tmp_file_path);
 
@@ -943,6 +991,29 @@
 }
 
 /**
+ * Broadcasts a request to reload custom files to other uim-enabled
+ * application processes via uim-helper-server.
+ *
+ * @retval UIM_TRUE succeeded
+ * @retval UIM_FALSE failed
+ */
+uim_bool
+uim_custom_broadcast_reload_request(void)
+{
+  if (helper_fd < 0) {
+    helper_fd = uim_helper_init_client_fd(helper_disconnect_cb);
+  }
+
+  uim_helper_send_message(helper_fd, "custom_reload_notify\n");
+
+  if (helper_fd != -1) {
+    uim_helper_close_client_fd(helper_fd);
+  }
+
+  return UIM_TRUE;
+}
+
+/**
  * Returns attributes and current value of a custom variable. Returned value
  * must be freed by uim_custom_free().
  *

Modified: branches/r5rs/uim/uim-custom.h
===================================================================
--- branches/r5rs/uim/uim-custom.h	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/uim/uim-custom.h	2005-08-10 19:34:32 UTC (rev 1180)
@@ -127,6 +127,7 @@
 uim_bool uim_custom_load(void);
 uim_bool uim_custom_save(void);
 uim_bool uim_custom_broadcast(void);
+uim_bool uim_custom_broadcast_reload_request(void);
 
 /* custom variable */
 struct uim_custom *uim_custom_get(const char *custom_sym);

Modified: branches/r5rs/uim/uim-helper-server.c
===================================================================
--- branches/r5rs/uim/uim-helper-server.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/uim/uim-helper-server.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -150,8 +150,9 @@
 }
 
 static void
-free_client(struct client *cl)
+close_client(struct client *cl)
 {
+  close(cl->fd);
   if (cl->rbuf) {
     free(cl->rbuf);
     cl->rbuf = strdup("");
@@ -261,20 +262,77 @@
   return UIM_TRUE;
 }
 
-/* FIXME: This function is too long to read... */
 static void
+write_message(struct client *cl)
+{
+  int ret, message_len, out_len;
+  char *out;
+  
+  out = cl->wbuf;
+  message_len = out_len = strlen(cl->wbuf);
+  while (out_len > 0) {
+    if ((ret = write(cl->fd, out, out_len)) < 0) {
+      if (errno == EAGAIN) {
+#if 0
+	fprintf(stderr, "EAGAIN: fd = %d\n", cl->fd);
+#endif
+      } else {
+	perror("uim-helper_server write(2) failed");
+	if (errno == EPIPE) {
+	  fprintf(stderr, "fd = %d\n", cl->fd);
+	  FD_CLR(cl->fd, &s_fdset_read);
+	  FD_CLR(cl->fd, &s_fdset_write);
+	  if (cl->fd == s_max_fd)
+	    s_max_fd--;
+	  close_client(cl);
+	}
+      }
+      break;
+    } else {
+      out += ret;
+      out_len -= ret;
+    }
+  }
+  if (out_len == 0) {
+    free(cl->wbuf);
+    cl->wbuf = strdup("");
+    FD_CLR(cl->fd, &s_fdset_write);    
+  } else {
+    uim_helper_buffer_shift(cl->wbuf, message_len - out_len);
+  }
+}
+
+
+static void
+read_message(struct client *cl)
+{
+  int result;
+  result = reflect_message_fragment(cl);
+  
+  if (result < 0) {
+    FD_CLR(cl->fd, &s_fdset_read);
+    FD_CLR(cl->fd, &s_fdset_write);
+    if (cl->fd == s_max_fd)
+      s_max_fd--;
+    close_client(cl);
+  }
+}
+
+
+static void
 uim_helper_server_process_connection(int server_fd)
 {
   int i;
-  fd_set readfds;
-  fd_set writefds;
+  fd_set readfds, writefds;
 
   while (1) {
     /* Could we replace this memcpy with direct assignment? */
+    /* Copy readfds from s_fdset_read/s_fdset_write because select removes
+       readble/writable fd from readfds/writefds */
     memcpy(&readfds, &s_fdset_read, sizeof(fd_set));
     memcpy(&writefds, &s_fdset_write, sizeof(fd_set));
 
-    /* call select(), waiting until a file descriptor readable */
+    /* call select(), waiting until a file descriptor became readable */
     if (select(s_max_fd + 1, &readfds, &writefds, NULL, NULL) <= 0) {
       perror("uim-helper_server select(2) failed");
       sleep(3);
@@ -292,56 +350,10 @@
       /* check data to write and from clients reached */
       for (i = 0; i < nr_client_slots; i++) {
 	if (clients[i].fd != -1 && FD_ISSET(clients[i].fd, &writefds)) {
-	  int ret, message_len, out_len;
-	  char *out;
-
-	  out = clients[i].wbuf;
-	  message_len = out_len = strlen(clients[i].wbuf);
-	  while (out_len > 0) {
-	    if ((ret = write(clients[i].fd, out, out_len)) < 0) {
-	      if (errno == EAGAIN) {
-#if 0
-		fprintf(stderr, "EAGAIN: fd = %d\n", clients[i].fd);
-#endif
-	      } else {
-		perror("uim-helper_server write(2) failed");
-		if (errno == EPIPE) {
-		  fprintf(stderr, "fd = %d\n", clients[i].fd);
-		  FD_CLR(clients[i].fd, &s_fdset_read);
-		  FD_CLR(clients[i].fd, &s_fdset_write);
-		  if (clients[i].fd == s_max_fd)
-		    s_max_fd--;
-		  close(clients[i].fd);
-		  free_client(&clients[i]);
-		}
-	      }
-	      break;
-	    } else {
-	      out += ret;
-	      out_len -= ret;
-	    }
-	  }
-	  if (out_len == 0) {
-	    free(clients[i].wbuf);
-	    clients[i].wbuf = strdup("");
-	    FD_CLR(clients[i].fd, &s_fdset_write);
-	  } else {
-	    uim_helper_buffer_shift(clients[i].wbuf, message_len - out_len);
-	  }
+	  write_message(&clients[i]);
 	}
 	if (clients[i].fd != -1 && FD_ISSET(clients[i].fd, &readfds)) {
-	  int result;
-	  /* actual process */
-	  result = reflect_message_fragment(&clients[i]);
-
-	  if (result < 0) {
-	    FD_CLR(clients[i].fd, &s_fdset_read);
-	    FD_CLR(clients[i].fd, &s_fdset_write);
-	    if (clients[i].fd == s_max_fd)
-	      s_max_fd--;
-	    close(clients[i].fd);
-	    free_client(&clients[i]);
-	  }
+	  read_message(&clients[i]);
 	}
       }
     }
@@ -352,6 +364,7 @@
   }
 }
 
+
 int
 main(int argc, char **argv)
 {

Modified: branches/r5rs/uim/uim-util.c
===================================================================
--- branches/r5rs/uim/uim-util.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/uim/uim-util.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -35,6 +35,7 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 #include <stdlib.h>
 #include <string.h>
 #include <locale.h>
@@ -127,6 +128,20 @@
 }
 
 static uim_lisp
+file_mtime(uim_lisp f)
+{
+  const char *filename = uim_scm_refer_c_str(f);
+  struct stat buf;
+
+  if(stat(filename, &buf) == 0) {
+    return uim_scm_make_int(buf.st_mtime);
+  } else {
+    /* FIXME: Write error handling code. */
+    return uim_scm_make_int(0);
+  }
+}
+
+static uim_lisp
 charcode2string(uim_lisp x)
 {
   char buf[2];
@@ -611,6 +626,7 @@
   uim_scm_init_subr_1("file-executable?", file_executablep);
   uim_scm_init_subr_1("file-regular?", file_regularp);
   uim_scm_init_subr_1("file-directory?", file_directoryp);
+  uim_scm_init_subr_1("file-mtime", file_mtime);
   uim_scm_init_subr_2("nthcdr", nthcdr);
   uim_scm_init_subr_1("charcode->string", charcode2string);
   uim_scm_init_subr_1("string->charcode", string2charcode);

Modified: branches/r5rs/uim/uim.c
===================================================================
--- branches/r5rs/uim/uim.c	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/uim/uim.c	2005-08-10 19:34:32 UTC (rev 1180)
@@ -350,6 +350,17 @@
 		    uc->id, custom, val);
 }
 
+
+/* Tentative name. I followed above uim_prop_update_custom, but prop 
+would not be proper to this function. */
+uim_bool
+uim_prop_reload_configs(void)
+{
+  /* FIXME: proces return value properly. */
+  uim_scm_eval_c_string("(custom-reload-configs)");
+  return UIM_TRUE;
+}
+
 int
 uim_get_current_mode(uim_context uc)
 {

Modified: branches/r5rs/uim/uim.h
===================================================================
--- branches/r5rs/uim/uim.h	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/uim/uim.h	2005-08-10 19:34:32 UTC (rev 1180)
@@ -523,6 +523,8 @@
 uim_prop_activate(uim_context uc, const char *str);
 void
 uim_prop_update_custom(uim_context uc, const char *custom, const char *val);
+uim_bool
+uim_prop_reload_configs(void);
 
 /* mode is obsoleted by property, so please use property API instead of mode API */
 int

Modified: branches/r5rs/xim/helper.cpp
===================================================================
--- branches/r5rs/xim/helper.cpp	2005-08-10 19:17:46 UTC (rev 1179)
+++ branches/r5rs/xim/helper.cpp	2005-08-10 19:34:32 UTC (rev 1180)
@@ -224,6 +224,8 @@
 	    (*it).second->customContext(custom, val);
 	}
 	return;
+    } else if (strcmp("custom_reload_notify", line) == 0) {
+	uim_prop_reload_configs();
     }
 }
 



More information about the uim-commit mailing list