Revision: 7156
Author:   ek.kato
Date:     Wed Jun 22 01:43:49 2011
Log:      * scm/im-custom.scm (candidate-window-style) : New.
* gtk2/immodule/gtk-im-uim.c
  - Add declaration of im_uim_create_cand_win_gtk().
  - (update_candwin_style) : New.  Dynamically update the style of
    candidate window.  uim-candwin-prog should be deprecated.
  - (parse_helper_str) : Update candidate style when custom
    changed.
  - (im_uim_create_cand_win) : Add check for
    candidate-window-style custom variable.
* xim/main.cpp
  - (XimServer::gCandWinPosType) : Move to ximserver.cpp.
  - (main) : Check candidate window style at the startup.
* xim/ximserver.cpp
  - (XimServer::gCandWinPosType) : Moved from main.cpp.
  - (XimServer::gCandWinStyle) : New.
  - (XimServer::gCandWinStyleUpdated) : New.
  - (XimServer::customContext) : Check candidate window style.
  - (XimServer::reloadConfigs) : Ditto.
  - (check_candwin_style) : New.
* xim/canddislp.cpp
  - Include <sys/param.h> for MAXPATHLEN.
  - (CANDWIN_PROG_PREFIX) : New.
  - (CANDWIN_PROG_SUFFIX) : New.
  - (NO_TOOLKIT) : New.
  - (candwin_command) : Use candidate-window-style custom
    variable.  uim-candwin-prog should be deprecated.
  - (canddisp_singleton) : Launch candidate window program when
    style is updated.
  - (Canddisp::adjust_display_limit) : Add a sanity check.
* xim/ximserver.h
  - (CandWinStyle) : New.
  - Add declaration of check_candwin_style().
  - (class XimServer) : Add gCandWinStyle and gCandWinStyleUpdated
    member.

http://code.google.com/p/uim/source/detail?r=7156

Modified:
 /trunk/gtk2/immodule/gtk-im-uim.c
 /trunk/scm/im-custom.scm
 /trunk/xim/canddisp.cpp
 /trunk/xim/main.cpp
 /trunk/xim/ximserver.cpp
 /trunk/xim/ximserver.h

=======================================
--- /trunk/gtk2/immodule/gtk-im-uim.c   Thu Jun 16 23:54:38 2011
+++ /trunk/gtk2/immodule/gtk-im-uim.c   Wed Jun 22 01:43:49 2011
@@ -123,6 +123,7 @@
static gboolean handle_key_on_toplevel(GtkWidget *widget, GdkEventKey *event, gpointer data);
 #endif
 static void send_im_list(void);
+static UIMCandWinGtk *im_uim_create_cand_win_gtk(void);

 static const GTypeInfo class_info = {
   sizeof(IMContextUIMClass),
@@ -1114,6 +1115,37 @@
       uim_cand_win_gtk_get_window_pos_type(cc->cwin);
   }
 }
+
+static void
+update_candwin_style()
+{
+  IMUIMContext *cc;
+  char *candwinprog; /* deprecated */
+
+  candwinprog = uim_scm_symbol_value_str("uim-candwin-prog");
+  /* don't update window style if deprecated uim-candwin-prog is set */
+  if (candwinprog) {
+    free(candwinprog);
+    return;
+  }
+
+  for (cc = context_list.next; cc != &context_list; cc = cc->next) {
+    if (cc->cwin) {
+      g_signal_handlers_disconnect_by_func(cc->cwin,
+                     (gpointer)(uintptr_t)index_changed_cb, cc);
+      gtk_widget_destroy(GTK_WIDGET(cc->cwin));
+#if IM_UIM_USE_TOPLEVEL
+      cwin_list = g_list_remove(cwin_list, cc->cwin);
+#endif
+      cc->cwin = im_uim_create_cand_win_gtk();
+#if IM_UIM_USE_TOPLEVEL
+      cwin_list = g_list_append(cwin_list, cc->cwin);
+#endif
+      g_signal_connect(G_OBJECT(cc->cwin), "index-changed",
+                      G_CALLBACK(index_changed_cb), cc);
+    }
+  }
+}

 static void
 parse_helper_str(const char *str)
@@ -1131,6 +1163,8 @@
        uim_prop_update_custom(cc->uc, lines[1], lines[2]);
        if (!strcmp(lines[1], "candidate-window-position"))
          update_candwin_pos_type();
+       if (!strcmp(lines[1], "candidate-window-style"))
+         update_candwin_style();
        break;  /* all custom variables are global */
       }
       g_strfreev(lines);
@@ -1138,6 +1172,7 @@
   } else if (g_str_has_prefix(str, "custom_reload_notify") == TRUE) {
     uim_prop_reload_configs();
     update_candwin_pos_type();
+    update_candwin_style();
   } else if (focused_context && !disable_focused_context) {
     if (g_str_has_prefix(str, "prop_list_get") == TRUE) {
       uim_prop_list_update(focused_context->uc);
@@ -1418,19 +1453,30 @@
 im_uim_create_cand_win_gtk()
 {
   UIMCandWinGtk *cwin = NULL;
-  char *candwinprog = uim_scm_symbol_value_str("uim-candwin-prog");
+  char *candwinprog; /* deprecated */
+  char *style;
+
+  candwinprog = uim_scm_symbol_value_str("uim-candwin-prog");
+  style= uim_scm_symbol_value_str("candidate-window-style");

   if (candwinprog) {
     if (!strncmp(candwinprog, "uim-candwin-tbl", 15))
       cwin = UIM_CAND_WIN_GTK(uim_cand_win_tbl_gtk_new());
     else if (!strncmp(candwinprog, "uim-candwin-horizontal", 22))
       cwin = UIM_CAND_WIN_GTK(uim_cand_win_horizontal_gtk_new());
-  }
+  } else {
+    if (style) {
+      if (!strcmp(style, "table"))
+        cwin = UIM_CAND_WIN_GTK(uim_cand_win_tbl_gtk_new());
+      else if (!strcmp(style, "horizontal"))
+        cwin = UIM_CAND_WIN_GTK(uim_cand_win_horizontal_gtk_new());
+    }
+  }
+  free(candwinprog);
+  free(style);

   if (!cwin)
-    cwin = uim_cand_win_gtk_new();
-
-  free(candwinprog);
+    cwin = uim_cand_win_gtk_new(); /* vertical */

   return cwin;
 }
=======================================
--- /trunk/scm/im-custom.scm    Fri Jun  3 00:25:13 2011
+++ /trunk/scm/im-custom.scm    Wed Jun 22 01:43:49 2011
@@ -399,6 +399,21 @@
                 (lambda ()
                   (update-style uim-color-spec (symbol-value uim-color))))

+(define-custom 'candidate-window-style 'vertical
+  '(global visual-preference)
+  (list 'choice
+       (list 'vertical
+             (N_ "Vertical")
+             (N_ "long description will be here"))
+       (list 'horizontal
+             (N_ "Horizontal")
+             (N_ "long description will be here"))
+       (list 'table
+             (N_ "Table style")
+             (N_ "long description will be here")))
+  (N_ "Candidate window type")
+  (N_ "long description will be here."))
+
 ;; referred by some bridges
 (define-custom 'candidate-window-position 'caret
   '(global visual-preference)
=======================================
--- /trunk/xim/canddisp.cpp     Sun May  8 08:05:21 2011
+++ /trunk/xim/canddisp.cpp     Wed Jun 22 01:43:49 2011
@@ -40,6 +40,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/param.h>

 #include "uim/uim.h"
 #include "uim/uim-util.h"
@@ -51,16 +52,17 @@
 #include "canddisp.h"
 #include "util.h"

+#define CANDWIN_PROG_PREFIX    (UIM_LIBEXECDIR "/uim-candwin")
 #if defined(USE_QT_CANDWIN)
-  #define DEFAULT_CANDWIN_PROG (UIM_LIBEXECDIR "/uim-candwin-qt")
+  #define CANDWIN_PROG_SUFFIX  "-qt"
 #elif defined(USE_QT4_CANDWIN)
-  #define DEFAULT_CANDWIN_PROG (UIM_LIBEXECDIR "/uim-candwin-qt4")
+  #define CANDWIN_PROG_SUFFIX  "-qt4"
 #elif defined(USE_GTK_CANDWIN) && defined(USE_GTK2)
-  #define DEFAULT_CANDWIN_PROG (UIM_LIBEXECDIR "/uim-candwin-gtk")
+  #define CANDWIN_PROG_SUFFIX  "-gtk"
 #elif defined(USE_GTK3_CANDWIN)
-  #define DEFAULT_CANDWIN_PROG (UIM_LIBEXECDIR "/uim-candwin-gtk3")
+  #define CANDWIN_PROG_SUFFIX  "-gtk3"
 #else
-  #define DEFAULT_CANDWIN_PROG NULL
+  #define NO_TOOLKIT
 #endif

 static FILE *candwin_r, *candwin_w;
@@ -73,30 +75,55 @@

 static const char *candwin_command(void)
 {
-    char *candwin_prog;
+    static char candwin_prog[MAXPATHLEN];
     const char *user_config;
-
+    char *str, *style;
+
+#ifdef NO_TOOLKIT
+    return NULL;
+#endif
     /*
       Search order of candwin_command be summarized as follows
         1. UIM_CANDWIN_PROG -- mainly for debugging purpose
-        2. value in 'uim-candwin-prog' symbol
+        2. value in 'uim-candwin-prog' symbol (deprecated)
         3. default toolkit's candwin program determined by ./configure
+           and the style is selected from 'candidate-window-style' symbol
      */

     user_config = getenv("UIM_CANDWIN_PROG");
-    if (!user_config)
-       user_config = uim_scm_symbol_value_str("uim-candwin-prog");
-
-    if (user_config && *user_config) {
-       asprintf(&candwin_prog, UIM_LIBEXECDIR "/%s", user_config);
+    str = user_config ?  strdup(user_config) :
+           uim_scm_symbol_value_str("uim-candwin-prog");
+
+    if (str && *str) {
+       snprintf(candwin_prog, MAXPATHLEN, UIM_LIBEXECDIR "/%s", str);
+       free(str);
+
        return candwin_prog;
     }
-
-    return DEFAULT_CANDWIN_PROG;
+    free(str);
+
+#define TYPELEN        20
+    style = uim_scm_symbol_value_str("candidate-window-style");
+    char type[TYPELEN] = "";
+    if (style) {
+       if (!strcmp(style, "table"))
+           strlcpy(type, "-tbl", TYPELEN);
+       else if (!strcmp(style, "horizontal"))
+           strlcpy(type, "-horizontal", TYPELEN);
+    }
+ snprintf(candwin_prog, MAXPATHLEN, "%s%s%s", CANDWIN_PROG_PREFIX, type, CANDWIN_PROG_SUFFIX);
+
+    return candwin_prog;
 }

 Canddisp *canddisp_singleton()
 {
+    if (XimServer::gCandWinStyleUpdated) {
+       terminate_canddisp_connection();
+       command = NULL;
+       XimServer::gCandWinStyleUpdated = false;
+    }
+
     if (!command)
        command = candwin_command();

@@ -133,7 +160,7 @@
     const char *s;
     int ret = display_limit;

-    if (strstr(command, "/uim-candwin-tbl-") == NULL)
+    if (!command || strstr(command, "/uim-candwin-tbl-") == NULL)
         return display_limit;

     cand = uim_get_candidate(uc, 0, 9999);
=======================================
--- /trunk/xim/main.cpp Sun May  1 21:20:23 2011
+++ /trunk/xim/main.cpp Wed Jun 22 01:43:49 2011
@@ -58,7 +58,6 @@

 Display *XimServer::gDpy;
 std::map<Window, XimServer *> XimServer::gServerMap;
-CandWinPosType XimServer::gCandWinPosType;

 // Configuration
 int g_option_mask;
@@ -642,6 +641,7 @@
     if (uim_scm_symbol_value_bool("uim-xim-use-xft-font?"))
        init_default_xftfont(); // setup Xft fonts for Ov/Rw preedit
 #endif
+    check_candwin_style();
     check_candwin_pos_type();

     // Handle pending events to prevent hang just after startup
=======================================
--- /trunk/xim/ximserver.cpp    Sun May  1 21:20:23 2011
+++ /trunk/xim/ximserver.cpp    Wed Jun 22 01:43:49 2011
@@ -84,6 +84,9 @@
 static int gMod1Mask, gMod2Mask, gMod3Mask, gMod4Mask, gMod5Mask;
 static int gXNumLockMask;

+CandWinPosType XimServer::gCandWinPosType;
+CandWinStyle XimServer::gCandWinStyle;
+bool XimServer::gCandWinStyleUpdated;

 void print_ustring(uString *s)
 {
@@ -175,6 +178,9 @@

     if (!strcmp(custom, "candidate-window-position"))
        check_candwin_pos_type();
+
+    if (!strcmp(custom, "candidate-window-style"))
+       check_candwin_style();
 }

 void XimServer::reloadConfigs() {
@@ -200,6 +206,7 @@
        disp->hide_caret_state();
     }

+    check_candwin_style();
     check_candwin_pos_type();
 }

@@ -1448,6 +1455,23 @@
 #endif
 }

+void
+check_candwin_style()
+{
+    char *style = uim_scm_symbol_value_str("candidate-window-style");
+    CandWinStyle PrevStyle = XimServer::gCandWinStyle;
+
+    if (style && !strcmp(style, "table"))
+       XimServer::gCandWinStyle = Table;
+    else if (style && !strcmp(style, "horizontal"))
+       XimServer::gCandWinStyle = Horizontal;
+    else
+       XimServer::gCandWinStyle = Vertical;
+
+    XimServer::gCandWinStyleUpdated =
+           (PrevStyle != XimServer::gCandWinStyle) ? true : false;
+    free(style);
+}

 void
 check_candwin_pos_type()
=======================================
--- /trunk/xim/ximserver.h      Thu Jan  6 18:09:56 2011
+++ /trunk/xim/ximserver.h      Wed Jun 22 01:43:49 2011
@@ -67,6 +67,12 @@
     Right
 } CandWinPosType;

+typedef enum {
+    Vertical,
+    Horizontal,
+    Table
+} CandWinStyle;
+
 // state of preedit.
 // created in the constructor of InputContext, and deleted in the
 // destructor of it.
@@ -94,6 +100,7 @@
 void update_default_xftfont();
 #endif
 void reload_uim(int x);
+void check_candwin_style();
 void check_candwin_pos_type();


@@ -278,6 +285,8 @@
     static Display *gDpy;
     static std::map<Window, XimServer *> gServerMap;
     static CandWinPosType gCandWinPosType;
+    static CandWinStyle gCandWinStyle;
+    static bool gCandWinStyleUpdated;
 private:
     Window mSelectionWin;
     Atom mServerAtom;

Reply via email to