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;