Mercurial > vim
annotate src/gui_xim.c @ 20651:3e03edae7e6f v8.2.0879
patch 8.2.0879: compiler warning for unused function argument
Commit: https://github.com/vim/vim/commit/f9ca08e95ff5b66a02c75334264dd86508b2a453
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Jun 1 18:56:03 2020 +0200
patch 8.2.0879: compiler warning for unused function argument
Problem: Compiler warning for unused function argument.
Solution: Add UNUSED.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 01 Jun 2020 19:00:04 +0200 |
parents | 6c5b11458f31 |
children | ccdd80a6dad7 |
rev | line source |
---|---|
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
3 * VIM - Vi IMproved by Bram Moolenaar |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
4 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
5 * Do ":help uganda" in Vim to read copying and usage conditions. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
6 * Do ":help credits" in Vim to see a list of people who contributed. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
7 * See README.txt for an overview of the Vim source code. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
8 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
9 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
10 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
11 * gui_xim.c: functions for the X Input Method |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
12 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
13 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
14 #include "vim.h" |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
15 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
16 #if defined(FEAT_GUI_GTK) && defined(FEAT_XIM) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
17 # if GTK_CHECK_VERSION(3,0,0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
18 # include <gdk/gdkkeysyms-compat.h> |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
19 # else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
20 # include <gdk/gdkkeysyms.h> |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
21 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
22 # ifdef MSWIN |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
23 # include <gdk/gdkwin32.h> |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
24 # else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
25 # include <gdk/gdkx.h> |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
26 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
27 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
28 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
29 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
30 * XIM often causes trouble. Define XIM_DEBUG to get a log of XIM callbacks |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
31 * in the "xim.log" file. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
32 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
33 // #define XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
34 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
35 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
36 xim_log(char *s, ...) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
37 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
38 va_list arglist; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
39 static FILE *fd = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
40 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
41 if (fd == (FILE *)-1) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
42 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
43 if (fd == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
44 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
45 fd = mch_fopen("xim.log", "w"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
46 if (fd == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
47 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
48 emsg("Cannot open xim.log"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
49 fd = (FILE *)-1; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
50 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
51 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
52 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
53 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
54 va_start(arglist, s); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
55 vfprintf(fd, s, arglist); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
56 va_end(arglist); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
57 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
58 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
59 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
60 #ifdef FEAT_GUI |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
61 # define USE_IMACTIVATEFUNC (!gui.in_use && *p_imaf != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
62 # define USE_IMSTATUSFUNC (!gui.in_use && *p_imsf != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
63 #else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
64 # define USE_IMACTIVATEFUNC (*p_imaf != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
65 # define USE_IMSTATUSFUNC (*p_imsf != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
66 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
67 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
68 #if defined(FEAT_EVAL) && \ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
69 (defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
70 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
71 call_imactivatefunc(int active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
72 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
73 typval_T argv[2]; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
74 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
75 argv[0].v_type = VAR_NUMBER; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
76 argv[0].vval.v_number = active ? 1 : 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
77 argv[1].v_type = VAR_UNKNOWN; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
78 (void)call_func_retnr(p_imaf, 1, argv); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
79 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
80 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
81 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
82 call_imstatusfunc(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
83 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
84 int is_active; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
85 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
86 // FIXME: Don't execute user function in unsafe situation. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
87 if (exiting || is_autocmd_blocked()) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
88 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
89 // FIXME: :py print 'xxx' is shown duplicate result. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
90 // Use silent to avoid it. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
91 ++msg_silent; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
92 is_active = call_func_retnr(p_imsf, 0, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
93 --msg_silent; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
94 return (is_active > 0); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
95 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
96 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
97 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
98 #if defined(FEAT_XIM) || defined(PROTO) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
99 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
100 # if defined(FEAT_GUI_GTK) || defined(PROTO) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
101 static int xim_has_preediting INIT(= FALSE); // IM current status |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
102 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
103 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
104 * Set preedit_start_col to the current cursor position. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
105 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
106 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
107 init_preedit_start_col(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
108 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
109 if (State & CMDLINE) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
110 preedit_start_col = cmdline_getvcol_cursor(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
111 else if (curwin != NULL && curwin->w_buffer != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
112 getvcol(curwin, &curwin->w_cursor, &preedit_start_col, NULL, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
113 // Prevent that preediting marks the buffer as changed. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
114 xim_changed_while_preediting = curbuf->b_changed; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
115 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
116 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
117 static int im_is_active = FALSE; // IM is enabled for current mode |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
118 static int preedit_is_active = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
119 static int im_preedit_cursor = 0; // cursor offset in characters |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
120 static int im_preedit_trailing = 0; // number of characters after cursor |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
121 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
122 static unsigned long im_commit_handler_id = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
123 static unsigned int im_activatekey_keyval = GDK_VoidSymbol; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
124 static unsigned int im_activatekey_state = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
125 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
126 static GtkWidget *preedit_window = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
127 static GtkWidget *preedit_label = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
128 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
129 static void im_preedit_window_set_position(void); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
130 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
131 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
132 im_set_active(int active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
133 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
134 int was_active; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
135 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
136 was_active = !!im_get_status(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
137 im_is_active = (active && !p_imdisable); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
138 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
139 if (im_is_active != was_active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
140 xim_reset(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
141 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
142 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
143 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
144 xim_set_focus(int focus) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
145 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
146 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
147 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
148 if (focus) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
149 gtk_im_context_focus_in(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
150 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
151 gtk_im_context_focus_out(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
152 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
153 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
154 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
155 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
156 im_set_position(int row, int col) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
157 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
158 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
159 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
160 GdkRectangle area; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
161 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
162 area.x = FILL_X(col); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
163 area.y = FILL_Y(row); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
164 area.width = gui.char_width * (mb_lefthalve(row, col) ? 2 : 1); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
165 area.height = gui.char_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
166 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
167 gtk_im_context_set_cursor_location(xic, &area); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
168 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
169 if (p_imst == IM_OVER_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
170 im_preedit_window_set_position(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
171 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
172 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
173 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
174 # if 0 || defined(PROTO) // apparently only used in gui_x11.c |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
175 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
176 xim_set_preedit(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
177 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
178 im_set_position(gui.row, gui.col); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
179 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
180 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
181 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
182 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
183 im_add_to_input(char_u *str, int len) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
184 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
185 // Convert from 'termencoding' (always "utf-8") to 'encoding' |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
186 if (input_conv.vc_type != CONV_NONE) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
187 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
188 str = string_convert(&input_conv, str, &len); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
189 g_return_if_fail(str != NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
190 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
191 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
192 add_to_input_buf_csi(str, len); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
193 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
194 if (input_conv.vc_type != CONV_NONE) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
195 vim_free(str); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
196 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
197 if (p_mh) // blank out the pointer if necessary |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
198 gui_mch_mousehide(TRUE); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
199 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
200 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
201 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
202 im_preedit_window_set_position(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
203 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
204 int x, y, width, height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
205 int screen_x, screen_y, screen_width, screen_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
206 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
207 if (preedit_window == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
208 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
209 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
210 gui_gtk_get_screen_geom_of_win(gui.drawarea, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
211 &screen_x, &screen_y, &screen_width, &screen_height); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
212 gdk_window_get_origin(gtk_widget_get_window(gui.drawarea), &x, &y); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
213 gtk_window_get_size(GTK_WINDOW(preedit_window), &width, &height); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
214 x = x + FILL_X(gui.col); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
215 y = y + FILL_Y(gui.row); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
216 if (x + width > screen_x + screen_width) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
217 x = screen_x + screen_width - width; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
218 if (y + height > screen_y + screen_height) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
219 y = screen_y + screen_height - height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
220 gtk_window_move(GTK_WINDOW(preedit_window), x, y); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
221 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
222 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
223 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
224 im_preedit_window_open() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
225 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
226 char *preedit_string; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
227 #if !GTK_CHECK_VERSION(3,16,0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
228 char buf[8]; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
229 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
230 PangoAttrList *attr_list; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
231 PangoLayout *layout; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
232 #if GTK_CHECK_VERSION(3,0,0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
233 # if !GTK_CHECK_VERSION(3,16,0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
234 GdkRGBA color; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
235 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
236 #else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
237 GdkColor color; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
238 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
239 gint w, h; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
240 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
241 if (preedit_window == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
242 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
243 preedit_window = gtk_window_new(GTK_WINDOW_POPUP); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
244 gtk_window_set_transient_for(GTK_WINDOW(preedit_window), |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
245 GTK_WINDOW(gui.mainwin)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
246 preedit_label = gtk_label_new(""); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
247 gtk_widget_set_name(preedit_label, "vim-gui-preedit-area"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
248 gtk_container_add(GTK_CONTAINER(preedit_window), preedit_label); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
249 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
250 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
251 #if GTK_CHECK_VERSION(3,16,0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
252 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
253 GtkStyleContext * const context |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
254 = gtk_widget_get_style_context(gui.drawarea); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
255 GtkCssProvider * const provider = gtk_css_provider_new(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
256 gchar *css = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
257 const char * const fontname |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
258 = pango_font_description_get_family(gui.norm_font); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
259 gint fontsize |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
260 = pango_font_description_get_size(gui.norm_font) / PANGO_SCALE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
261 gchar *fontsize_propval = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
262 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
263 if (!pango_font_description_get_size_is_absolute(gui.norm_font)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
264 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
265 // fontsize was given in points. Convert it into that in pixels |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
266 // to use with CSS. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
267 GdkScreen * const screen |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
268 = gdk_window_get_screen(gtk_widget_get_window(gui.mainwin)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
269 const gdouble dpi = gdk_screen_get_resolution(screen); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
270 fontsize = dpi * fontsize / 72; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
271 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
272 if (fontsize > 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
273 fontsize_propval = g_strdup_printf("%dpx", fontsize); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
274 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
275 fontsize_propval = g_strdup_printf("inherit"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
276 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
277 css = g_strdup_printf( |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
278 "widget#vim-gui-preedit-area {\n" |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
279 " font-family: %s,monospace;\n" |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
280 " font-size: %s;\n" |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
281 " color: #%.2lx%.2lx%.2lx;\n" |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
282 " background-color: #%.2lx%.2lx%.2lx;\n" |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
283 "}\n", |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
284 fontname != NULL ? fontname : "inherit", |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
285 fontsize_propval, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
286 (gui.norm_pixel >> 16) & 0xff, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
287 (gui.norm_pixel >> 8) & 0xff, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
288 gui.norm_pixel & 0xff, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
289 (gui.back_pixel >> 16) & 0xff, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
290 (gui.back_pixel >> 8) & 0xff, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
291 gui.back_pixel & 0xff); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
292 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
293 gtk_css_provider_load_from_data(provider, css, -1, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
294 gtk_style_context_add_provider(context, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
295 GTK_STYLE_PROVIDER(provider), G_MAXUINT); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
296 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
297 g_free(css); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
298 g_free(fontsize_propval); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
299 g_object_unref(provider); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
300 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
301 #elif GTK_CHECK_VERSION(3,0,0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
302 gtk_widget_override_font(preedit_label, gui.norm_font); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
303 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
304 vim_snprintf(buf, sizeof(buf), "#%06X", gui.norm_pixel); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
305 gdk_rgba_parse(&color, buf); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
306 gtk_widget_override_color(preedit_label, GTK_STATE_FLAG_NORMAL, &color); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
307 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
308 vim_snprintf(buf, sizeof(buf), "#%06X", gui.back_pixel); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
309 gdk_rgba_parse(&color, buf); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
310 gtk_widget_override_background_color(preedit_label, GTK_STATE_FLAG_NORMAL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
311 &color); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
312 #else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
313 gtk_widget_modify_font(preedit_label, gui.norm_font); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
314 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
315 vim_snprintf(buf, sizeof(buf), "#%06X", (unsigned)gui.norm_pixel); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
316 gdk_color_parse(buf, &color); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
317 gtk_widget_modify_fg(preedit_label, GTK_STATE_NORMAL, &color); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
318 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
319 vim_snprintf(buf, sizeof(buf), "#%06X", (unsigned)gui.back_pixel); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
320 gdk_color_parse(buf, &color); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
321 gtk_widget_modify_bg(preedit_window, GTK_STATE_NORMAL, &color); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
322 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
323 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
324 gtk_im_context_get_preedit_string(xic, &preedit_string, &attr_list, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
325 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
326 if (preedit_string[0] != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
327 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
328 gtk_label_set_text(GTK_LABEL(preedit_label), preedit_string); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
329 gtk_label_set_attributes(GTK_LABEL(preedit_label), attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
330 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
331 layout = gtk_label_get_layout(GTK_LABEL(preedit_label)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
332 pango_layout_get_pixel_size(layout, &w, &h); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
333 h = MAX(h, gui.char_height); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
334 gtk_window_resize(GTK_WINDOW(preedit_window), w, h); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
335 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
336 gtk_widget_show_all(preedit_window); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
337 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
338 im_preedit_window_set_position(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
339 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
340 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
341 g_free(preedit_string); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
342 pango_attr_list_unref(attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
343 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
344 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
345 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
346 im_preedit_window_close() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
347 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
348 if (preedit_window != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
349 gtk_widget_hide(preedit_window); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
350 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
351 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
352 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
353 im_show_preedit() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
354 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
355 im_preedit_window_open(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
356 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
357 if (p_mh) // blank out the pointer if necessary |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
358 gui_mch_mousehide(TRUE); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
359 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
360 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
361 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
362 im_delete_preedit(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
363 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
364 char_u bskey[] = {CSI, 'k', 'b'}; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
365 char_u delkey[] = {CSI, 'k', 'D'}; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
366 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
367 if (p_imst == IM_OVER_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
368 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
369 im_preedit_window_close(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
370 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
371 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
372 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
373 if (State & NORMAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
374 #ifdef FEAT_TERMINAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
375 && !term_use_loop() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
376 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
377 ) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
378 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
379 im_preedit_cursor = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
380 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
381 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
382 for (; im_preedit_cursor > 0; --im_preedit_cursor) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
383 add_to_input_buf(bskey, (int)sizeof(bskey)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
384 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
385 for (; im_preedit_trailing > 0; --im_preedit_trailing) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
386 add_to_input_buf(delkey, (int)sizeof(delkey)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
387 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
388 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
389 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
390 * Move the cursor left by "num_move_back" characters. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
391 * Note that ins_left() checks im_is_preediting() to avoid breaking undo for |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
392 * these K_LEFT keys. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
393 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
394 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
395 im_correct_cursor(int num_move_back) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
396 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
397 char_u backkey[] = {CSI, 'k', 'l'}; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
398 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
399 if (State & NORMAL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
400 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
401 # ifdef FEAT_RIGHTLEFT |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
402 if ((State & CMDLINE) == 0 && curwin != NULL && curwin->w_p_rl) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
403 backkey[2] = 'r'; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
404 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
405 for (; num_move_back > 0; --num_move_back) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
406 add_to_input_buf(backkey, (int)sizeof(backkey)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
407 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
408 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
409 static int xim_expected_char = NUL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
410 static int xim_ignored_char = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
411 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
412 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
413 * Update the mode and cursor while in an IM callback. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
414 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
415 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
416 im_show_info(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
417 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
418 int old_vgetc_busy; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
419 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
420 old_vgetc_busy = vgetc_busy; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
421 vgetc_busy = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
422 showmode(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
423 vgetc_busy = old_vgetc_busy; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
424 if ((State & NORMAL) || (State & INSERT)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
425 setcursor(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
426 out_flush(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
427 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
428 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
429 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
430 * Callback invoked when the user finished preediting. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
431 * Put the final string into the input buffer. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
432 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
433 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
434 im_commit_cb(GtkIMContext *context UNUSED, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
435 const gchar *str, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
436 gpointer data UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
437 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
438 int slen = (int)STRLEN(str); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
439 int add_to_input = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
440 int clen; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
441 int len = slen; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
442 int commit_with_preedit = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
443 char_u *im_str; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
444 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
445 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
446 xim_log("im_commit_cb(): %s\n", str); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
447 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
448 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
449 if (p_imst == IM_ON_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
450 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
451 // The imhangul module doesn't reset the preedit string before |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
452 // committing. Call im_delete_preedit() to work around that. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
453 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
454 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
455 // Indicate that preediting has finished. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
456 if (preedit_start_col == MAXCOL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
457 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
458 init_preedit_start_col(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
459 commit_with_preedit = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
460 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
461 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
462 // The thing which setting "preedit_start_col" to MAXCOL means that |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
463 // "preedit_start_col" will be set forcedly when calling |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
464 // preedit_changed_cb() next time. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
465 // "preedit_start_col" should not reset with MAXCOL on this part. Vim |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
466 // is simulating the preediting by using add_to_input_str(). when |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
467 // preedit begin immediately before committed, the typebuf is not |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
468 // flushed to screen, then it can't get correct "preedit_start_col". |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
469 // Thus, it should calculate the cells by adding cells of the committed |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
470 // string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
471 if (input_conv.vc_type != CONV_NONE) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
472 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
473 im_str = string_convert(&input_conv, (char_u *)str, &len); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
474 g_return_if_fail(im_str != NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
475 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
476 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
477 im_str = (char_u *)str; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
478 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
479 clen = mb_string2cells(im_str, len); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
480 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
481 if (input_conv.vc_type != CONV_NONE) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
482 vim_free(im_str); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
483 preedit_start_col += clen; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
484 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
485 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
486 // Is this a single character that matches a keypad key that's just |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
487 // been pressed? If so, we don't want it to be entered as such - let |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
488 // us carry on processing the raw keycode so that it may be used in |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
489 // mappings as <kSomething>. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
490 if (xim_expected_char != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
491 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
492 // We're currently processing a keypad or other special key |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
493 if (slen == 1 && str[0] == xim_expected_char) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
494 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
495 // It's a match - don't do it here |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
496 xim_ignored_char = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
497 add_to_input = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
498 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
499 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
500 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
501 // Not a match |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
502 xim_ignored_char = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
503 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
504 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
505 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
506 if (add_to_input) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
507 im_add_to_input((char_u *)str, slen); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
508 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
509 if (p_imst == IM_ON_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
510 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
511 // Inserting chars while "im_is_active" is set does not cause a |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
512 // change of buffer. When the chars are committed the buffer must be |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
513 // marked as changed. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
514 if (!commit_with_preedit) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
515 preedit_start_col = MAXCOL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
516 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
517 // This flag is used in changed() at next call. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
518 xim_changed_while_preediting = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
519 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
520 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
521 if (gtk_main_level() > 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
522 gtk_main_quit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
523 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
524 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
525 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
526 * Callback invoked after start to the preedit. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
527 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
528 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
529 im_preedit_start_cb(GtkIMContext *context UNUSED, gpointer data UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
530 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
531 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
532 xim_log("im_preedit_start_cb()\n"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
533 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
534 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
535 im_is_active = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
536 preedit_is_active = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
537 gui_update_cursor(TRUE, FALSE); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
538 im_show_info(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
539 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
540 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
541 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
542 * Callback invoked after end to the preedit. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
543 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
544 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
545 im_preedit_end_cb(GtkIMContext *context UNUSED, gpointer data UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
546 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
547 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
548 xim_log("im_preedit_end_cb()\n"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
549 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
550 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
551 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
552 // Indicate that preediting has finished |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
553 if (p_imst == IM_ON_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
554 preedit_start_col = MAXCOL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
555 xim_has_preediting = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
556 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
557 #if 0 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
558 // Removal of this line suggested by Takuhiro Nishioka. Fixes that IM was |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
559 // switched off unintentionally. We now use preedit_is_active (added by |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
560 // SungHyun Nam). |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
561 im_is_active = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
562 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
563 preedit_is_active = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
564 gui_update_cursor(TRUE, FALSE); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
565 im_show_info(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
566 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
567 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
568 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
569 * Callback invoked after changes to the preedit string. If the preedit |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
570 * string was empty before, remember the preedit start column so we know |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
571 * where to apply feedback attributes. Delete the previous preedit string |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
572 * if there was one, save the new preedit cursor offset, and put the new |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
573 * string into the input buffer. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
574 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
575 * TODO: The pragmatic "put into input buffer" approach used here has |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
576 * several fundamental problems: |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
577 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
578 * - The characters in the preedit string are subject to remapping. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
579 * That's broken, only the finally committed string should be remapped. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
580 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
581 * - There is a race condition involved: The retrieved value for the |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
582 * current cursor position will be wrong if any unprocessed characters |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
583 * are still queued in the input buffer. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
584 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
585 * - Due to the lack of synchronization between the file buffer in memory |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
586 * and any typed characters, it's practically impossible to implement the |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
587 * "retrieve_surrounding" and "delete_surrounding" signals reliably. IM |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
588 * modules for languages such as Thai are likely to rely on this feature |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
589 * for proper operation. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
590 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
591 * Conclusions: I think support for preediting needs to be moved to the |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
592 * core parts of Vim. Ideally, until it has been committed, the preediting |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
593 * string should only be displayed and not affect the buffer content at all. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
594 * The question how to deal with the synchronization issue still remains. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
595 * Circumventing the input buffer is probably not desirable. Anyway, I think |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
596 * implementing "retrieve_surrounding" is the only hard problem. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
597 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
598 * One way to solve all of this in a clean manner would be to queue all key |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
599 * press/release events "as is" in the input buffer, and apply the IM filtering |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
600 * at the receiving end of the queue. This, however, would have a rather large |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
601 * impact on the code base. If there is an easy way to force processing of all |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
602 * remaining input from within the "retrieve_surrounding" signal handler, this |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
603 * might not be necessary. Gotta ask on vim-dev for opinions. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
604 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
605 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
606 im_preedit_changed_cb(GtkIMContext *context, gpointer data UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
607 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
608 char *preedit_string = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
609 int cursor_index = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
610 int num_move_back = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
611 char_u *str; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
612 char_u *p; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
613 int i; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
614 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
615 if (p_imst == IM_ON_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
616 gtk_im_context_get_preedit_string(context, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
617 &preedit_string, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
618 &cursor_index); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
619 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
620 gtk_im_context_get_preedit_string(context, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
621 &preedit_string, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
622 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
623 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
624 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
625 xim_log("im_preedit_changed_cb(): %s\n", preedit_string); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
626 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
627 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
628 g_return_if_fail(preedit_string != NULL); // just in case |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
629 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
630 if (p_imst == IM_OVER_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
631 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
632 if (preedit_string[0] == NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
633 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
634 xim_has_preediting = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
635 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
636 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
637 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
638 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
639 xim_has_preediting = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
640 im_show_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
641 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
642 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
643 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
644 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
645 // If preedit_start_col is MAXCOL set it to the current cursor position. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
646 if (preedit_start_col == MAXCOL && preedit_string[0] != '\0') |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
647 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
648 xim_has_preediting = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
649 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
650 // Urgh, this breaks if the input buffer isn't empty now |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
651 init_preedit_start_col(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
652 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
653 else if (cursor_index == 0 && preedit_string[0] == '\0') |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
654 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
655 xim_has_preediting = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
656 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
657 // If at the start position (after typing backspace) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
658 // preedit_start_col must be reset. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
659 preedit_start_col = MAXCOL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
660 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
661 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
662 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
663 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
664 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
665 * Compute the end of the preediting area: "preedit_end_col". |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
666 * According to the documentation of gtk_im_context_get_preedit_string(), |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
667 * the cursor_pos output argument returns the offset in bytes. This is |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
668 * unfortunately not true -- real life shows the offset is in characters, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
669 * and the GTK+ source code agrees with me. Will file a bug later. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
670 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
671 if (preedit_start_col != MAXCOL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
672 preedit_end_col = preedit_start_col; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
673 str = (char_u *)preedit_string; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
674 for (p = str, i = 0; *p != NUL; p += utf_byte2len(*p), ++i) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
675 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
676 int is_composing; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
677 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
678 is_composing = ((*p & 0x80) != 0 && utf_iscomposing(utf_ptr2char(p))); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
679 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
680 * These offsets are used as counters when generating <BS> and <Del> |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
681 * to delete the preedit string. So don't count composing characters |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
682 * unless 'delcombine' is enabled. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
683 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
684 if (!is_composing || p_deco) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
685 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
686 if (i < cursor_index) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
687 ++im_preedit_cursor; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
688 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
689 ++im_preedit_trailing; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
690 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
691 if (!is_composing && i >= cursor_index) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
692 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
693 // This is essentially the same as im_preedit_trailing, except |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
694 // composing characters are not counted even if p_deco is set. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
695 ++num_move_back; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
696 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
697 if (preedit_start_col != MAXCOL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
698 preedit_end_col += utf_ptr2cells(p); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
699 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
700 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
701 if (p > str) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
702 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
703 im_add_to_input(str, (int)(p - str)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
704 im_correct_cursor(num_move_back); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
705 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
706 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
707 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
708 g_free(preedit_string); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
709 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
710 if (gtk_main_level() > 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
711 gtk_main_quit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
712 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
713 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
714 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
715 * Translate the Pango attributes at iter to Vim highlighting attributes. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
716 * Ignore attributes not supported by Vim highlighting. This shouldn't have |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
717 * too much impact -- right now we handle even more attributes than necessary |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
718 * for the IM modules I tested with. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
719 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
720 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
721 translate_pango_attributes(PangoAttrIterator *iter) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
722 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
723 PangoAttribute *attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
724 int char_attr = HL_NORMAL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
725 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
726 attr = pango_attr_iterator_get(iter, PANGO_ATTR_UNDERLINE); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
727 if (attr != NULL && ((PangoAttrInt *)attr)->value |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
728 != (int)PANGO_UNDERLINE_NONE) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
729 char_attr |= HL_UNDERLINE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
730 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
731 attr = pango_attr_iterator_get(iter, PANGO_ATTR_WEIGHT); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
732 if (attr != NULL && ((PangoAttrInt *)attr)->value >= (int)PANGO_WEIGHT_BOLD) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
733 char_attr |= HL_BOLD; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
734 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
735 attr = pango_attr_iterator_get(iter, PANGO_ATTR_STYLE); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
736 if (attr != NULL && ((PangoAttrInt *)attr)->value |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
737 != (int)PANGO_STYLE_NORMAL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
738 char_attr |= HL_ITALIC; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
739 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
740 attr = pango_attr_iterator_get(iter, PANGO_ATTR_BACKGROUND); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
741 if (attr != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
742 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
743 const PangoColor *color = &((PangoAttrColor *)attr)->color; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
744 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
745 // Assume inverse if black background is requested |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
746 if ((color->red | color->green | color->blue) == 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
747 char_attr |= HL_INVERSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
748 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
749 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
750 return char_attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
751 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
752 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
753 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
754 * Retrieve the highlighting attributes at column col in the preedit string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
755 * Return -1 if not in preediting mode or if col is out of range. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
756 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
757 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
758 im_get_feedback_attr(int col) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
759 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
760 char *preedit_string = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
761 PangoAttrList *attr_list = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
762 int char_attr = -1; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
763 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
764 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
765 return char_attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
766 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
767 gtk_im_context_get_preedit_string(xic, &preedit_string, &attr_list, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
768 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
769 if (preedit_string != NULL && attr_list != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
770 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
771 int idx; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
772 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
773 // Get the byte index as used by PangoAttrIterator |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
774 for (idx = 0; col > 0 && preedit_string[idx] != '\0'; --col) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
775 idx += utfc_ptr2len((char_u *)preedit_string + idx); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
776 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
777 if (preedit_string[idx] != '\0') |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
778 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
779 PangoAttrIterator *iter; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
780 int start, end; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
781 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
782 char_attr = HL_NORMAL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
783 iter = pango_attr_list_get_iterator(attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
784 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
785 // Extract all relevant attributes from the list. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
786 do |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
787 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
788 pango_attr_iterator_range(iter, &start, &end); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
789 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
790 if (idx >= start && idx < end) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
791 char_attr |= translate_pango_attributes(iter); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
792 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
793 while (pango_attr_iterator_next(iter)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
794 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
795 pango_attr_iterator_destroy(iter); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
796 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
797 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
798 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
799 if (attr_list != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
800 pango_attr_list_unref(attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
801 g_free(preedit_string); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
802 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
803 return char_attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
804 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
805 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
806 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
807 xim_init(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
808 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
809 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
810 xim_log("xim_init()\n"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
811 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
812 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
813 g_return_if_fail(gui.drawarea != NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
814 g_return_if_fail(gtk_widget_get_window(gui.drawarea) != NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
815 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
816 xic = gtk_im_multicontext_new(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
817 g_object_ref(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
818 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
819 im_commit_handler_id = g_signal_connect(G_OBJECT(xic), "commit", |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
820 G_CALLBACK(&im_commit_cb), NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
821 g_signal_connect(G_OBJECT(xic), "preedit_changed", |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
822 G_CALLBACK(&im_preedit_changed_cb), NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
823 g_signal_connect(G_OBJECT(xic), "preedit_start", |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
824 G_CALLBACK(&im_preedit_start_cb), NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
825 g_signal_connect(G_OBJECT(xic), "preedit_end", |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
826 G_CALLBACK(&im_preedit_end_cb), NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
827 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
828 gtk_im_context_set_client_window(xic, gtk_widget_get_window(gui.drawarea)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
829 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
830 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
831 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
832 im_shutdown(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
833 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
834 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
835 xim_log("im_shutdown()\n"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
836 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
837 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
838 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
839 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
840 gtk_im_context_focus_out(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
841 g_object_unref(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
842 xic = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
843 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
844 im_is_active = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
845 im_commit_handler_id = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
846 if (p_imst == IM_ON_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
847 preedit_start_col = MAXCOL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
848 xim_has_preediting = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
849 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
850 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
851 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
852 * Convert the string argument to keyval and state for GdkEventKey. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
853 * If str is valid return TRUE, otherwise FALSE. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
854 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
855 * See 'imactivatekey' for documentation of the format. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
856 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
857 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
858 im_string_to_keyval(const char *str, unsigned int *keyval, unsigned int *state) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
859 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
860 const char *mods_end; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
861 unsigned tmp_keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
862 unsigned tmp_state = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
863 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
864 mods_end = strrchr(str, '-'); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
865 mods_end = (mods_end != NULL) ? mods_end + 1 : str; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
866 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
867 // Parse modifier keys |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
868 while (str < mods_end) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
869 switch (*str++) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
870 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
871 case '-': break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
872 case 'S': case 's': tmp_state |= (unsigned)GDK_SHIFT_MASK; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
873 case 'L': case 'l': tmp_state |= (unsigned)GDK_LOCK_MASK; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
874 case 'C': case 'c': tmp_state |= (unsigned)GDK_CONTROL_MASK;break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
875 case '1': tmp_state |= (unsigned)GDK_MOD1_MASK; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
876 case '2': tmp_state |= (unsigned)GDK_MOD2_MASK; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
877 case '3': tmp_state |= (unsigned)GDK_MOD3_MASK; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
878 case '4': tmp_state |= (unsigned)GDK_MOD4_MASK; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
879 case '5': tmp_state |= (unsigned)GDK_MOD5_MASK; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
880 default: |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
881 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
882 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
883 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
884 tmp_keyval = gdk_keyval_from_name(str); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
885 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
886 if (tmp_keyval == 0 || tmp_keyval == GDK_VoidSymbol) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
887 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
888 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
889 if (keyval != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
890 *keyval = tmp_keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
891 if (state != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
892 *state = tmp_state; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
893 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
894 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
895 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
896 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
897 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
898 * Return TRUE if p_imak is valid, otherwise FALSE. As a special case, an |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
899 * empty string is also regarded as valid. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
900 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
901 * Note: The numerical key value of p_imak is cached if it was valid; thus |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
902 * boldly assuming im_xim_isvalid_imactivate() will always be called whenever |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
903 * 'imak' changes. This is currently the case but not obvious -- should |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
904 * probably rename the function for clarity. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
905 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
906 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
907 im_xim_isvalid_imactivate(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
908 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
909 if (p_imak[0] == NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
910 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
911 im_activatekey_keyval = GDK_VoidSymbol; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
912 im_activatekey_state = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
913 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
914 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
915 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
916 return im_string_to_keyval((const char *)p_imak, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
917 &im_activatekey_keyval, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
918 &im_activatekey_state); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
919 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
920 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
921 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
922 im_synthesize_keypress(unsigned int keyval, unsigned int state) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
923 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
924 GdkEventKey *event; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
925 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
926 event = (GdkEventKey *)gdk_event_new(GDK_KEY_PRESS); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
927 g_object_ref(gtk_widget_get_window(gui.drawarea)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
928 // unreffed by gdk_event_free() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
929 event->window = gtk_widget_get_window(gui.drawarea); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
930 event->send_event = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
931 event->time = GDK_CURRENT_TIME; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
932 event->state = state; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
933 event->keyval = keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
934 event->hardware_keycode = // needed for XIM |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
935 XKeysymToKeycode(GDK_WINDOW_XDISPLAY(event->window), (KeySym)keyval); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
936 event->length = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
937 event->string = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
938 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
939 gtk_im_context_filter_keypress(xic, event); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
940 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
941 // For consistency, also send the corresponding release event. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
942 event->type = GDK_KEY_RELEASE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
943 event->send_event = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
944 gtk_im_context_filter_keypress(xic, event); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
945 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
946 gdk_event_free((GdkEvent *)event); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
947 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
948 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
949 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
950 xim_reset(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
951 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
952 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
953 if (USE_IMACTIVATEFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
954 call_imactivatefunc(im_is_active); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
955 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
956 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
957 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
958 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
959 gtk_im_context_reset(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
960 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
961 if (p_imdisable) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
962 im_shutdown(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
963 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
964 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
965 xim_set_focus(gui.in_focus); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
966 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
967 if (im_activatekey_keyval != GDK_VoidSymbol) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
968 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
969 if (im_is_active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
970 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
971 g_signal_handler_block(xic, im_commit_handler_id); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
972 im_synthesize_keypress(im_activatekey_keyval, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
973 im_activatekey_state); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
974 g_signal_handler_unblock(xic, im_commit_handler_id); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
975 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
976 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
977 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
978 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
979 im_shutdown(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
980 xim_init(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
981 xim_set_focus(gui.in_focus); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
982 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
983 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
984 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
985 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
986 if (p_imst == IM_ON_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
987 preedit_start_col = MAXCOL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
988 xim_has_preediting = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
989 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
990 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
991 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
992 xim_queue_key_press_event(GdkEventKey *event, int down) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
993 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
994 if (down) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
995 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
996 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
997 * Workaround GTK2 XIM 'feature' that always converts keypad keys to |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
998 * chars., even when not part of an IM sequence (ref. feature of |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
999 * gdk/gdkkeyuni.c). |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1000 * Flag any keypad keys that might represent a single char. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1001 * If this (on its own - i.e., not part of an IM sequence) is |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1002 * committed while we're processing one of these keys, we can ignore |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1003 * that commit and go ahead & process it ourselves. That way we can |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1004 * still distinguish keypad keys for use in mappings. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1005 * Also add GDK_space to make <S-Space> work. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1006 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1007 switch (event->keyval) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1008 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1009 case GDK_KP_Add: xim_expected_char = '+'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1010 case GDK_KP_Subtract: xim_expected_char = '-'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1011 case GDK_KP_Divide: xim_expected_char = '/'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1012 case GDK_KP_Multiply: xim_expected_char = '*'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1013 case GDK_KP_Decimal: xim_expected_char = '.'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1014 case GDK_KP_Equal: xim_expected_char = '='; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1015 case GDK_KP_0: xim_expected_char = '0'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1016 case GDK_KP_1: xim_expected_char = '1'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1017 case GDK_KP_2: xim_expected_char = '2'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1018 case GDK_KP_3: xim_expected_char = '3'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1019 case GDK_KP_4: xim_expected_char = '4'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1020 case GDK_KP_5: xim_expected_char = '5'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1021 case GDK_KP_6: xim_expected_char = '6'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1022 case GDK_KP_7: xim_expected_char = '7'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1023 case GDK_KP_8: xim_expected_char = '8'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1024 case GDK_KP_9: xim_expected_char = '9'; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1025 case GDK_space: xim_expected_char = ' '; break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1026 default: xim_expected_char = NUL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1027 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1028 xim_ignored_char = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1029 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1030 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1031 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1032 * When typing fFtT, XIM may be activated. Thus it must pass |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1033 * gtk_im_context_filter_keypress() in Normal mode. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1034 * And while doing :sh too. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1035 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1036 if (xic != NULL && !p_imdisable |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1037 && (State & (INSERT | CMDLINE | NORMAL | EXTERNCMD)) != 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1038 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1039 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1040 * Filter 'imactivatekey' and map it to CTRL-^. This way, Vim is |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1041 * always aware of the current status of IM, and can even emulate |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1042 * the activation key for modules that don't support one. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1043 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1044 if (event->keyval == im_activatekey_keyval |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1045 && (event->state & im_activatekey_state) == im_activatekey_state) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1046 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1047 unsigned int state_mask; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1048 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1049 // Require the state of the 3 most used modifiers to match exactly. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1050 // Otherwise e.g. <S-C-space> would be unusable for other purposes |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1051 // if the IM activate key is <S-space>. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1052 state_mask = im_activatekey_state; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1053 state_mask |= ((int)GDK_SHIFT_MASK | (int)GDK_CONTROL_MASK |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1054 | (int)GDK_MOD1_MASK); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1055 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1056 if ((event->state & state_mask) != im_activatekey_state) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1057 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1058 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1059 // Don't send it a second time on GDK_KEY_RELEASE. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1060 if (event->type != GDK_KEY_PRESS) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1061 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1062 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1063 if (map_to_exists_mode((char_u *)"", LANGMAP, FALSE)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1064 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1065 im_set_active(FALSE); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1066 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1067 // ":lmap" mappings exists, toggle use of mappings. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1068 State ^= LANGMAP; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1069 if (State & LANGMAP) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1070 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1071 curbuf->b_p_iminsert = B_IMODE_NONE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1072 State &= ~LANGMAP; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1073 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1074 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1075 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1076 curbuf->b_p_iminsert = B_IMODE_LMAP; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1077 State |= LANGMAP; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1078 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1079 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1080 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1081 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1082 return gtk_im_context_filter_keypress(xic, event); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1083 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1084 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1085 // Don't filter events through the IM context if IM isn't active |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1086 // right now. Unlike with GTK+ 1.2 we cannot rely on the IM module |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1087 // not doing anything before the activation key was sent. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1088 if (im_activatekey_keyval == GDK_VoidSymbol || im_is_active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1089 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1090 int imresult = gtk_im_context_filter_keypress(xic, event); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1091 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1092 if (p_imst == IM_ON_THE_SPOT) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1093 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1094 // Some XIM send following sequence: |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1095 // 1. preedited string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1096 // 2. committed string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1097 // 3. line changed key. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1098 // 4. preedited string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1099 // 5. remove preedited string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1100 // if 3, Vim can't move back the above line for 5. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1101 // thus, this part should not parse the key. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1102 if (!imresult && preedit_start_col != MAXCOL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1103 && event->keyval == GDK_Return) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1104 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1105 im_synthesize_keypress(GDK_Return, 0U); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1106 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1107 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1108 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1109 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1110 // If XIM tried to commit a keypad key as a single char., |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1111 // ignore it so we can use the keypad key 'raw', for mappings. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1112 if (xim_expected_char != NUL && xim_ignored_char) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1113 // We had a keypad key, and XIM tried to thieve it |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1114 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1115 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1116 // This is supposed to fix a problem with iBus, that space |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1117 // characters don't work in input mode. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1118 xim_expected_char = NUL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1119 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1120 // Normal processing |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1121 return imresult; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1122 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1123 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1124 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1125 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1126 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1127 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1128 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1129 im_get_status(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1130 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1131 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1132 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1133 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1134 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1135 return im_is_active; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1136 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1137 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1138 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1139 preedit_get_status(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1140 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1141 return preedit_is_active; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1142 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1143 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1144 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1145 im_is_preediting(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1146 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1147 return xim_has_preediting; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1148 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1149 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1150 # else // !FEAT_GUI_GTK |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1151 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1152 static int xim_is_active = FALSE; // XIM should be active in the current |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1153 // mode |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1154 static int xim_has_focus = FALSE; // XIM is really being used for Vim |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1155 # ifdef FEAT_GUI_X11 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1156 static XIMStyle input_style; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1157 static int status_area_enabled = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1158 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1159 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1160 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1161 * Switch using XIM on/off. This is used by the code that changes "State". |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1162 * When 'imactivatefunc' is defined use that function instead. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1163 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1164 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1165 im_set_active(int active_arg) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1166 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1167 int active = active_arg; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1168 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1169 // If 'imdisable' is set, XIM is never active. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1170 if (p_imdisable) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1171 active = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1172 else if (input_style & XIMPreeditPosition) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1173 // There is a problem in switching XIM off when preediting is used, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1174 // and it is not clear how this can be solved. For now, keep XIM on |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1175 // all the time, like it was done in Vim 5.8. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1176 active = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1177 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1178 # if defined(FEAT_EVAL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1179 if (USE_IMACTIVATEFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1180 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1181 if (active != im_get_status()) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1182 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1183 call_imactivatefunc(active); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1184 xim_has_focus = active; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1185 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1186 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1187 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1188 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1189 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1190 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1191 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1192 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1193 // Remember the active state, it is needed when Vim gets keyboard focus. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1194 xim_is_active = active; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1195 xim_set_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1196 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1197 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1198 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1199 * Adjust using XIM for gaining or losing keyboard focus. Also called when |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1200 * "xim_is_active" changes. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1201 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1202 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1203 xim_set_focus(int focus) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1204 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1205 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1206 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1207 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1208 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1209 * XIM only gets focus when the Vim window has keyboard focus and XIM has |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1210 * been set active for the current mode. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1211 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1212 if (focus && xim_is_active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1213 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1214 if (!xim_has_focus) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1215 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1216 xim_has_focus = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1217 XSetICFocus(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1218 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1219 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1220 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1221 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1222 if (xim_has_focus) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1223 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1224 xim_has_focus = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1225 XUnsetICFocus(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1226 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1227 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1228 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1229 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1230 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1231 im_set_position(int row UNUSED, int col UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1232 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1233 xim_set_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1234 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1235 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1236 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1237 * Set the XIM to the current cursor position. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1238 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1239 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1240 xim_set_preedit(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1241 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1242 XVaNestedList attr_list; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1243 XRectangle spot_area; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1244 XPoint over_spot; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1245 int line_space; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1246 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1247 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1248 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1249 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1250 xim_set_focus(TRUE); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1251 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1252 if (!xim_has_focus) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1253 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1254 // hide XIM cursor |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1255 over_spot.x = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1256 over_spot.y = -100; // arbitrary invisible position |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1257 attr_list = (XVaNestedList) XVaCreateNestedList(0, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1258 XNSpotLocation, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1259 &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1260 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1261 XSetICValues(xic, XNPreeditAttributes, attr_list, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1262 XFree(attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1263 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1264 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1265 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1266 if (input_style & XIMPreeditPosition) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1267 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1268 if (xim_fg_color == INVALCOLOR) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1269 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1270 xim_fg_color = gui.def_norm_pixel; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1271 xim_bg_color = gui.def_back_pixel; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1272 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1273 over_spot.x = TEXT_X(gui.col); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1274 over_spot.y = TEXT_Y(gui.row); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1275 spot_area.x = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1276 spot_area.y = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1277 spot_area.height = gui.char_height * Rows; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1278 spot_area.width = gui.char_width * Columns; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1279 line_space = gui.char_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1280 attr_list = (XVaNestedList) XVaCreateNestedList(0, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1281 XNSpotLocation, &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1282 XNForeground, (Pixel) xim_fg_color, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1283 XNBackground, (Pixel) xim_bg_color, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1284 XNArea, &spot_area, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1285 XNLineSpace, line_space, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1286 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1287 if (XSetICValues(xic, XNPreeditAttributes, attr_list, NULL)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1288 emsg(_("E284: Cannot set IC values")); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1289 XFree(attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1290 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1291 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1292 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1293 # if defined(FEAT_GUI_X11) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1294 static char e_xim[] = N_("E285: Failed to create input context"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1295 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1296 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1297 # if defined(FEAT_GUI_X11) || defined(PROTO) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1298 # if defined(XtSpecificationRelease) && XtSpecificationRelease >= 6 && !defined(SUN_SYSTEM) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1299 # define USE_X11R6_XIM |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1300 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1301 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1302 static int xim_real_init(Window x11_window, Display *x11_display); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1303 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1304 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1305 # ifdef USE_X11R6_XIM |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1306 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1307 xim_instantiate_cb( |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1308 Display *display, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1309 XPointer client_data UNUSED, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1310 XPointer call_data UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1311 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1312 Window x11_window; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1313 Display *x11_display; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1314 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1315 # ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1316 xim_log("xim_instantiate_cb()\n"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1317 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1318 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1319 gui_get_x11_windis(&x11_window, &x11_display); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1320 if (display != x11_display) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1321 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1322 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1323 xim_real_init(x11_window, x11_display); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1324 gui_set_shellsize(FALSE, FALSE, RESIZE_BOTH); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1325 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1326 XUnregisterIMInstantiateCallback(x11_display, NULL, NULL, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1327 xim_instantiate_cb, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1328 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1329 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1330 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1331 xim_destroy_cb( |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1332 XIM im UNUSED, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1333 XPointer client_data UNUSED, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1334 XPointer call_data UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1335 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1336 Window x11_window; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1337 Display *x11_display; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1338 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1339 # ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1340 xim_log("xim_destroy_cb()\n"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1341 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1342 gui_get_x11_windis(&x11_window, &x11_display); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1343 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1344 xic = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1345 status_area_enabled = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1346 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1347 gui_set_shellsize(FALSE, FALSE, RESIZE_BOTH); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1348 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1349 XRegisterIMInstantiateCallback(x11_display, NULL, NULL, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1350 xim_instantiate_cb, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1351 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1352 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1353 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1354 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1355 xim_init(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1356 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1357 Window x11_window; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1358 Display *x11_display; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1359 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1360 # ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1361 xim_log("xim_init()\n"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1362 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1363 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1364 gui_get_x11_windis(&x11_window, &x11_display); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1365 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1366 xic = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1367 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1368 if (xim_real_init(x11_window, x11_display)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1369 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1370 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1371 gui_set_shellsize(FALSE, FALSE, RESIZE_BOTH); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1372 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1373 # ifdef USE_X11R6_XIM |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1374 XRegisterIMInstantiateCallback(x11_display, NULL, NULL, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1375 xim_instantiate_cb, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1376 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1377 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1378 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1379 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1380 xim_real_init(Window x11_window, Display *x11_display) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1381 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1382 int i; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1383 char *p, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1384 *s, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1385 *ns, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1386 *end, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1387 tmp[1024]; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1388 # define IMLEN_MAX 40 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1389 char buf[IMLEN_MAX + 7]; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1390 XIM xim = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1391 XIMStyles *xim_styles; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1392 XIMStyle this_input_style = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1393 Boolean found; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1394 XPoint over_spot; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1395 XVaNestedList preedit_list, status_list; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1396 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1397 input_style = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1398 status_area_enabled = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1399 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1400 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1401 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1402 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1403 if (gui.rsrc_input_method != NULL && *gui.rsrc_input_method != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1404 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1405 strcpy(tmp, gui.rsrc_input_method); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1406 for (ns = s = tmp; ns != NULL && *s != NUL;) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1407 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1408 s = (char *)skipwhite((char_u *)s); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1409 if (*s == NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1410 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1411 if ((ns = end = strchr(s, ',')) == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1412 end = s + strlen(s); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1413 while (isspace(((char_u *)end)[-1])) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1414 end--; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1415 *end = NUL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1416 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1417 if (strlen(s) <= IMLEN_MAX) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1418 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1419 strcpy(buf, "@im="); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1420 strcat(buf, s); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1421 if ((p = XSetLocaleModifiers(buf)) != NULL && *p != NUL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1422 && (xim = XOpenIM(x11_display, NULL, NULL, NULL)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1423 != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1424 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1425 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1426 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1427 s = ns + 1; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1428 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1429 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1430 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1431 if (xim == NULL && (p = XSetLocaleModifiers("")) != NULL && *p != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1432 xim = XOpenIM(x11_display, NULL, NULL, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1433 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1434 // This is supposed to be useful to obtain characters through |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1435 // XmbLookupString() without really using a XIM. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1436 if (xim == NULL && (p = XSetLocaleModifiers("@im=none")) != NULL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1437 && *p != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1438 xim = XOpenIM(x11_display, NULL, NULL, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1439 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1440 if (xim == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1441 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1442 // Only give this message when verbose is set, because too many people |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1443 // got this message when they didn't want to use a XIM. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1444 if (p_verbose > 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1445 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1446 verbose_enter(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1447 emsg(_("E286: Failed to open input method")); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1448 verbose_leave(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1449 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1450 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1451 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1452 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1453 # ifdef USE_X11R6_XIM |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1454 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1455 XIMCallback destroy_cb; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1456 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1457 destroy_cb.callback = xim_destroy_cb; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1458 destroy_cb.client_data = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1459 if (XSetIMValues(xim, XNDestroyCallback, &destroy_cb, NULL)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1460 emsg(_("E287: Warning: Could not set destroy callback to IM")); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1461 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1462 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1463 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1464 if (XGetIMValues(xim, XNQueryInputStyle, &xim_styles, NULL) || !xim_styles) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1465 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1466 emsg(_("E288: input method doesn't support any style")); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1467 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1468 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1469 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1470 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1471 found = False; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1472 strcpy(tmp, gui.rsrc_preedit_type_name); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1473 for (s = tmp; s && !found; ) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1474 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1475 while (*s && isspace((unsigned char)*s)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1476 s++; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1477 if (!*s) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1478 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1479 if ((ns = end = strchr(s, ',')) != 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1480 ns++; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1481 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1482 end = s + strlen(s); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1483 while (isspace((unsigned char)*end)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1484 end--; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1485 *end = '\0'; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1486 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1487 if (!strcmp(s, "OverTheSpot")) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1488 this_input_style = (XIMPreeditPosition | XIMStatusArea); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1489 else if (!strcmp(s, "OffTheSpot")) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1490 this_input_style = (XIMPreeditArea | XIMStatusArea); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1491 else if (!strcmp(s, "Root")) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1492 this_input_style = (XIMPreeditNothing | XIMStatusNothing); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1493 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1494 for (i = 0; (unsigned short)i < xim_styles->count_styles; i++) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1495 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1496 if (this_input_style == xim_styles->supported_styles[i]) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1497 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1498 found = True; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1499 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1500 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1501 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1502 if (!found) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1503 for (i = 0; (unsigned short)i < xim_styles->count_styles; i++) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1504 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1505 if ((xim_styles->supported_styles[i] & this_input_style) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1506 == (this_input_style & ~XIMStatusArea)) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1507 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1508 this_input_style &= ~XIMStatusArea; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1509 found = True; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1510 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1511 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1512 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1513 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1514 s = ns; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1515 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1516 XFree(xim_styles); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1517 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1518 if (!found) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1519 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1520 // Only give this message when verbose is set, because too many people |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1521 // got this message when they didn't want to use a XIM. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1522 if (p_verbose > 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1523 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1524 verbose_enter(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1525 emsg(_("E289: input method doesn't support my preedit type")); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1526 verbose_leave(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1527 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1528 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1529 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1530 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1531 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1532 over_spot.x = TEXT_X(gui.col); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1533 over_spot.y = TEXT_Y(gui.row); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1534 input_style = this_input_style; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1535 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1536 // A crash was reported when trying to pass gui.norm_font as XNFontSet, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1537 // thus that has been removed. Hopefully the default works... |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1538 # ifdef FEAT_XFONTSET |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1539 if (gui.fontset != NOFONTSET) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1540 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1541 preedit_list = XVaCreateNestedList(0, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1542 XNSpotLocation, &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1543 XNForeground, (Pixel)gui.def_norm_pixel, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1544 XNBackground, (Pixel)gui.def_back_pixel, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1545 XNFontSet, (XFontSet)gui.fontset, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1546 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1547 status_list = XVaCreateNestedList(0, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1548 XNForeground, (Pixel)gui.def_norm_pixel, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1549 XNBackground, (Pixel)gui.def_back_pixel, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1550 XNFontSet, (XFontSet)gui.fontset, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1551 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1552 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1553 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1554 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1555 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1556 preedit_list = XVaCreateNestedList(0, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1557 XNSpotLocation, &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1558 XNForeground, (Pixel)gui.def_norm_pixel, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1559 XNBackground, (Pixel)gui.def_back_pixel, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1560 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1561 status_list = XVaCreateNestedList(0, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1562 XNForeground, (Pixel)gui.def_norm_pixel, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1563 XNBackground, (Pixel)gui.def_back_pixel, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1564 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1565 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1566 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1567 xic = XCreateIC(xim, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1568 XNInputStyle, input_style, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1569 XNClientWindow, x11_window, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1570 XNFocusWindow, gui.wid, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1571 XNPreeditAttributes, preedit_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1572 XNStatusAttributes, status_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1573 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1574 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1575 XFree(preedit_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1576 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1577 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1578 if (input_style & XIMStatusArea) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1579 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1580 xim_set_status_area(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1581 status_area_enabled = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1582 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1583 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1584 gui_set_shellsize(FALSE, FALSE, RESIZE_BOTH); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1585 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1586 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1587 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1588 if (!is_not_a_term()) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1589 emsg(_(e_xim)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1590 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1591 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1592 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1593 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1594 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1595 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1596 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1597 # endif // FEAT_GUI_X11 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1598 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1599 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1600 * Get IM status. When IM is on, return TRUE. Else return FALSE. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1601 * FIXME: This doesn't work correctly: Having focus doesn't always mean XIM is |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1602 * active, when not having focus XIM may still be active (e.g., when using a |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1603 * tear-off menu item). |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1604 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1605 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1606 im_get_status(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1607 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1608 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1609 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1610 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1611 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1612 return xim_has_focus; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1613 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1614 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1615 # endif // !FEAT_GUI_GTK |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1616 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1617 # if !defined(FEAT_GUI_GTK) || defined(PROTO) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1618 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1619 * Set up the status area. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1620 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1621 * This should use a separate Widget, but that seems not possible, because |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1622 * preedit_area and status_area should be set to the same window as for the |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1623 * text input. Unfortunately this means the status area pollutes the text |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1624 * window... |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1625 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1626 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1627 xim_set_status_area(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1628 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1629 XVaNestedList preedit_list = 0, status_list = 0, list = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1630 XRectangle pre_area, status_area; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1631 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1632 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1633 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1634 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1635 if (input_style & XIMStatusArea) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1636 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1637 if (input_style & XIMPreeditArea) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1638 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1639 XRectangle *needed_rect; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1640 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1641 // to get status_area width |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1642 status_list = XVaCreateNestedList(0, XNAreaNeeded, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1643 &needed_rect, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1644 XGetICValues(xic, XNStatusAttributes, status_list, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1645 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1646 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1647 status_area.width = needed_rect->width; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1648 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1649 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1650 status_area.width = gui.char_width * Columns; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1651 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1652 status_area.x = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1653 status_area.y = gui.char_height * Rows + gui.border_offset; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1654 if (gui.which_scrollbars[SBAR_BOTTOM]) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1655 status_area.y += gui.scrollbar_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1656 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1657 if (gui.menu_is_active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1658 status_area.y += gui.menu_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1659 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1660 status_area.height = gui.char_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1661 status_list = XVaCreateNestedList(0, XNArea, &status_area, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1662 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1663 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1664 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1665 status_area.x = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1666 status_area.y = gui.char_height * Rows + gui.border_offset; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1667 if (gui.which_scrollbars[SBAR_BOTTOM]) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1668 status_area.y += gui.scrollbar_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1669 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1670 if (gui.menu_is_active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1671 status_area.y += gui.menu_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1672 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1673 status_area.width = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1674 status_area.height = gui.char_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1675 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1676 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1677 if (input_style & XIMPreeditArea) // off-the-spot |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1678 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1679 pre_area.x = status_area.x + status_area.width; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1680 pre_area.y = gui.char_height * Rows + gui.border_offset; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1681 pre_area.width = gui.char_width * Columns - pre_area.x; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1682 if (gui.which_scrollbars[SBAR_BOTTOM]) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1683 pre_area.y += gui.scrollbar_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1684 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1685 if (gui.menu_is_active) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1686 pre_area.y += gui.menu_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1687 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1688 pre_area.height = gui.char_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1689 preedit_list = XVaCreateNestedList(0, XNArea, &pre_area, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1690 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1691 else if (input_style & XIMPreeditPosition) // over-the-spot |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1692 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1693 pre_area.x = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1694 pre_area.y = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1695 pre_area.height = gui.char_height * Rows; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1696 pre_area.width = gui.char_width * Columns; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1697 preedit_list = XVaCreateNestedList(0, XNArea, &pre_area, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1698 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1699 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1700 if (preedit_list && status_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1701 list = XVaCreateNestedList(0, XNPreeditAttributes, preedit_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1702 XNStatusAttributes, status_list, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1703 else if (preedit_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1704 list = XVaCreateNestedList(0, XNPreeditAttributes, preedit_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1705 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1706 else if (status_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1707 list = XVaCreateNestedList(0, XNStatusAttributes, status_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1708 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1709 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1710 list = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1711 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1712 if (list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1713 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1714 XSetICValues(xic, XNVaNestedList, list, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1715 XFree(list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1716 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1717 if (status_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1718 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1719 if (preedit_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1720 XFree(preedit_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1721 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1722 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1723 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1724 xim_get_status_area_height(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1725 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1726 if (status_area_enabled) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1727 return gui.char_height; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1728 return 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1729 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1730 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1731 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1732 #else // !defined(FEAT_XIM) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1733 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1734 # if defined(IME_WITHOUT_XIM) || defined(VIMDLL) || defined(PROTO) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1735 static int im_was_set_active = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1736 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1737 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1738 # ifdef VIMDLL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1739 mbyte_im_get_status(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1740 # else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1741 im_get_status(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1742 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1743 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1744 # if defined(FEAT_EVAL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1745 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1746 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1747 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1748 return im_was_set_active; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1749 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1750 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1751 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1752 # ifdef VIMDLL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1753 mbyte_im_set_active(int active_arg) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1754 # else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1755 im_set_active(int active_arg) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1756 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1757 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1758 # if defined(FEAT_EVAL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1759 int active = !p_imdisable && active_arg; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1760 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1761 if (USE_IMACTIVATEFUNC && active != im_get_status()) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1762 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1763 call_imactivatefunc(active); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1764 im_was_set_active = active; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1765 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1766 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1767 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1768 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1769 # if defined(FEAT_GUI) && !defined(FEAT_GUI_HAIKU) && !defined(VIMDLL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1770 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1771 im_set_position(int row UNUSED, int col UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1772 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1773 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1774 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1775 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1776 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1777 #endif // FEAT_XIM |