Mercurial > vim
annotate src/gui_xim.c @ 26408:8f17f8f327f3 v8.2.3735
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Commit: https://github.com/vim/vim/commit/7645da568c5e3b4ee339a2e99c3b3af790619787
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Sat Dec 4 14:02:30 2021 +0000
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Problem: Cannot use a lambda for 'imactivatefunc'.
Solution: Add lambda support for 'imactivatefunc' and 'imstatusfunc'.
(Yegappan Lakshmanan, closes #9275)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 04 Dec 2021 15:15:03 +0100 |
parents | 038eb6d9003a |
children | 13ba00ef7687 |
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 |
25475
038eb6d9003a
patch 8.2.3274: macro for printf format check can be simplified
Bram Moolenaar <Bram@vim.org>
parents:
24162
diff
changeset
|
34 #if defined(XIM_DEBUG) && defined(FEAT_GUI_GTK) |
038eb6d9003a
patch 8.2.3274: macro for printf format check can be simplified
Bram Moolenaar <Bram@vim.org>
parents:
24162
diff
changeset
|
35 static void xim_log(char *s, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2); |
038eb6d9003a
patch 8.2.3274: macro for printf format check can be simplified
Bram Moolenaar <Bram@vim.org>
parents:
24162
diff
changeset
|
36 |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
37 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
38 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
|
39 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
40 va_list arglist; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
41 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
|
42 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
43 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
|
44 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
45 if (fd == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
46 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
47 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
|
48 if (fd == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
49 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
50 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
|
51 fd = (FILE *)-1; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
52 return; |
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 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
55 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
56 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
|
57 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
|
58 va_end(arglist); |
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 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
61 |
21112
2d3cd9acf853
patch 8.2.1107: 'imactivatefunc' and 'imstatusfunc' are not used in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20671
diff
changeset
|
62 #if defined(FEAT_GUI_MSWIN) |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
63 # 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
|
64 # 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
|
65 #else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
66 # 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
|
67 # 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
|
68 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
69 |
26408
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
70 #if (defined(FEAT_EVAL) && \ |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
71 (defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL))) || \ |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
72 defined(PROTO) |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
73 static callback_T imaf_cb; // 'imactivatefunc' callback function |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
74 static callback_T imsf_cb; // 'imstatusfunc' callback function |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
75 |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
76 int |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
77 set_imactivatefunc_option(void) |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
78 { |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
79 return option_set_callback_func(p_imaf, &imaf_cb); |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
80 } |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
81 |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
82 int |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
83 set_imstatusfunc_option(void) |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
84 { |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
85 return option_set_callback_func(p_imsf, &imsf_cb); |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
86 } |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
87 |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
88 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
89 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
|
90 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
91 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
|
92 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
93 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
|
94 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
|
95 argv[1].v_type = VAR_UNKNOWN; |
26408
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
96 (void)call_callback_retnr(&imaf_cb, 1, argv); |
20637
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
99 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
100 call_imstatusfunc(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
101 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
102 int is_active; |
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 // 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
|
105 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
|
106 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
107 // 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
|
108 // 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
|
109 ++msg_silent; |
26408
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
110 is_active = call_callback_retnr(&imsf_cb, 0, NULL); |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
111 --msg_silent; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
112 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
|
113 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
114 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
115 |
26408
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
116 #if defined(EXITFREE) || defined(PROTO) |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
117 void |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
118 free_xim_stuff(void) |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
119 { |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
120 #if defined(FEAT_EVAL) && \ |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
121 (defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL)) |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
122 free_callback(&imaf_cb); |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
123 free_callback(&imsf_cb); |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
124 # endif |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
125 } |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
126 #endif |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
127 |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
128 |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
129 #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
|
130 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
131 # 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
|
132 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
|
133 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
134 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
135 * 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
|
136 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
137 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
138 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
|
139 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
140 if (State & CMDLINE) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
141 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
|
142 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
|
143 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
|
144 // 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
|
145 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
|
146 } |
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 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
|
149 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
|
150 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
|
151 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
|
152 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
153 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
|
154 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
|
155 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
|
156 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
157 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
|
158 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
|
159 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
160 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
|
161 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
162 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
163 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
|
164 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
165 int was_active; |
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 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
|
168 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
|
169 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
170 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
|
171 xim_reset(); |
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 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
175 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
|
176 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
177 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
178 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
179 if (focus) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
180 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
|
181 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
182 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
|
183 } |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
186 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
187 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
|
188 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
189 if (xic != 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 GdkRectangle area; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
192 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
193 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
|
194 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
|
195 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
|
196 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
|
197 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
198 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
|
199 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
200 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
|
201 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
|
202 } |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
205 # 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
|
206 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
207 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
|
208 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
209 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
|
210 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
211 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
212 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
213 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
214 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
|
215 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
216 // 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
|
217 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
|
218 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
219 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
|
220 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
|
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 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
|
224 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
225 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
|
226 vim_free(str); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
227 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
228 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
|
229 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
|
230 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
231 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
232 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
233 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
|
234 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
235 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
|
236 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
|
237 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
238 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
|
239 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
240 |
24162
cb8b9bf76082
patch 8.2.2622: GTK: error when starting up and -geometry is given
Bram Moolenaar <Bram@vim.org>
parents:
21112
diff
changeset
|
241 gui_gtk_get_screen_geom_of_win(gui.drawarea, 0, 0, |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
242 &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
|
243 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
|
244 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
|
245 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
|
246 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
|
247 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
|
248 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
|
249 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
|
250 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
|
251 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
|
252 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
253 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
254 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
255 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
|
256 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
257 char *preedit_string; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
258 #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
|
259 char buf[8]; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
260 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
261 PangoAttrList *attr_list; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
262 PangoLayout *layout; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
263 #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
|
264 # 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
|
265 GdkRGBA color; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
266 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
267 #else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
268 GdkColor color; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
269 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
270 gint w, h; |
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 (preedit_window == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
273 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
274 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
|
275 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
|
276 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
|
277 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
|
278 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
|
279 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
|
280 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
281 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
282 #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
|
283 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
284 GtkStyleContext * const context |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
285 = 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
|
286 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
|
287 gchar *css = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
288 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
|
289 = 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
|
290 gint fontsize |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
291 = 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
|
292 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
|
293 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
294 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
|
295 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
296 // 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
|
297 // 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
|
298 GdkScreen * const screen |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
299 = 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
|
300 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
|
301 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
|
302 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
303 if (fontsize > 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
304 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
|
305 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
306 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
|
307 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
308 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
|
309 "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
|
310 " 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
|
311 " 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
|
312 " 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
|
313 " 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
|
314 "}\n", |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
315 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
|
316 fontsize_propval, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
317 (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
|
318 (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
|
319 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
|
320 (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
|
321 (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
|
322 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
|
323 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
324 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
|
325 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
|
326 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
|
327 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
328 g_free(css); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
329 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
|
330 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
|
331 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
332 #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
|
333 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
|
334 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
339 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
|
340 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
|
341 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
|
342 &color); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
343 #else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
344 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
|
345 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
346 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
|
347 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
|
348 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
|
349 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
350 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
|
351 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
|
352 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
|
353 #endif |
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 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
|
356 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
357 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
|
358 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
359 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
|
360 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
|
361 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
362 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
|
363 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
|
364 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
|
365 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
|
366 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
367 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
|
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_set_position(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
370 } |
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 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
|
373 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
|
374 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
375 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
376 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
377 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
|
378 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
379 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
|
380 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
|
381 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
382 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
383 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
384 im_show_preedit() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
385 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
386 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
|
387 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
388 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
|
389 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
|
390 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
391 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
392 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
393 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
|
394 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
395 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
|
396 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
|
397 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
398 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
|
399 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
400 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
|
401 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
402 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
403 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
404 if (State & NORMAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
405 #ifdef FEAT_TERMINAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
406 && !term_use_loop() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
407 #endif |
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 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
410 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
|
411 return; |
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 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
|
414 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
|
415 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
416 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
|
417 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
|
418 } |
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 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
421 * 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
|
422 * 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
|
423 * 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
|
424 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
425 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
426 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
|
427 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
428 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
|
429 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
430 if (State & NORMAL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
431 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
432 # ifdef FEAT_RIGHTLEFT |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
433 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
|
434 backkey[2] = 'r'; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
435 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
436 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
|
437 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
|
438 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
439 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
440 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
|
441 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
|
442 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
443 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
444 * 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
|
445 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
446 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
447 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
|
448 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
449 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
|
450 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
451 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
|
452 vgetc_busy = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
453 showmode(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
454 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
|
455 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
|
456 setcursor(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
457 out_flush(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
458 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
459 |
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 * 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
|
462 * 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
|
463 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
464 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
465 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
|
466 const gchar *str, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
467 gpointer data UNUSED) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
468 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
469 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
|
470 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
|
471 int clen; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
472 int len = slen; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
473 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
|
474 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
|
475 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
476 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
477 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
|
478 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
479 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
480 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
|
481 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
482 // 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
|
483 // 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
|
484 im_delete_preedit(); |
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 // 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
|
487 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
|
488 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
489 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
|
490 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
|
491 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
492 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
493 // 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
|
494 // "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
|
495 // 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
|
496 // "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
|
497 // 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
|
498 // 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
|
499 // 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
|
500 // 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
|
501 // string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
502 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
|
503 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
504 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
|
505 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
|
506 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
507 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
508 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
|
509 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
510 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
|
511 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
512 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
|
513 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
|
514 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
|
515 } |
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 // 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
|
518 // 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
|
519 // 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
|
520 // mappings as <kSomething>. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
521 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
|
522 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
523 // 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
|
524 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
|
525 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
526 // 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
|
527 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
|
528 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
|
529 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
530 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
531 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
532 // Not a match |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
533 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
|
534 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
535 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
536 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
537 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
|
538 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
|
539 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
540 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
|
541 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
542 // 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
|
543 // 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
|
544 // marked as changed. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
545 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
|
546 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
|
547 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
548 // 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
|
549 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
|
550 } |
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 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
|
553 gtk_main_quit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
554 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
555 |
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 * 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
|
558 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
559 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
560 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
|
561 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
562 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
563 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
|
564 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
565 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
566 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
|
567 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
|
568 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
|
569 im_show_info(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
570 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
571 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
572 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
573 * 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
|
574 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
575 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
576 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
|
577 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
578 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
579 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
|
580 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
581 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
582 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
583 // 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
|
584 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
|
585 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
|
586 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
|
587 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
588 #if 0 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
589 // 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
|
590 // 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
|
591 // SungHyun Nam). |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
592 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
|
593 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
594 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
|
595 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
|
596 im_show_info(); |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
599 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
600 * 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
|
601 * 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
|
602 * 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
|
603 * 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
|
604 * 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
|
605 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
606 * 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
|
607 * several fundamental problems: |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
608 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
609 * - 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
|
610 * 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
|
611 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
612 * - 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
|
613 * 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
|
614 * 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
|
615 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
616 * - 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
|
617 * 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
|
618 * "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
|
619 * 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
|
620 * for proper operation. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
621 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
622 * 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
|
623 * 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
|
624 * 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
|
625 * 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
|
626 * 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
|
627 * 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
|
628 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
629 * 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
|
630 * 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
|
631 * 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
|
632 * 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
|
633 * 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
|
634 * 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
|
635 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
636 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
637 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
|
638 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
639 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
|
640 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
|
641 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
|
642 char_u *str; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
643 char_u *p; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
644 int i; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
645 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
646 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
|
647 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
|
648 &preedit_string, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
649 &cursor_index); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
650 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
651 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
|
652 &preedit_string, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
653 NULL); |
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 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
656 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
|
657 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
658 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
659 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
|
660 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
661 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
|
662 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
663 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
|
664 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
665 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
|
666 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
667 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
668 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
669 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
670 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
|
671 im_show_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
672 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
673 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
674 else |
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 // 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
|
677 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
|
678 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
679 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
|
680 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
681 // 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
|
682 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
|
683 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
684 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
|
685 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
686 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
|
687 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
688 // 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
|
689 // 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
|
690 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
|
691 } |
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 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
694 |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
695 // Compute the end of the preediting area: "preedit_end_col". |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
696 // According to the documentation of |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
697 // gtk_im_context_get_preedit_string(), the cursor_pos output argument |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
698 // returns the offset in bytes. This is unfortunately not true -- real |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
699 // life shows the offset is in characters, and the GTK+ source code |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
700 // agrees with me. Will file a bug later. |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
701 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
|
702 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
|
703 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
|
704 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
|
705 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
706 int is_composing; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
707 |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
708 is_composing = ((*p & 0x80) != 0 |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
709 && utf_iscomposing(utf_ptr2char(p))); |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
710 // These offsets are used as counters when generating <BS> and |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
711 // <Del> to delete the preedit string. So don't count composing |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
712 // characters unless 'delcombine' is enabled. |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
713 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
|
714 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
715 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
|
716 ++im_preedit_cursor; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
717 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
718 ++im_preedit_trailing; |
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 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
|
721 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
722 // 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
|
723 // 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
|
724 ++num_move_back; |
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 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
|
727 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
|
728 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
729 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
730 if (p > str) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
731 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
732 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
|
733 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
|
734 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
735 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
736 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
737 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
|
738 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
739 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
|
740 gtk_main_quit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
741 } |
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 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
744 * 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
|
745 * 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
|
746 * 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
|
747 * 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
|
748 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
749 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
750 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
|
751 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
752 PangoAttribute *attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
753 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
|
754 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
755 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
|
756 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
|
757 != (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
|
758 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
|
759 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
760 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
|
761 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
|
762 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
|
763 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
764 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
|
765 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
|
766 != (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
|
767 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
|
768 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
769 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
|
770 if (attr != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
771 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
772 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
|
773 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
774 // 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
|
775 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
|
776 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
|
777 } |
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 return char_attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
780 } |
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 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
783 * 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
|
784 * 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
|
785 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
786 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
787 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
|
788 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
789 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
|
790 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
|
791 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
|
792 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
793 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
794 return char_attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
795 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
796 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
|
797 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
798 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
|
799 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
800 int idx; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
801 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
802 // 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
|
803 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
|
804 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
|
805 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
806 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
|
807 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
808 PangoAttrIterator *iter; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
809 int start, end; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
810 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
811 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
|
812 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
|
813 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
814 // 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
|
815 do |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
816 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
817 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
|
818 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
819 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
|
820 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
|
821 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
822 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
|
823 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
824 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
|
825 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
826 } |
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 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
|
829 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
|
830 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
|
831 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
832 return char_attr; |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
835 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
836 xim_init(void) |
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 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
839 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
|
840 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
841 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
842 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
|
843 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
|
844 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
845 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
|
846 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
|
847 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
848 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
|
849 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
|
850 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
|
851 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
|
852 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
|
853 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
|
854 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
|
855 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
|
856 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
857 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
|
858 } |
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 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
861 im_shutdown(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
862 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
863 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
864 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
|
865 #endif |
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 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
868 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
869 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
|
870 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
|
871 xic = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
872 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
873 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
|
874 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
|
875 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
|
876 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
|
877 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
|
878 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
879 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
880 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
881 * 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
|
882 * 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
|
883 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
884 * 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
|
885 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
886 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
887 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
|
888 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
889 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
|
890 unsigned tmp_keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
891 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
|
892 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
893 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
|
894 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
|
895 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
896 // Parse modifier keys |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
897 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
|
898 switch (*str++) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
899 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
900 case '-': break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
901 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
|
902 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
|
903 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
|
904 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
|
905 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
|
906 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
|
907 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
|
908 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
|
909 default: |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
910 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
911 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
912 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
913 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
|
914 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
915 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
|
916 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
917 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
918 if (keyval != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
919 *keyval = tmp_keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
920 if (state != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
921 *state = tmp_state; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
922 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
923 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
924 } |
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 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
927 * 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
|
928 * 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
|
929 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
930 * 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
|
931 * 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
|
932 * '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
|
933 * 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
|
934 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
935 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
936 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
|
937 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
938 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
|
939 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
940 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
|
941 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
|
942 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
943 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
944 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
945 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
|
946 &im_activatekey_keyval, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
947 &im_activatekey_state); |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
950 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
951 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
|
952 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
953 GdkEventKey *event; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
954 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
955 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
|
956 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
|
957 // 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
|
958 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
|
959 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
|
960 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
|
961 event->state = state; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
962 event->keyval = keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
963 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
|
964 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
|
965 event->length = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
966 event->string = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
967 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
968 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
|
969 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
970 // 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
|
971 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
|
972 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
|
973 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
|
974 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
975 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
|
976 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
977 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
978 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
979 xim_reset(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
980 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
981 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
982 if (USE_IMACTIVATEFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
983 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
|
984 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
985 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
986 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
987 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
988 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
|
989 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
990 if (p_imdisable) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
991 im_shutdown(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
992 else |
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 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
|
995 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
996 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
|
997 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
998 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
|
999 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1000 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
|
1001 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
|
1002 im_activatekey_state); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1003 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
|
1004 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1005 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1006 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1007 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1008 im_shutdown(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1009 xim_init(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1010 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
|
1011 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1012 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1013 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1014 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1015 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
|
1016 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
|
1017 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
|
1018 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1019 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1020 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1021 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
|
1022 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1023 if (down) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1024 { |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1025 // Workaround GTK2 XIM 'feature' that always converts keypad keys to |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1026 // chars., even when not part of an IM sequence (ref. feature of |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1027 // gdk/gdkkeyuni.c). |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1028 // Flag any keypad keys that might represent a single char. |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1029 // If this (on its own - i.e., not part of an IM sequence) is |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1030 // committed while we're processing one of these keys, we can ignore |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1031 // that commit and go ahead & process it ourselves. That way we can |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1032 // still distinguish keypad keys for use in mappings. |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1033 // Also add GDK_space to make <S-Space> work. |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1034 switch (event->keyval) |
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 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
|
1037 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
|
1038 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
|
1039 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
|
1040 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
|
1041 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
|
1042 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
|
1043 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
|
1044 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
|
1045 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
|
1046 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
|
1047 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
|
1048 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
|
1049 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
|
1050 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
|
1051 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
|
1052 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
|
1053 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
|
1054 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1055 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
|
1056 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1057 |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1058 // When typing fFtT, XIM may be activated. Thus it must pass |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1059 // gtk_im_context_filter_keypress() in Normal mode. |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1060 // And while doing :sh too. |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1061 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
|
1062 && (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
|
1063 { |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1064 // Filter 'imactivatekey' and map it to CTRL-^. This way, Vim is |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1065 // always aware of the current status of IM, and can even emulate |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1066 // the activation key for modules that don't support one. |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1067 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
|
1068 && (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
|
1069 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1070 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
|
1071 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1072 // 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
|
1073 // 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
|
1074 // 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
|
1075 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
|
1076 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
|
1077 | (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
|
1078 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1079 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
|
1080 return FALSE; |
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 // 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
|
1083 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
|
1084 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1085 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1086 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
|
1087 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1088 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
|
1089 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1090 // ":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
|
1091 State ^= LANGMAP; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1092 if (State & LANGMAP) |
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 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
|
1095 State &= ~LANGMAP; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1096 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1097 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1098 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1099 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
|
1100 State |= LANGMAP; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1101 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1102 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1103 } |
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 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
|
1106 } |
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 // 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
|
1109 // 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
|
1110 // 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
|
1111 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
|
1112 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1113 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
|
1114 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1115 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
|
1116 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1117 // 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
|
1118 // 1. preedited string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1119 // 2. committed string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1120 // 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
|
1121 // 4. preedited string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1122 // 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
|
1123 // 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
|
1124 // 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
|
1125 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
|
1126 && 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
|
1127 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1128 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
|
1129 return FALSE; |
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 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1132 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1133 // 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
|
1134 // 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
|
1135 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
|
1136 // 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
|
1137 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1138 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1139 // 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
|
1140 // 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
|
1141 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
|
1142 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1143 // Normal processing |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1144 return imresult; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1145 } |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1148 return FALSE; |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1151 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1152 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
|
1153 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1154 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1155 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1156 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1157 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1158 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
|
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 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1162 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
|
1163 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1164 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
|
1165 } |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1168 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
|
1169 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1170 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
|
1171 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1172 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1173 # 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
|
1174 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1175 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
|
1176 // mode |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1177 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
|
1178 # 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
|
1179 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
|
1180 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
|
1181 # endif |
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 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1184 * 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
|
1185 * 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
|
1186 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1187 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1188 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
|
1189 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1190 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
|
1191 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1192 // 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
|
1193 if (p_imdisable) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1194 active = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1195 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
|
1196 // 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
|
1197 // 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
|
1198 // 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
|
1199 active = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1200 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1201 # 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
|
1202 if (USE_IMACTIVATEFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1203 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1204 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
|
1205 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1206 call_imactivatefunc(active); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1207 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
|
1208 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1209 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1210 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1211 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1212 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1213 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1214 return; |
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 // 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
|
1217 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
|
1218 xim_set_preedit(); |
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 |
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 * 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
|
1223 * "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
|
1224 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1225 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1226 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
|
1227 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1228 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1229 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1230 |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1231 // XIM only gets focus when the Vim window has keyboard focus and XIM has |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1232 // been set active for the current mode. |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1233 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
|
1234 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1235 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
|
1236 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1237 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
|
1238 XSetICFocus(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1239 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1240 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1241 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1242 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1243 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
|
1244 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1245 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
|
1246 XUnsetICFocus(xic); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1247 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1248 } |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1251 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1252 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
|
1253 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1254 xim_set_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1255 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1256 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1257 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1258 * 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
|
1259 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1260 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1261 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
|
1262 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1263 XVaNestedList attr_list; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1264 XRectangle spot_area; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1265 XPoint over_spot; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1266 int line_space; |
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 (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1269 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1270 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1271 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
|
1272 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1273 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
|
1274 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1275 // hide XIM cursor |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1276 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
|
1277 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
|
1278 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
|
1279 XNSpotLocation, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1280 &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1281 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1282 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
|
1283 XFree(attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1284 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1285 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1286 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1287 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
|
1288 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1289 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
|
1290 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1291 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
|
1292 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
|
1293 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1294 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
|
1295 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
|
1296 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
|
1297 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
|
1298 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
|
1299 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
|
1300 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
|
1301 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
|
1302 XNSpotLocation, &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1303 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
|
1304 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
|
1305 XNArea, &spot_area, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1306 XNLineSpace, line_space, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1307 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1308 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
|
1309 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
|
1310 XFree(attr_list); |
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 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1313 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1314 # 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
|
1315 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
|
1316 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1317 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1318 # 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
|
1319 # 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
|
1320 # 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
|
1321 # endif |
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 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
|
1324 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1325 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1326 # 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
|
1327 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1328 xim_instantiate_cb( |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1329 Display *display, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1330 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
|
1331 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
|
1332 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1333 Window x11_window; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1334 Display *x11_display; |
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 # ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1337 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
|
1338 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1339 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1340 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
|
1341 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
|
1342 return; |
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 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
|
1345 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
|
1346 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1347 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
|
1348 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
|
1349 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1350 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1351 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1352 xim_destroy_cb( |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1353 XIM im UNUSED, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1354 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
|
1355 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
|
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_destroy_cb()\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 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
|
1364 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1365 xic = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1366 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
|
1367 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1368 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
|
1369 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1370 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
|
1371 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
|
1372 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1373 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1374 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1375 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1376 xim_init(void) |
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 Window x11_window; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1379 Display *x11_display; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1380 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1381 # ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1382 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
|
1383 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1384 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1385 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
|
1386 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1387 xic = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1388 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1389 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
|
1390 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1391 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1392 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
|
1393 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1394 # 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
|
1395 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
|
1396 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
|
1397 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1398 } |
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 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1401 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
|
1402 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1403 int i; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1404 char *p, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1405 *s, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1406 *ns, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1407 *end, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1408 tmp[1024]; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1409 # 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
|
1410 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
|
1411 XIM xim = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1412 XIMStyles *xim_styles; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1413 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
|
1414 Boolean found; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1415 XPoint over_spot; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1416 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
|
1417 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1418 input_style = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1419 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
|
1420 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1421 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1422 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1423 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1424 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
|
1425 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1426 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
|
1427 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
|
1428 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1429 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
|
1430 if (*s == NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1431 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1432 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
|
1433 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
|
1434 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
|
1435 end--; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1436 *end = NUL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1437 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1438 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
|
1439 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1440 strcpy(buf, "@im="); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1441 strcat(buf, s); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1442 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
|
1443 && (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
|
1444 != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1445 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1446 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1447 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1448 s = ns + 1; |
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 } |
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 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
|
1453 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
|
1454 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1455 // 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
|
1456 // 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
|
1457 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
|
1458 && *p != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1459 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
|
1460 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1461 if (xim == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1462 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1463 // 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
|
1464 // 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
|
1465 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
|
1466 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1467 verbose_enter(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1468 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
|
1469 verbose_leave(); |
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 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1472 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1473 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1474 # 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
|
1475 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1476 XIMCallback destroy_cb; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1477 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1478 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
|
1479 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
|
1480 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
|
1481 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
|
1482 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1483 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1484 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1485 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
|
1486 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1487 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
|
1488 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1489 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1490 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1491 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1492 found = False; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1493 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
|
1494 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
|
1495 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1496 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
|
1497 s++; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1498 if (!*s) |
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 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
|
1501 ns++; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1502 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1503 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
|
1504 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
|
1505 end--; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1506 *end = '\0'; |
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 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
|
1509 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
|
1510 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
|
1511 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
|
1512 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
|
1513 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
|
1514 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1515 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
|
1516 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1517 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
|
1518 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1519 found = True; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1520 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1521 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1522 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1523 if (!found) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1524 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
|
1525 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1526 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
|
1527 == (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
|
1528 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1529 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
|
1530 found = True; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1531 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1532 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1533 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1534 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1535 s = ns; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1536 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1537 XFree(xim_styles); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1538 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1539 if (!found) |
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 // 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
|
1542 // 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
|
1543 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
|
1544 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1545 verbose_enter(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1546 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
|
1547 verbose_leave(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1548 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1549 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1550 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1551 } |
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 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
|
1554 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
|
1555 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
|
1556 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1557 // 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
|
1558 // 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
|
1559 # ifdef FEAT_XFONTSET |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1560 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
|
1561 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1562 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
|
1563 XNSpotLocation, &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1564 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
|
1565 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
|
1566 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
|
1567 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1568 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
|
1569 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
|
1570 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
|
1571 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
|
1572 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1573 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1574 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1575 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1576 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1577 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
|
1578 XNSpotLocation, &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1579 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
|
1580 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
|
1581 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1582 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
|
1583 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
|
1584 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
|
1585 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1586 } |
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 xic = XCreateIC(xim, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1589 XNInputStyle, input_style, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1590 XNClientWindow, x11_window, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1591 XNFocusWindow, gui.wid, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1592 XNPreeditAttributes, preedit_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1593 XNStatusAttributes, status_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1594 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1595 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1596 XFree(preedit_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1597 if (xic != NULL) |
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 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
|
1600 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1601 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
|
1602 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
|
1603 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1604 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1605 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
|
1606 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1607 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1608 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1609 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
|
1610 emsg(_(e_xim)); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1611 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1612 return FALSE; |
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 return TRUE; |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1618 # 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
|
1619 |
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 * 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
|
1622 * 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
|
1623 * 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
|
1624 * 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
|
1625 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1626 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1627 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
|
1628 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1629 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1630 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1631 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1632 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1633 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
|
1634 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1635 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1636 # 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
|
1637 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1638 # 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
|
1639 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1640 * 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
|
1641 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1642 * 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
|
1643 * 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
|
1644 * 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
|
1645 * window... |
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 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1648 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
|
1649 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1650 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
|
1651 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
|
1652 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1653 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1654 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1655 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1656 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
|
1657 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1658 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
|
1659 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1660 XRectangle *needed_rect; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1661 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1662 // 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
|
1663 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
|
1664 &needed_rect, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1665 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
|
1666 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1667 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1668 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
|
1669 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1670 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1671 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
|
1672 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1673 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
|
1674 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
|
1675 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
|
1676 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
|
1677 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1678 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
|
1679 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
|
1680 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1681 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
|
1682 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
|
1683 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1684 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1685 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1686 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
|
1687 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
|
1688 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
|
1689 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
|
1690 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1691 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
|
1692 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
|
1693 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1694 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
|
1695 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
|
1696 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1697 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1698 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
|
1699 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1700 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
|
1701 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
|
1702 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
|
1703 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
|
1704 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
|
1705 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1706 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
|
1707 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
|
1708 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1709 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
|
1710 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
|
1711 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1712 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
|
1713 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1714 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
|
1715 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
|
1716 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
|
1717 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
|
1718 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
|
1719 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1720 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1721 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
|
1722 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
|
1723 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
|
1724 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
|
1725 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
|
1726 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1727 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
|
1728 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
|
1729 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1730 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1731 list = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1732 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1733 if (list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1734 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1735 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
|
1736 XFree(list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1737 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1738 if (status_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1739 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1740 if (preedit_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1741 XFree(preedit_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1742 } |
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 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1745 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
|
1746 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1747 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
|
1748 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
|
1749 return 0; |
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 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1752 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1753 #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
|
1754 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1755 # 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
|
1756 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
|
1757 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1758 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1759 # ifdef VIMDLL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1760 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
|
1761 # else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1762 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
|
1763 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1764 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1765 # 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
|
1766 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1767 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1768 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1769 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
|
1770 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1771 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1772 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1773 # ifdef VIMDLL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1774 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
|
1775 # else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1776 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
|
1777 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1778 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1779 # 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
|
1780 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
|
1781 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1782 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
|
1783 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1784 call_imactivatefunc(active); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1785 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
|
1786 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1787 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1788 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1789 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1790 # 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
|
1791 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1792 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
|
1793 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1794 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1795 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1796 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1797 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1798 #endif // FEAT_XIM |