Mercurial > vim
annotate src/gui_xim.c @ 31293:ff4473b3fc58 v9.0.0980
patch 9.0.0980: the keyboard state response may end up in a shell command
Commit: https://github.com/vim/vim/commit/733a69b29f0b0c3d2ddca463a41bdd912379bc5e
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Dec 1 12:03:47 2022 +0000
patch 9.0.0980: the keyboard state response may end up in a shell command
Problem: The keyboard state response may end up in a shell command.
Solution: Only request the keyboard protocol state when the typeahead is
empty, no more commands are following and not exiting. Add the
t_RK termcap entry for this.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 01 Dec 2022 13:15:03 +0100 |
parents | b1c66bff0a66 |
children | e5ee2ffd826a |
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]; |
28996
54247d52bee9
patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents:
28773
diff
changeset
|
92 int save_KeyTyped = KeyTyped; |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
93 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
94 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
|
95 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
|
96 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
|
97 (void)call_callback_retnr(&imaf_cb, 1, argv); |
28996
54247d52bee9
patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents:
28773
diff
changeset
|
98 |
54247d52bee9
patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents:
28773
diff
changeset
|
99 KeyTyped = save_KeyTyped; |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
100 } |
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 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
103 call_imstatusfunc(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
104 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
105 int is_active; |
28996
54247d52bee9
patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents:
28773
diff
changeset
|
106 int save_KeyTyped = KeyTyped; |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
107 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
108 // 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
|
109 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
|
110 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
111 // 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
|
112 // 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
|
113 ++msg_silent; |
26408
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
114 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
|
115 --msg_silent; |
28996
54247d52bee9
patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents:
28773
diff
changeset
|
116 |
54247d52bee9
patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents:
28773
diff
changeset
|
117 KeyTyped = save_KeyTyped; |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
118 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
|
119 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
120 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
121 |
26408
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
122 #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
|
123 void |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
124 free_xim_stuff(void) |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
125 { |
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
|
126 # 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
|
127 (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
|
128 free_callback(&imaf_cb); |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
129 free_callback(&imsf_cb); |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
130 # endif |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
131 } |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
132 #endif |
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
133 |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26897
diff
changeset
|
134 #if defined(FEAT_EVAL) || defined(PROTO) |
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
|
135 /* |
31201
b1c66bff0a66
patch 9.0.0934: various code formatting issues
Bram Moolenaar <Bram@vim.org>
parents:
29865
diff
changeset
|
136 * Mark the global 'imactivatefunc' and 'imstatusfunc' callbacks with "copyID" |
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
|
137 * 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
|
138 */ |
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 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
|
140 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
|
141 { |
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 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
|
143 |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26897
diff
changeset
|
144 # if defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL) |
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
|
145 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
|
146 abort = abort || set_ref_in_callback(&imsf_cb, copyID); |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26897
diff
changeset
|
147 # endif |
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
|
148 |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26408
diff
changeset
|
149 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
|
150 } |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26897
diff
changeset
|
151 #endif |
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
|
152 |
26408
8f17f8f327f3
patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents:
25475
diff
changeset
|
153 |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
154 #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
|
155 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
156 # if defined(FEAT_GUI_GTK) || defined(PROTO) |
29865
4291eb97e479
patch 9.0.0271: using INIT() in non-header files
Bram Moolenaar <Bram@vim.org>
parents:
28996
diff
changeset
|
157 static int xim_has_preediting = FALSE; // IM current status |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
158 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
159 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
160 * 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
|
161 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
162 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
163 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
|
164 { |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
165 if (State & MODE_CMDLINE) |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
166 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
|
167 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
|
168 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
|
169 // 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
|
170 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
|
171 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
172 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
173 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
|
174 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
|
175 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
|
176 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
|
177 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
178 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
|
179 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
|
180 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
|
181 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
182 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
|
183 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
|
184 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
185 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
|
186 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
187 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
188 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
|
189 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
190 int was_active; |
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 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
|
193 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
|
194 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
195 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
|
196 xim_reset(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
197 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
198 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
199 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
200 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
|
201 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
202 if (xic != NULL) |
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 if (focus) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
205 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
|
206 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
207 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
|
208 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
209 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
210 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
211 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
212 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
|
213 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
214 if (xic != NULL) |
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 GdkRectangle 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 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
|
219 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
|
220 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
|
221 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
|
222 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
223 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
|
224 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
225 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
|
226 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
|
227 } |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
230 # 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
|
231 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
232 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
|
233 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
234 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
|
235 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
236 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
237 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
238 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
239 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
|
240 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
241 // 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
|
242 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
|
243 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
244 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
|
245 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
|
246 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
247 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
248 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
|
249 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
250 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
|
251 vim_free(str); |
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 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
|
254 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
|
255 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
256 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
257 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
258 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
|
259 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
260 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
|
261 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
|
262 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
263 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
|
264 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
265 |
24162
cb8b9bf76082
patch 8.2.2622: GTK: error when starting up and -geometry is given
Bram Moolenaar <Bram@vim.org>
parents:
21112
diff
changeset
|
266 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
|
267 &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
|
268 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
|
269 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
|
270 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
|
271 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
|
272 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
|
273 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
|
274 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
|
275 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
|
276 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
|
277 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
278 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
279 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
280 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
|
281 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
282 char *preedit_string; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
283 #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
|
284 char buf[8]; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
285 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
286 PangoAttrList *attr_list; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
287 PangoLayout *layout; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
288 #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
|
289 # 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
|
290 GdkRGBA color; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
291 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
292 #else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
293 GdkColor color; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
294 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
295 gint w, h; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
296 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
297 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
|
298 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
299 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
|
300 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
|
301 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
|
302 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
|
303 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
|
304 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
|
305 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
306 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
307 #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
|
308 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
309 GtkStyleContext * const context |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
310 = 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
|
311 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
|
312 gchar *css = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
313 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
|
314 = 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
|
315 gint fontsize |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
316 = 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
|
317 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
|
318 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
319 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
|
320 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
321 // 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
|
322 // 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
|
323 GdkScreen * const screen |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
324 = 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
|
325 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
|
326 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
|
327 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
328 if (fontsize > 0) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
329 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
|
330 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
331 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
|
332 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
333 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
|
334 "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
|
335 " 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
|
336 " 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
|
337 " 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
|
338 " 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
|
339 "}\n", |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
340 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
|
341 fontsize_propval, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
342 (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
|
343 (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
|
344 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
|
345 (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
|
346 (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
|
347 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
|
348 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
349 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
|
350 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
|
351 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
|
352 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
353 g_free(css); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
354 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
|
355 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
|
356 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
357 #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
|
358 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
|
359 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
360 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
|
361 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
|
362 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
|
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", gui.back_pixel); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
365 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
|
366 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
|
367 &color); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
368 #else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
369 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
|
370 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
371 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
|
372 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
|
373 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
|
374 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
375 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
|
376 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
|
377 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
|
378 #endif |
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 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
|
381 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
382 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
|
383 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
384 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
|
385 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
|
386 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
387 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
|
388 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
|
389 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
|
390 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
|
391 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
392 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
|
393 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
394 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
|
395 } |
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 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
|
398 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
|
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_preedit_window_close() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
403 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
404 if (preedit_window != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
405 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
|
406 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
407 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
408 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
409 im_show_preedit() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
410 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
411 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
|
412 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
413 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
|
414 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
|
415 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
416 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
417 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
418 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
|
419 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
420 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
|
421 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
|
422 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
423 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
|
424 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
425 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
|
426 return; |
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 |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
429 if (State & MODE_NORMAL |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
430 #ifdef FEAT_TERMINAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
431 && !term_use_loop() |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
432 #endif |
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 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
435 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
|
436 return; |
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 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
|
439 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
|
440 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
441 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
|
442 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
|
443 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
444 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
445 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
446 * 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
|
447 * 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
|
448 * 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
|
449 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
450 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
451 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
|
452 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
453 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
|
454 |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
455 if (State & MODE_NORMAL) |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
456 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
457 # ifdef FEAT_RIGHTLEFT |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
458 if ((State & MODE_CMDLINE) == 0 && curwin != NULL && curwin->w_p_rl) |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
459 backkey[2] = 'r'; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
460 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
461 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
|
462 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
|
463 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
464 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
465 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
|
466 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
|
467 |
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 * 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
|
470 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
471 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
472 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
|
473 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
474 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
|
475 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
476 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
|
477 vgetc_busy = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
478 showmode(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
479 vgetc_busy = old_vgetc_busy; |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
480 if ((State & MODE_NORMAL) || (State & MODE_INSERT)) |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
481 setcursor(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
482 out_flush(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
483 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
484 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
485 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
486 * 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
|
487 * 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
|
488 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
489 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
490 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
|
491 const gchar *str, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
492 gpointer data UNUSED) |
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 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
|
495 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
|
496 int clen; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
497 int len = slen; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
498 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
|
499 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
|
500 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
501 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
502 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
|
503 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
504 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
505 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
|
506 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
507 // 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
|
508 // 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
|
509 im_delete_preedit(); |
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 // 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
|
512 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
|
513 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
514 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
|
515 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
|
516 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
517 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
518 // 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
|
519 // "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
|
520 // 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
|
521 // "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
|
522 // 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
|
523 // 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
|
524 // 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
|
525 // 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
|
526 // string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
527 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
|
528 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
529 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
|
530 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
|
531 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
532 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
533 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
|
534 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
535 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
|
536 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
537 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
|
538 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
|
539 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
|
540 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
541 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
542 // 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
|
543 // 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
|
544 // 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
|
545 // mappings as <kSomething>. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
546 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
|
547 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
548 // 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
|
549 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
|
550 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
551 // 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
|
552 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
|
553 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
|
554 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
555 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
556 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
557 // Not a match |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
558 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
|
559 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
560 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
561 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
562 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
|
563 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
|
564 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
565 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
|
566 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
567 // 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
|
568 // 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
|
569 // marked as changed. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
570 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
|
571 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
|
572 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
573 // 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
|
574 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
|
575 } |
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 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
|
578 gtk_main_quit(); |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
581 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
582 * 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
|
583 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
584 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
585 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
|
586 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
587 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
588 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
|
589 #endif |
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 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
|
592 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
|
593 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
|
594 im_show_info(); |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
597 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
598 * 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
|
599 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
600 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
601 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
|
602 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
603 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
604 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
|
605 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
606 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
607 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
608 // 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
|
609 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
|
610 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
|
611 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
|
612 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
613 #if 0 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
614 // 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
|
615 // 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
|
616 // SungHyun Nam). |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
617 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
|
618 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
619 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
|
620 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
|
621 im_show_info(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
622 } |
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 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
625 * 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
|
626 * 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
|
627 * 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
|
628 * 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
|
629 * 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
|
630 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
631 * 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
|
632 * several fundamental problems: |
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 * - 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
|
635 * 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
|
636 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
637 * - 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
|
638 * 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
|
639 * 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
|
640 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
641 * - 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
|
642 * 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
|
643 * "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
|
644 * 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
|
645 * for proper operation. |
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 * 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
|
648 * 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
|
649 * 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
|
650 * 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
|
651 * 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
|
652 * 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
|
653 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
654 * 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
|
655 * 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
|
656 * 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
|
657 * 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
|
658 * 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
|
659 * 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
|
660 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
661 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
662 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
|
663 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
664 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
|
665 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
|
666 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
|
667 char_u *str; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
668 char_u *p; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
669 int i; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
670 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
671 if (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
|
672 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
|
673 &preedit_string, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
674 &cursor_index); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
675 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
676 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
|
677 &preedit_string, NULL, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
678 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
679 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
680 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
681 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
|
682 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
683 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
684 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
|
685 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
686 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
|
687 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
688 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
|
689 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
690 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
|
691 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
692 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
693 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
694 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
695 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
|
696 im_show_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
697 } |
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 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
700 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
701 // If 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
|
702 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
|
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 = TRUE; |
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 // 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
|
707 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
|
708 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
709 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
|
710 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
711 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
|
712 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
713 // 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
|
714 // 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
|
715 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
|
716 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
717 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
718 im_delete_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
719 |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
720 // 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
|
721 // According to the documentation of |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
722 // 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
|
723 // 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
|
724 // 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
|
725 // 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
|
726 if (preedit_start_col != MAXCOL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
727 preedit_end_col = preedit_start_col; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
728 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
|
729 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
|
730 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
731 int is_composing; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
732 |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
733 is_composing = ((*p & 0x80) != 0 |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
734 && utf_iscomposing(utf_ptr2char(p))); |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
735 // 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
|
736 // <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
|
737 // 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
|
738 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
|
739 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
740 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
|
741 ++im_preedit_cursor; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
742 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
743 ++im_preedit_trailing; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
744 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
745 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
|
746 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
747 // 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
|
748 // 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
|
749 ++num_move_back; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
750 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
751 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
|
752 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
|
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 if (p > str) |
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 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
|
758 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
|
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 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
|
763 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
764 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
|
765 gtk_main_quit(); |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
768 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
769 * 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
|
770 * 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
|
771 * 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
|
772 * 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
|
773 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
774 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
775 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
|
776 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
777 PangoAttribute *attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
778 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
|
779 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
780 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
|
781 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
|
782 != (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
|
783 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
|
784 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
785 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
|
786 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
|
787 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
|
788 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
789 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
|
790 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
|
791 != (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
|
792 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
|
793 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
794 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
|
795 if (attr != NULL) |
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 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
|
798 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
799 // 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
|
800 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
|
801 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
|
802 } |
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 return char_attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
805 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
806 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
807 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
808 * 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
|
809 * 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
|
810 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
811 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
812 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
|
813 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
814 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
|
815 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
|
816 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
|
817 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
818 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
819 return char_attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
820 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
821 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
|
822 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
823 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
|
824 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
825 int idx; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
826 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
827 // 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
|
828 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
|
829 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
|
830 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
831 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
|
832 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
833 PangoAttrIterator *iter; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
834 int start, end; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
835 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
836 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
|
837 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
|
838 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
839 // 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
|
840 do |
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_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
|
843 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
844 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
|
845 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
|
846 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
847 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
|
848 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
849 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
|
850 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
851 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
852 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
853 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
|
854 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
|
855 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
|
856 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
857 return char_attr; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
858 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
859 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
860 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
861 xim_init(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
862 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
863 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
864 xim_log("xim_init()\n"); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
865 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
866 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
867 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
|
868 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
|
869 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
870 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
|
871 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
|
872 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
873 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
|
874 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
|
875 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
|
876 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
|
877 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
|
878 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
|
879 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
|
880 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
|
881 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
882 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
|
883 } |
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 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
886 im_shutdown(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
887 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
888 #ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
889 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
|
890 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
891 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
892 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
893 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
894 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
|
895 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
|
896 xic = NULL; |
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 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
|
899 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
|
900 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
|
901 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
|
902 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
|
903 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
904 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
905 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
906 * 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
|
907 * 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
|
908 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
909 * 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
|
910 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
911 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
912 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
|
913 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
914 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
|
915 unsigned tmp_keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
916 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
|
917 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
918 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
|
919 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
|
920 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
921 // Parse modifier keys |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
922 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
|
923 switch (*str++) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
924 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
925 case '-': break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
926 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
|
927 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
|
928 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
|
929 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
|
930 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
|
931 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
|
932 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
|
933 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
|
934 default: |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
935 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
936 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
937 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
938 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
|
939 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
940 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
|
941 return FALSE; |
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 if (keyval != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
944 *keyval = tmp_keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
945 if (state != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
946 *state = tmp_state; |
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 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
949 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
950 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
951 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
952 * 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
|
953 * 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
|
954 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
955 * 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
|
956 * 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
|
957 * '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
|
958 * 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
|
959 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
960 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
961 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
|
962 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
963 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
|
964 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
965 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
|
966 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
|
967 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
968 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
969 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
970 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
|
971 &im_activatekey_keyval, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
972 &im_activatekey_state); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
973 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
974 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
975 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
976 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
|
977 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
978 GdkEventKey *event; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
979 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
980 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
|
981 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
|
982 // 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
|
983 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
|
984 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
|
985 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
|
986 event->state = state; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
987 event->keyval = keyval; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
988 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
|
989 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
|
990 event->length = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
991 event->string = NULL; |
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 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
|
994 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
995 // 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
|
996 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
|
997 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
|
998 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
|
999 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1000 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
|
1001 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1002 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1003 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1004 xim_reset(void) |
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 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1007 if (USE_IMACTIVATEFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1008 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
|
1009 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1010 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1011 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1012 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1013 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
|
1014 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1015 if (p_imdisable) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1016 im_shutdown(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1017 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1018 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1019 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
|
1020 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1021 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
|
1022 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1023 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
|
1024 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1025 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
|
1026 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
|
1027 im_activatekey_state); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1028 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
|
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 else |
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 im_shutdown(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1034 xim_init(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1035 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
|
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 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1039 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1040 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
|
1041 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
|
1042 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
|
1043 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1044 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1045 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1046 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
|
1047 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1048 if (down) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1049 { |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1050 // 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
|
1051 // 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
|
1052 // gdk/gdkkeyuni.c). |
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1053 // 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
|
1054 // 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
|
1055 // 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
|
1056 // 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
|
1057 // 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
|
1058 // 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
|
1059 switch (event->keyval) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1060 { |
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_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
|
1062 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
|
1063 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
|
1064 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
|
1065 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
|
1066 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
|
1067 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
|
1068 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
|
1069 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
|
1070 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
|
1071 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
|
1072 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
|
1073 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
|
1074 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
|
1075 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
|
1076 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
|
1077 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
|
1078 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
|
1079 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1080 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
|
1081 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1082 |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1083 // 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
|
1084 // 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
|
1085 // 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
|
1086 if (xic != NULL && !p_imdisable |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
1087 && (State & (MODE_INSERT | MODE_CMDLINE |
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
1088 | MODE_NORMAL | MODE_EXTERNCMD))) |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1089 { |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1090 // 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
|
1091 // 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
|
1092 // 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
|
1093 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
|
1094 && (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
|
1095 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1096 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
|
1097 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1098 // 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
|
1099 // 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
|
1100 // 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
|
1101 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
|
1102 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
|
1103 | (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
|
1104 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1105 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
|
1106 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1107 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1108 // 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
|
1109 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
|
1110 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1111 |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
1112 if (map_to_exists_mode((char_u *)"", MODE_LANGMAP, FALSE)) |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1113 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1114 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
|
1115 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1116 // ":lmap" mappings exists, toggle use of mappings. |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
1117 State ^= MODE_LANGMAP; |
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
1118 if (State & MODE_LANGMAP) |
20637
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 curbuf->b_p_iminsert = B_IMODE_NONE; |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
1121 State &= ~MODE_LANGMAP; |
20637
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 else |
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 curbuf->b_p_iminsert = B_IMODE_LMAP; |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
1126 State |= MODE_LANGMAP; |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1127 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1128 return TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1129 } |
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 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
|
1132 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1133 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1134 // 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
|
1135 // 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
|
1136 // 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
|
1137 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
|
1138 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1139 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
|
1140 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1141 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
|
1142 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1143 // 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
|
1144 // 1. preedited string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1145 // 2. committed string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1146 // 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
|
1147 // 4. preedited string. |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1148 // 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
|
1149 // 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
|
1150 // 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
|
1151 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
|
1152 && 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
|
1153 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1154 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
|
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 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1158 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1159 // 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
|
1160 // 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
|
1161 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
|
1162 // 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
|
1163 return FALSE; |
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 // 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
|
1166 // 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
|
1167 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
|
1168 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1169 // Normal processing |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1170 return imresult; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1171 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1172 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1173 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1174 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1175 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1176 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1177 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1178 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
|
1179 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1180 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1181 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1182 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1183 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1184 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
|
1185 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1186 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1187 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1188 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
|
1189 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1190 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
|
1191 } |
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 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1194 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
|
1195 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1196 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
|
1197 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1198 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1199 # 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
|
1200 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1201 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
|
1202 // mode |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1203 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
|
1204 # 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
|
1205 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
|
1206 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
|
1207 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1208 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1209 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1210 * 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
|
1211 * 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
|
1212 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1213 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1214 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
|
1215 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1216 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
|
1217 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1218 // 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
|
1219 if (p_imdisable) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1220 active = FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1221 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
|
1222 // 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
|
1223 // 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
|
1224 // 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
|
1225 active = TRUE; |
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 # 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
|
1228 if (USE_IMACTIVATEFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1229 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1230 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
|
1231 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1232 call_imactivatefunc(active); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1233 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
|
1234 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1235 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1236 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1237 # endif |
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 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1240 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1241 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1242 // 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
|
1243 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
|
1244 xim_set_preedit(); |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1247 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1248 * 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
|
1249 * "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
|
1250 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1251 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1252 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
|
1253 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1254 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1255 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1256 |
20671
ccdd80a6dad7
patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents:
20637
diff
changeset
|
1257 // 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
|
1258 // 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
|
1259 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
|
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 = TRUE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1264 XSetICFocus(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 else |
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 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
|
1270 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1271 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
|
1272 XUnsetICFocus(xic); |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1277 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1278 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
|
1279 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1280 xim_set_preedit(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1281 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1282 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1283 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1284 * 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
|
1285 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1286 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1287 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
|
1288 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1289 XVaNestedList attr_list; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1290 XRectangle spot_area; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1291 XPoint over_spot; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1292 int line_space; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1293 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1294 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1295 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1296 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1297 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
|
1298 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1299 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
|
1300 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1301 // hide XIM cursor |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1302 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
|
1303 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
|
1304 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
|
1305 XNSpotLocation, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1306 &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1307 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1308 XSetICValues(xic, XNPreeditAttributes, attr_list, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1309 XFree(attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1310 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1311 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1312 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1313 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
|
1314 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1315 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
|
1316 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1317 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
|
1318 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
|
1319 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1320 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
|
1321 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
|
1322 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
|
1323 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
|
1324 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
|
1325 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
|
1326 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
|
1327 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
|
1328 XNSpotLocation, &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1329 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
|
1330 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
|
1331 XNArea, &spot_area, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1332 XNLineSpace, line_space, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1333 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1334 if (XSetICValues(xic, XNPreeditAttributes, attr_list, NULL)) |
26897
d02d40f0261c
patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26518
diff
changeset
|
1335 emsg(_(e_cannot_set_ic_values)); |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1336 XFree(attr_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1337 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1338 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1339 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1340 # 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
|
1341 # 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
|
1342 # 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
|
1343 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1344 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1345 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
|
1346 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1347 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1348 # 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
|
1349 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1350 xim_instantiate_cb( |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1351 Display *display, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1352 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
|
1353 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
|
1354 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1355 Window x11_window; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1356 Display *x11_display; |
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 # ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1359 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
|
1360 # endif |
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 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
|
1363 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
|
1364 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1365 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1366 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
|
1367 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
|
1368 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1369 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
|
1370 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
|
1371 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1372 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1373 static void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1374 xim_destroy_cb( |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1375 XIM im UNUSED, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1376 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
|
1377 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
|
1378 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1379 Window x11_window; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1380 Display *x11_display; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1381 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1382 # ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1383 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
|
1384 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1385 gui_get_x11_windis(&x11_window, &x11_display); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1386 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1387 xic = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1388 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
|
1389 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1390 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
|
1391 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1392 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
|
1393 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
|
1394 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1395 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1396 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1397 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1398 xim_init(void) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1399 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1400 Window x11_window; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1401 Display *x11_display; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1402 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1403 # ifdef XIM_DEBUG |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1404 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
|
1405 # endif |
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 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
|
1408 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1409 xic = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1410 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1411 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
|
1412 return; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1413 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1414 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
|
1415 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1416 # 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
|
1417 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
|
1418 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
|
1419 # endif |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1422 static int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1423 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
|
1424 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1425 int i; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1426 char *p, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1427 *s, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1428 *ns, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1429 *end, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1430 tmp[1024]; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1431 # 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
|
1432 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
|
1433 XIM xim = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1434 XIMStyles *xim_styles; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1435 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
|
1436 Boolean found; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1437 XPoint over_spot; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1438 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
|
1439 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1440 input_style = 0; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1441 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
|
1442 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1443 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1444 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1445 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1446 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
|
1447 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1448 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
|
1449 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
|
1450 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1451 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
|
1452 if (*s == NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1453 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1454 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
|
1455 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
|
1456 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
|
1457 end--; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1458 *end = NUL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1459 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1460 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
|
1461 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1462 strcpy(buf, "@im="); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1463 strcat(buf, s); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1464 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
|
1465 && (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
|
1466 != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1467 break; |
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 s = ns + 1; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1471 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1472 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1473 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1474 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
|
1475 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
|
1476 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1477 // 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
|
1478 // 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
|
1479 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
|
1480 && *p != NUL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1481 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
|
1482 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1483 if (xim == NULL) |
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 // 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
|
1486 // 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
|
1487 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
|
1488 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1489 verbose_enter(); |
26897
d02d40f0261c
patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26518
diff
changeset
|
1490 emsg(_(e_failed_to_open_input_method)); |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1491 verbose_leave(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1492 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1493 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1494 } |
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 # 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
|
1497 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1498 XIMCallback destroy_cb; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1499 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1500 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
|
1501 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
|
1502 if (XSetIMValues(xim, XNDestroyCallback, &destroy_cb, NULL)) |
26897
d02d40f0261c
patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26518
diff
changeset
|
1503 emsg(_(e_warning_could_not_set_destroy_callback_to_im)); |
20637
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 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1506 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1507 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
|
1508 { |
26897
d02d40f0261c
patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26518
diff
changeset
|
1509 emsg(_(e_input_method_doesnt_support_any_style)); |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1510 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1511 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1512 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1513 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1514 found = False; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1515 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
|
1516 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
|
1517 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1518 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
|
1519 s++; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1520 if (!*s) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1521 break; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1522 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
|
1523 ns++; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1524 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1525 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
|
1526 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
|
1527 end--; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1528 *end = '\0'; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1529 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1530 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
|
1531 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
|
1532 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
|
1533 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
|
1534 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
|
1535 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
|
1536 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1537 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
|
1538 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1539 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
|
1540 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1541 found = True; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1542 break; |
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 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1545 if (!found) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1546 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
|
1547 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1548 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
|
1549 == (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
|
1550 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1551 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
|
1552 found = True; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1553 break; |
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 } |
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 s = ns; |
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 XFree(xim_styles); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1560 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1561 if (!found) |
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 // 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
|
1564 // 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
|
1565 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
|
1566 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1567 verbose_enter(); |
26897
d02d40f0261c
patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26518
diff
changeset
|
1568 emsg(_(e_input_method_doesnt_support_my_preedit_type)); |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1569 verbose_leave(); |
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 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1572 return FALSE; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1573 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1574 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1575 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
|
1576 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
|
1577 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
|
1578 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1579 // 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
|
1580 // 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
|
1581 # ifdef FEAT_XFONTSET |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1582 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
|
1583 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1584 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
|
1585 XNSpotLocation, &over_spot, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1586 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
|
1587 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
|
1588 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
|
1589 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1590 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
|
1591 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
|
1592 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
|
1593 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
|
1594 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1595 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1596 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1597 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1598 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1599 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
|
1600 XNSpotLocation, &over_spot, |
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 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
|
1605 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
|
1606 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
|
1607 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1608 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1609 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1610 xic = XCreateIC(xim, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1611 XNInputStyle, input_style, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1612 XNClientWindow, x11_window, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1613 XNFocusWindow, gui.wid, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1614 XNPreeditAttributes, preedit_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1615 XNStatusAttributes, status_list, |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1616 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1617 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1618 XFree(preedit_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1619 if (xic != NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1620 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1621 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
|
1622 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1623 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
|
1624 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
|
1625 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1626 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1627 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
|
1628 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1629 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1630 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1631 if (!is_not_a_term()) |
26897
d02d40f0261c
patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26518
diff
changeset
|
1632 emsg(_(e_failed_to_create_input_context)); |
20637
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1633 XCloseIM(xim); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1634 return FALSE; |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1637 return TRUE; |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1640 # 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
|
1641 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1642 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1643 * 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
|
1644 * 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
|
1645 * 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
|
1646 * 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
|
1647 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1648 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1649 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
|
1650 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1651 # ifdef FEAT_EVAL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1652 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1653 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1654 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1655 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
|
1656 } |
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 # 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
|
1659 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1660 # 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
|
1661 /* |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1662 * 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
|
1663 * |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1664 * 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
|
1665 * 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
|
1666 * 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
|
1667 * window... |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1668 */ |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1669 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1670 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
|
1671 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1672 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
|
1673 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
|
1674 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1675 if (xic == NULL) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1676 return; |
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 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
|
1679 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1680 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
|
1681 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1682 XRectangle *needed_rect; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1683 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1684 // 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
|
1685 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
|
1686 &needed_rect, NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1687 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
|
1688 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1689 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1690 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
|
1691 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1692 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1693 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
|
1694 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1695 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
|
1696 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
|
1697 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
|
1698 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
|
1699 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1700 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
|
1701 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
|
1702 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1703 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
|
1704 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
|
1705 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1706 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1707 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1708 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
|
1709 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
|
1710 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
|
1711 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
|
1712 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1713 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
|
1714 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
|
1715 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1716 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
|
1717 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
|
1718 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1719 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1720 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
|
1721 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1722 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
|
1723 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
|
1724 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
|
1725 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
|
1726 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
|
1727 #ifdef FEAT_MENU |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1728 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
|
1729 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
|
1730 #endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1731 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
|
1732 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
|
1733 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1734 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
|
1735 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1736 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
|
1737 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
|
1738 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
|
1739 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
|
1740 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
|
1741 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1742 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1743 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
|
1744 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
|
1745 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
|
1746 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
|
1747 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
|
1748 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1749 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
|
1750 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
|
1751 NULL); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1752 else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1753 list = NULL; |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1754 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1755 if (list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1756 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1757 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
|
1758 XFree(list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1759 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1760 if (status_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1761 XFree(status_list); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1762 if (preedit_list) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1763 XFree(preedit_list); |
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 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1766 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1767 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
|
1768 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1769 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
|
1770 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
|
1771 return 0; |
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 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1774 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1775 #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
|
1776 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1777 # 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
|
1778 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
|
1779 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1780 int |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1781 # ifdef VIMDLL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1782 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
|
1783 # else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1784 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
|
1785 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1786 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1787 # 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
|
1788 if (USE_IMSTATUSFUNC) |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1789 return call_imstatusfunc(); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1790 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1791 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
|
1792 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1793 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1794 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1795 # ifdef VIMDLL |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1796 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
|
1797 # else |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1798 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
|
1799 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1800 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1801 # 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
|
1802 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
|
1803 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1804 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
|
1805 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1806 call_imactivatefunc(active); |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1807 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
|
1808 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1809 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1810 } |
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 # 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
|
1813 void |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1814 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
|
1815 { |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1816 } |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1817 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1818 # endif |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1819 |
6c5b11458f31
patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1820 #endif // FEAT_XIM |