annotate src/gui_xim.c @ 26518:13ba00ef7687 v8.2.3788

patch 8.2.3788: lambda for option that is a function may be freed Commit: https://github.com/vim/vim/commit/6ae8fae8696623b527c7fb22567f6a3705b2f0dd Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sun Dec 12 16:26:44 2021 +0000 patch 8.2.3788: lambda for option that is a function may be freed Problem: Lambda for option that is a function may be garbage collected. Solution: Set a reference in the funcref. (Yegappan Lakshmanan, closes #9330)
author Bram Moolenaar <Bram@vim.org>
date Sun, 12 Dec 2021 17:30:04 +0100
parents 8f17f8f327f3
children d02d40f0261c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 {
26518
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
120 # if defined(FEAT_EVAL) && \
26408
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
26518
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
128 /*
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
129 * Mark the global 'imactivatefunc' and 'imstatusfunc' callbacks with 'copyID'
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
130 * so that they are not garbage collected.
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
131 */
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
132 int
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
133 set_ref_in_im_funcs(int copyID UNUSED)
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
134 {
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
135 int abort = FALSE;
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
136
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
137 #if defined(FEAT_EVAL) && \
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
138 (defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL))
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
139 abort = set_ref_in_callback(&imaf_cb, copyID);
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
140 abort = abort || set_ref_in_callback(&imsf_cb, copyID);
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
141 #endif
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
142
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
143 return abort;
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
144 }
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
145
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
146
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
147 #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
148
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
149 # 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
150 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
151
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 * 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
154 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
155 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
156 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
157 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
158 if (State & CMDLINE)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
159 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
160 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
161 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
162 // 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
163 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
164 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
165
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
166 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
167 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
168 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
169 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
170
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
171 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
172 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
173 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
174
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
175 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
176 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
177
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
178 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
179
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 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
182 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183 int was_active;
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 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
186 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
187
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 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
189 xim_reset();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193 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
194 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
195 if (xic != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 if (focus)
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_focus_in(xic);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
199 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 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
201 }
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 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 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
206 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 if (xic != NULL)
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 GdkRectangle area;
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 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
212 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
213 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
214 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
215
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 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
217
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 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
219 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
220 }
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 # 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
224 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225 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
226 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
227 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
228 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
229 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
232 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
233 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
234 // 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
235 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
236 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
237 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
238 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
239 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
240
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
241 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
242
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243 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
244 vim_free(str);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
245
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
246 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
247 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
248 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
249
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
250 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
251 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
252 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
253 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
254 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
255
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
256 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
257 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
258
24162
cb8b9bf76082 patch 8.2.2622: GTK: error when starting up and -geometry is given
Bram Moolenaar <Bram@vim.org>
parents: 21112
diff changeset
259 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
260 &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
261 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
262 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
263 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
264 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
265 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
266 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
267 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
268 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
269 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
270 }
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 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
273 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
274 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
275 char *preedit_string;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
276 #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
277 char buf[8];
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
278 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
279 PangoAttrList *attr_list;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
280 PangoLayout *layout;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
281 #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
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 GdkRGBA color;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
284 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
285 #else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
286 GdkColor color;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
287 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
288 gint w, h;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
289
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
290 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
291 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
292 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
293 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
294 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
295 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
296 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
297 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
298 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
299
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300 #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
301 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
302 GtkStyleContext * const context
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
303 = 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
304 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
305 gchar *css = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
306 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
307 = 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
308 gint fontsize
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
309 = 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
310 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
311
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
312 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
313 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
314 // 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
315 // 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
316 GdkScreen * const screen
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
317 = 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
318 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
319 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
320 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
321 if (fontsize > 0)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
322 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
323 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
324 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
325
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
326 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
327 "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
328 " 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
329 " 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
330 " 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
331 " 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
332 "}\n",
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
333 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
334 fontsize_propval,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
335 (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
336 (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
337 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
338 (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
339 (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
340 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
341
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
342 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
343 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
344 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
345
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
346 g_free(css);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
347 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
348 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
349 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
350 #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
351 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
352
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
353 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
354 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
355 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
356
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
357 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
358 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
359 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
360 &color);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
361 #else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
362 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
363
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
364 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
365 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
366 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
367
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
368 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
369 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
370 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
371 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
373 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
374
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 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
376 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
377 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
378 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
379
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
380 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
381 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
382 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
383 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
384
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
385 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
386
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
387 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
388 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
389
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
390 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
391 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
392 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
395 im_preedit_window_close()
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
396 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397 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
398 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
399 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
401 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402 im_show_preedit()
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 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
405
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406 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
407 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
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 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
411 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
412 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
413 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
414 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
415
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
416 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
417 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418 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
419 return;
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422 if (State & NORMAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 #ifdef FEAT_TERMINAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
424 && !term_use_loop()
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 )
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 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
429 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
430 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 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
432 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
433
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
434 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
435 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
436 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
439 * 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
440 * 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
441 * 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
442 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
443 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444 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
445 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446 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
447
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448 if (State & NORMAL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 # ifdef FEAT_RIGHTLEFT
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451 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
452 backkey[2] = 'r';
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
454 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
455 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
456 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
457
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 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
459 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
460
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462 * 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
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_show_info(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
466 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
467 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
468
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 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
470 vgetc_busy = TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 showmode();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
472 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
473 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
474 setcursor();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475 out_flush();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
476 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
477
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
478 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
479 * 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
480 * 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
481 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 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
484 const gchar *str,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
485 gpointer data UNUSED)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487 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
488 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
489 int clen;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
490 int len = slen;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491 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
492 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
493
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 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
496 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
498 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
499 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
500 // 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
501 // 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
502 im_delete_preedit();
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 // 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
505 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
506 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
507 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
508 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
509 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
511 // 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
512 // "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
513 // 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
514 // "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
515 // 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
516 // 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
517 // 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
518 // 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
519 // string.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 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
521 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522 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
523 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
524 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
526 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
527
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 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
529
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530 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
531 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
532 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
533 }
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 // 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
536 // 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
537 // 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
538 // mappings as <kSomething>.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
539 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
540 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541 // 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
542 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
543 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544 // 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
545 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
546 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
547 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
548 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
549 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 // Not a match
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 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
552 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553 }
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 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
556 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
557
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
558 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
559 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
560 // 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
561 // 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
562 // marked as changed.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 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
564 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
565
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 // 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
567 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
568 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570 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
571 gtk_main_quit();
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
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 * 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
576 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
577 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 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
579 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
581 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
582 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584 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
585 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
586 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
587 im_show_info();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 * 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
592 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
593 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
594 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
595 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
596 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
597 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
598 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 im_delete_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
601 // 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
602 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
603 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
604 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
605
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 #if 0
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607 // 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
608 // 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
609 // SungHyun Nam).
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
610 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
611 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612 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
613 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
614 im_show_info();
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
617 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 * 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
619 * 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
620 * 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
621 * 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
622 * 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
623 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
624 * 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
625 * several fundamental problems:
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
627 * - 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
628 * 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
629 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630 * - 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
631 * 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
632 * 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
633 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
634 * - 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
635 * 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
636 * "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
637 * 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
638 * for proper operation.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
639 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 * 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
641 * 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
642 * 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
643 * 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
644 * 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
645 * 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
646 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 * 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
648 * 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
649 * 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
650 * 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
651 * 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
652 * 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
653 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
654 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 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
656 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657 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
658 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
659 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
660 char_u *str;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661 char_u *p;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662 int i;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 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
665 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
666 &preedit_string, NULL,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
667 &cursor_index);
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 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
670 &preedit_string, NULL,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 NULL);
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 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
674 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
675 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 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
678
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 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
680 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681 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
682 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 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
684 im_delete_preedit();
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 else
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 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
689 im_show_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
690 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 // 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
695 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
696 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
697 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
698
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 // 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
700 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
701 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 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
703 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704 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
705
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 // 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
707 // 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
708 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
709 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
710
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
711 im_delete_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
713 // 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
714 // According to the documentation of
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
715 // 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
716 // 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
717 // 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
718 // 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
719 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
720 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
721 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
722 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
723 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 int is_composing;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
726 is_composing = ((*p & 0x80) != 0
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
727 && utf_iscomposing(utf_ptr2char(p)));
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
728 // 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
729 // <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
730 // 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
731 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
732 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733 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
734 ++im_preedit_cursor;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 ++im_preedit_trailing;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
738 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
739 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 // 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
741 // 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
742 ++num_move_back;
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 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
745 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
746 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
747
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
748 if (p > str)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750 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
751 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
752 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
755 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
756
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
757 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
758 gtk_main_quit();
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762 * 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
763 * 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
764 * 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
765 * 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
766 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
767 static int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
768 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
769 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
770 PangoAttribute *attr;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
771 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
772
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
773 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
774 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
775 != (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
776 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
777
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778 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
779 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
780 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
781
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
782 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
783 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
784 != (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
785 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
786
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 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
788 if (attr != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 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
791
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 // 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
793 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
794 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
795 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 return char_attr;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 * 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
802 * 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
803 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 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
806 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 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
808 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
809 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
810
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 return char_attr;
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 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
815
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816 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
817 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 int idx;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
819
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820 // 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
821 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
822 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
823
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 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
825 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
826 PangoAttrIterator *iter;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 int start, end;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
828
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829 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
830 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
831
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 // 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
833 do
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 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
836
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 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
838 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
839 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 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
841
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
842 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
843 }
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 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
847 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
848 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
849
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
850 return char_attr;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
852
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854 xim_init(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 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
858 #endif
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 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
861 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
862
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
863 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
864 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
865
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
866 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
867 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
868 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
869 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
870 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
871 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
872 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
873 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
874
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 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
876 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 im_shutdown(void)
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 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 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
883 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 if (xic != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887 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
888 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
889 xic = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
890 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 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
892 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
893 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
894 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
895 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
896 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
897
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899 * 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
900 * 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
901 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 * 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
903 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 static int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905 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
906 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907 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
908 unsigned tmp_keyval;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909 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
910
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911 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
912 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
913
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
914 // Parse modifier keys
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 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
916 switch (*str++)
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 case '-': break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
919 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
920 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
921 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
922 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
923 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
924 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
925 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
926 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
927 default:
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
928 return FALSE;
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 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
932
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933 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
934 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
935
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 if (keyval != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937 *keyval = tmp_keyval;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
938 if (state != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 *state = tmp_state;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
940
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941 return TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
942 }
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 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
946 * 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
947 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 * 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
949 * 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
950 * '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
951 * 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
952 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 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
955 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 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
957 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958 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
959 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
960 return TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963 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
964 &im_activatekey_keyval,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 &im_activatekey_state);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
969 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
970 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971 GdkEventKey *event;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 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
974 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
975 // 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
976 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
977 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
978 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
979 event->state = state;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 event->keyval = keyval;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 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
982 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
983 event->length = 0;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 event->string = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 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
987
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 // 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
989 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
990 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
991 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
992
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 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
994 }
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 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997 xim_reset(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 # ifdef FEAT_EVAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 if (USE_IMACTIVATEFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1001 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
1002 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 if (xic != NULL)
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 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
1007
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 if (p_imdisable)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 im_shutdown();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 else
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 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
1013
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 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
1015 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 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
1017 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 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
1019 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
1020 im_activatekey_state);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 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
1022 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 im_shutdown();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 xim_init();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028 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
1029 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 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
1034 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
1035 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
1036 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 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
1040 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 if (down)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042 {
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1043 // 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
1044 // 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
1045 // gdk/gdkkeyuni.c).
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1046 // 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
1047 // 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
1048 // 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
1049 // 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
1050 // 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
1051 // 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
1052 switch (event->keyval)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 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
1055 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
1056 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
1057 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
1058 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
1059 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
1060 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
1061 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
1062 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
1063 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
1064 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
1065 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
1066 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
1067 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
1068 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
1069 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
1070 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
1071 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
1072 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1073 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
1074 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1075
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1076 // 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
1077 // 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
1078 // 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
1079 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
1080 && (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
1081 {
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1082 // 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
1083 // 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
1084 // 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
1085 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
1086 && (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
1087 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088 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
1089
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1090 // 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
1091 // 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
1092 // 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
1093 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
1094 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
1095 | (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
1096
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1097 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
1098 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100 // 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
1101 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
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 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
1105 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1106 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
1107
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108 // ":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
1109 State ^= LANGMAP;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1110 if (State & LANGMAP)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1111 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1112 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
1113 State &= ~LANGMAP;
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 else
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 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
1118 State |= LANGMAP;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1119 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1120 return TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1121 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1122
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1123 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
1124 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126 // 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
1127 // 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
1128 // 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
1129 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
1130 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1131 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
1132
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133 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
1134 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1135 // 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
1136 // 1. preedited string.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 // 2. committed string.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 // 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
1139 // 4. preedited string.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140 // 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
1141 // 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
1142 // 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
1143 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
1144 && 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
1145 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146 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
1147 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151 // 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
1152 // 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
1153 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
1154 // 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
1155 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1157 // 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
1158 // 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
1159 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
1160
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1161 // Normal processing
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1162 return imresult;
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 }
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 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1167 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1168
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1169 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1170 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
1171 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 # ifdef FEAT_EVAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1173 if (USE_IMSTATUSFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1174 return call_imstatusfunc();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 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
1177 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1178
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1179 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180 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
1181 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182 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
1183 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186 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
1187 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 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
1189 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191 # 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
1192
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 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
1194 // mode
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 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
1196 # 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
1197 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
1198 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
1199 # endif
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 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 * 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
1203 * 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
1204 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 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
1207 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 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
1209
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 // 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
1211 if (p_imdisable)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212 active = FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1213 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
1214 // 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
1215 // 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
1216 // 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
1217 active = TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 # 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
1220 if (USE_IMACTIVATEFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1222 if (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
1223 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1224 call_imactivatefunc(active);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1225 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
1226 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1227 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1228 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1229 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1230
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1233
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 // 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
1235 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
1236 xim_set_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1237 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1239 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1240 * 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
1241 * "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
1242 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1243 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244 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
1245 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1248
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1249 // 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
1250 // 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
1251 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
1252 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253 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
1254 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255 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
1256 XSetICFocus(xic);
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 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1259 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1260 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1261 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
1262 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1263 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
1264 XUnsetICFocus(xic);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1266 }
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1270 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
1271 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1272 xim_set_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1273 }
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 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1276 * 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
1277 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1278 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1279 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
1280 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 XVaNestedList attr_list;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282 XRectangle spot_area;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1283 XPoint over_spot;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284 int line_space;
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 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1287 return;
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 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
1290
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1291 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
1292 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1293 // hide XIM cursor
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 = 0;
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 = -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
1296 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
1297 XNSpotLocation,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1298 &over_spot,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1299 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1300 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
1301 XFree(attr_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1302 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1303 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1304
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1305 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
1306 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1307 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
1308 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 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
1310 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
1311 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1312 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
1313 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
1314 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
1315 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
1316 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
1317 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
1318 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
1319 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
1320 XNSpotLocation, &over_spot,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1321 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
1322 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
1323 XNArea, &spot_area,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1324 XNLineSpace, line_space,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1325 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1326 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
1327 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
1328 XFree(attr_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1330 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1331
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1332 # 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
1333 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
1334 # endif
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 # 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
1337 # 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
1338 # 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
1339 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1340
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1341 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
1342
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 # 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
1345 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1346 xim_instantiate_cb(
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1347 Display *display,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1348 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
1349 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
1350 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1351 Window x11_window;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1352 Display *x11_display;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1353
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1354 # ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1355 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
1356 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1357
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1358 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
1359 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
1360 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1361
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1362 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
1363 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
1364 if (xic != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1365 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
1366 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
1367 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1368
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1369 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1370 xim_destroy_cb(
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1371 XIM im UNUSED,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1372 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
1373 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
1374 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1375 Window x11_window;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1376 Display *x11_display;
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 # ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1379 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
1380 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1381 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
1382
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1383 xic = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1384 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
1385
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1386 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
1387
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1388 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
1389 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
1390 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1391 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1392
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1393 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1394 xim_init(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1395 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1396 Window x11_window;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1397 Display *x11_display;
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 # ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1400 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
1401 # endif
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 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
1404
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1405 xic = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1406
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1407 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
1408 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1409
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1410 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
1411
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1412 # 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
1413 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
1414 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
1415 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1416 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1417
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1418 static int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1419 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
1420 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1421 int i;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1422 char *p,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1423 *s,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1424 *ns,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1425 *end,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1426 tmp[1024];
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1427 # 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
1428 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
1429 XIM xim = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1430 XIMStyles *xim_styles;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1431 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
1432 Boolean found;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1433 XPoint over_spot;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1434 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
1435
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1436 input_style = 0;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1437 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
1438
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1439 if (xic != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1440 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1441
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1442 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
1443 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1444 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
1445 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
1446 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1447 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
1448 if (*s == NUL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1449 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1450 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
1451 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
1452 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
1453 end--;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1454 *end = NUL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1455
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1456 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
1457 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1458 strcpy(buf, "@im=");
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1459 strcat(buf, s);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1460 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
1461 && (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
1462 != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1463 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1464 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1465
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1466 s = ns + 1;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1467 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1468 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1469
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1470 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
1471 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
1472
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1473 // 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
1474 // 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
1475 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
1476 && *p != NUL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1477 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
1478
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1479 if (xim == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1480 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1481 // 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
1482 // 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
1483 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
1484 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1485 verbose_enter();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1486 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
1487 verbose_leave();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1488 }
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 # 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
1493 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1494 XIMCallback destroy_cb;
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 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
1497 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
1498 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
1499 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
1500 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1501 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1502
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1503 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
1504 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1505 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
1506 XCloseIM(xim);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1507 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1508 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1509
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1510 found = False;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1511 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
1512 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
1513 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1514 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
1515 s++;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1516 if (!*s)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1517 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1518 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
1519 ns++;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1520 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1521 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
1522 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
1523 end--;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1524 *end = '\0';
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 (!strcmp(s, "OverTheSpot"))
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 = (XIMPreeditPosition | XIMStatusArea);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1528 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
1529 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
1530 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
1531 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
1532
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1533 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
1534 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1535 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
1536 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1537 found = True;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1538 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1539 }
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 if (!found)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1542 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
1543 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1544 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
1545 == (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
1546 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1547 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
1548 found = True;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1549 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1550 }
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 s = ns;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1554 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1555 XFree(xim_styles);
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 if (!found)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1558 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1559 // 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
1560 // 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
1561 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
1562 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1563 verbose_enter();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1564 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
1565 verbose_leave();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1566 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1567 XCloseIM(xim);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1568 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1569 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1570
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1571 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
1572 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
1573 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
1574
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1575 // 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
1576 // 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
1577 # ifdef FEAT_XFONTSET
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1578 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
1579 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1580 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
1581 XNSpotLocation, &over_spot,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1582 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
1583 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
1584 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
1585 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1586 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
1587 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
1588 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
1589 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
1590 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1591 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1592 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1593 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1594 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1595 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
1596 XNSpotLocation, &over_spot,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1597 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
1598 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
1599 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1600 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
1601 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
1602 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
1603 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1604 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1605
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1606 xic = XCreateIC(xim,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1607 XNInputStyle, input_style,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1608 XNClientWindow, x11_window,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1609 XNFocusWindow, gui.wid,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1610 XNPreeditAttributes, preedit_list,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1611 XNStatusAttributes, status_list,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1612 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1613 XFree(status_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1614 XFree(preedit_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1615 if (xic != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1616 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1617 if (input_style & XIMStatusArea)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1618 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1619 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
1620 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
1621 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1622 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1623 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
1624 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1625 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1626 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1627 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
1628 emsg(_(e_xim));
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1629 XCloseIM(xim);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1630 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1631 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1632
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1633 return TRUE;
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_X11
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 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1639 * 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
1640 * 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
1641 * 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
1642 * 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
1643 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1644 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1645 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
1646 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1647 # ifdef FEAT_EVAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1648 if (USE_IMSTATUSFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1649 return call_imstatusfunc();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1650 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1651 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
1652 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1653
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1654 # 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
1655
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1656 # 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
1657 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1658 * 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
1659 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1660 * 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
1661 * 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
1662 * 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
1663 * window...
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1664 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1665 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1666 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
1667 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1668 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
1669 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
1670
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1671 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1672 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1673
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1674 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
1675 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1676 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
1677 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1678 XRectangle *needed_rect;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1679
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1680 // 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
1681 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
1682 &needed_rect, NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1683 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
1684 XFree(status_list);
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.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
1687 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1688 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1689 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
1690
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1691 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
1692 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
1693 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
1694 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
1695 #ifdef FEAT_MENU
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1696 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
1697 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
1698 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1699 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
1700 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
1701 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1702 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1703 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1704 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
1705 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
1706 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
1707 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
1708 #ifdef FEAT_MENU
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1709 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
1710 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
1711 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1712 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
1713 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
1714 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1715
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1716 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
1717 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1718 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
1719 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
1720 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
1721 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
1722 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
1723 #ifdef FEAT_MENU
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1724 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
1725 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
1726 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1727 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
1728 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
1729 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1730 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
1731 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1732 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
1733 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
1734 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
1735 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
1736 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
1737 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1738
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1739 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
1740 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
1741 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
1742 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
1743 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
1744 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1745 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
1746 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
1747 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1748 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1749 list = NULL;
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 if (list)
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 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
1754 XFree(list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1755 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1756 if (status_list)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1757 XFree(status_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1758 if (preedit_list)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1759 XFree(preedit_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1760 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1761
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1762 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1763 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
1764 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1765 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
1766 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
1767 return 0;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1768 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1769 # endif
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 #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
1772
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1773 # 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
1774 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
1775
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1776 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1777 # ifdef VIMDLL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1778 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
1779 # else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1780 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
1781 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1782 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1783 # 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
1784 if (USE_IMSTATUSFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1785 return call_imstatusfunc();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1786 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1787 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
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 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1791 # ifdef VIMDLL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1792 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
1793 # else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1794 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
1795 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1796 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1797 # 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
1798 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
1799
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1800 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
1801 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1802 call_imactivatefunc(active);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1803 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
1804 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1805 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1806 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1807
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1808 # 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
1809 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1810 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
1811 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1812 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1813 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1814 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1815
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1816 #endif // FEAT_XIM