annotate src/gui_xim.c @ 32078:615964c77be3 v9.0.1370

patch 9.0.1370: crash when using a NULL object Commit: https://github.com/vim/vim/commit/c3f971f28989fde7d94b45957496fecd6e6f2177 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Mar 2 17:38:33 2023 +0000 patch 9.0.1370: crash when using a NULL object Problem: Crash when using a NULL object. (Ernie Rael) Solution: Check for NULL and give an error message. (closes https://github.com/vim/vim/issues/12083)
author Bram Moolenaar <Bram@vim.org>
date Thu, 02 Mar 2023 18:45:08 +0100
parents 4545f58c8490
children 1629cc65d78d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * gui_xim.c: functions for the X Input Method
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #include "vim.h"
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
31996
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
16 #if !defined(GTK_CHECK_VERSION)
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
17 # define GTK_CHECK_VERSION(a, b, c) 0
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
18 #endif
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
19 #if !defined(FEAT_GUI_GTK) && defined(PROTO)
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
20 typedef int GtkWidget;
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
21 typedef int GtkIMContext;
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
22 typedef int gchar;
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
23 typedef int gpointer;
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
24 typedef int PangoAttrIterator;
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
25 typedef int GdkEventKey;
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
26 #endif
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
27
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 #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
29 # 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
30 # 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
31 # else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32 # 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
33 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 # ifdef MSWIN
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 # 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
36 # else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 # 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
38 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 * 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
43 * 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
44 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 // #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
46 #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
47 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
48
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 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
51 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52 va_list arglist;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53 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
54
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 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
56 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 if (fd == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59 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
60 if (fd == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 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
63 fd = (FILE *)-1;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68 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
69 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
70 va_end(arglist);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
73
21112
2d3cd9acf853 patch 8.2.1107: 'imactivatefunc' and 'imstatusfunc' are not used in the GUI
Bram Moolenaar <Bram@vim.org>
parents: 20671
diff changeset
74 #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
75 # 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
76 # 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
77 #else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
78 # 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
79 # 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
80 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
81
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
82 #if (defined(FEAT_EVAL) && \
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
83 (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
84 defined(PROTO)
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
85 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
86 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
87
31859
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
88 char *
31996
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
89 did_set_imactivatefunc(optset_T *args UNUSED)
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
90 {
31859
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
91 if (option_set_callback_func(p_imaf, &imaf_cb) == FAIL)
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
92 return e_invalid_argument;
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
93
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
94 return NULL;
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
95 }
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
96
31859
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
97 char *
31996
ca6bc7c04163 patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents: 31859
diff changeset
98 did_set_imstatusfunc(optset_T *args UNUSED)
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
99 {
31859
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
100 if (option_set_callback_func(p_imsf, &imsf_cb) == FAIL)
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
101 return e_invalid_argument;
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
102
8b15e4161605 patch 9.0.1262: the did_set_string_option function is too long
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
103 return NULL;
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
104 }
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
105
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
106 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
107 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
108 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
109 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
110 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
111
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
112 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
113 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
114 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
115 (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
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 }
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 static int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
121 call_imstatusfunc(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
122 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
123 int is_active;
28996
54247d52bee9 patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents: 28773
diff changeset
124 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
125
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
126 // 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
127 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
128 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
129 // 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
130 // 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
131 ++msg_silent;
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
132 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
133 --msg_silent;
28996
54247d52bee9 patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents: 28773
diff changeset
134
54247d52bee9 patch 8.2.5020: using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'
Bram Moolenaar <Bram@vim.org>
parents: 28773
diff changeset
135 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
136 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
137 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
138 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
139
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
140 #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
141 void
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
142 free_xim_stuff(void)
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
143 {
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
144 # 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
145 (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
146 free_callback(&imaf_cb);
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
147 free_callback(&imsf_cb);
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
148 # endif
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
149 }
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
150 #endif
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
151
27018
268f6a3511df patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents: 26897
diff changeset
152 #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
153 /*
31201
b1c66bff0a66 patch 9.0.0934: various code formatting issues
Bram Moolenaar <Bram@vim.org>
parents: 29865
diff changeset
154 * 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
155 * 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
156 */
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
157 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
158 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
159 {
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
160 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
161
27018
268f6a3511df patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents: 26897
diff changeset
162 # 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
163 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
164 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
165 # 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
166
13ba00ef7687 patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents: 26408
diff changeset
167 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
168 }
27018
268f6a3511df patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents: 26897
diff changeset
169 #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
170
26408
8f17f8f327f3 patch 8.2.3735: cannot use a lambda for 'imactivatefunc'
Bram Moolenaar <Bram@vim.org>
parents: 25475
diff changeset
171
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
172 #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
173
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
174 # 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
175 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
176
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 * 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
179 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 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
182 {
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 27018
diff changeset
183 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
184 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
185 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
186 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
187 // 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
188 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
189 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 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
192 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
193 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
194 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
195
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 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
197 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
198 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
199
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 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
201 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
202
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 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
204
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206 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
207 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208 int was_active;
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 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
211 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
212
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 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
214 xim_reset();
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
217 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 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
219 {
31651
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
220 if (xic == NULL)
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
221 return;
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
222
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
223 if (focus)
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
224 gtk_im_context_focus_in(xic);
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
225 else
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
226 gtk_im_context_focus_out(xic);
20637
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 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230 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
231 {
31651
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
232 if (xic == NULL)
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
233 return;
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
234
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
235 GdkRectangle area;
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236
31651
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
237 area.x = FILL_X(col);
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
238 area.y = FILL_Y(row);
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
239 area.width = gui.char_width * (mb_lefthalve(row, col) ? 2 : 1);
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
240 area.height = gui.char_height;
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
241
31651
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
242 gtk_im_context_set_cursor_location(xic, &area);
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243
31651
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
244 if (p_imst == IM_OVER_THE_SPOT)
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31201
diff changeset
245 im_preedit_window_set_position();
20637
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 # 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
249 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
250 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
251 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
252 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
253 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
254 # endif
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 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257 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
258 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
259 // 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
260 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
261 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
262 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
263 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
264 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
265
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
266 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
267
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
268 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
269 vim_free(str);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
270
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
271 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
272 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
273 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
274
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
275 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
276 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
277 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
278 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
279 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
280
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
281 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
282 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
283
24162
cb8b9bf76082 patch 8.2.2622: GTK: error when starting up and -geometry is given
Bram Moolenaar <Bram@vim.org>
parents: 21112
diff changeset
284 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
285 &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
286 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
287 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
288 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
289 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
290 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
291 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
292 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
293 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
294 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
295 }
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 static void
32009
4545f58c8490 patch 9.0.1336: functions without arguments are not always declared properly
Bram Moolenaar <Bram@vim.org>
parents: 31996
diff changeset
298 im_preedit_window_open(void)
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
299 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300 char *preedit_string;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
301 #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
302 char buf[8];
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
303 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
304 PangoAttrList *attr_list;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
305 PangoLayout *layout;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
306 #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
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 GdkRGBA color;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
309 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
310 #else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
311 GdkColor color;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
312 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
313 gint w, h;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
314
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
315 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
316 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
317 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
318 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
319 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
320 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
321 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
322 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
323 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
324
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
325 #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
326 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
327 GtkStyleContext * const context
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
328 = 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
329 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
330 gchar *css = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
331 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
332 = 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
333 gint fontsize
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
334 = 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
335 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
336
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
337 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
338 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
339 // 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
340 // 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
341 GdkScreen * const screen
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
342 = 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
343 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
344 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
345 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
346 if (fontsize > 0)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
347 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
348 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
349 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
350
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
351 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
352 "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
353 " 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
354 " 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
355 " 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
356 " 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
357 "}\n",
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
358 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
359 fontsize_propval,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
360 (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
361 (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
362 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
363 (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
364 (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
365 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
366
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 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
368 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
369 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
370
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
371 g_free(css);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372 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
373 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
374 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 #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
376 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
377
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
378 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
379 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
380 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
381
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
382 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
383 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
384 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
385 &color);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
386 #else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
387 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
388
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
389 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
390 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
391 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
392
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393 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
394 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
395 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
396 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 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
399
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 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
401 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402 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
403 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
404
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405 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
406 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
407 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
408 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
409
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
410 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
411
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
412 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
413 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
414
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
415 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
416 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
417 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
419 static void
32009
4545f58c8490 patch 9.0.1336: functions without arguments are not always declared properly
Bram Moolenaar <Bram@vim.org>
parents: 31996
diff changeset
420 im_preedit_window_close(void)
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
421 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422 if (preedit_window != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 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
424 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 static void
32009
4545f58c8490 patch 9.0.1336: functions without arguments are not always declared properly
Bram Moolenaar <Bram@vim.org>
parents: 31996
diff changeset
427 im_show_preedit(void)
20637
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
428 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429 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
430
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 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
432 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
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 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 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
437 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438 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
439 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
440
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
441 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
442 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
443 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
444 return;
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
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 27018
diff changeset
447 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
448 #ifdef FEAT_TERMINAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449 && !term_use_loop()
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451 )
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 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
454 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
455 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
456 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
457 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
458
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
459 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
460 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
461 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462
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 * 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
465 * 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
466 * 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
467 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
468 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 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
470 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 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
472
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 27018
diff changeset
473 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
474 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475 # 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
476 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
477 backkey[2] = 'r';
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
478 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
479 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
480 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
481 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 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
484 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
485
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487 * 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
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_show_info(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
492 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
493
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 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
495 vgetc_busy = TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
496 showmode();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497 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
498 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
499 setcursor();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
500 out_flush();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
501 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
502
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
503 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
504 * 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
505 * 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
506 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
507 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
508 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
509 const gchar *str,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510 gpointer data UNUSED)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
511 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
512 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
513 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
514 int clen;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515 int len = slen;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 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
517 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
518
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 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
521 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
523 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
524 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525 // 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
526 // 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
527 im_delete_preedit();
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 // 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
530 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
531 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532 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
533 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
534 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
535
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
536 // 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
537 // "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
538 // 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
539 // "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
540 // 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
541 // 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
542 // 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
543 // 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
544 // string.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
545 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
546 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
547 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
548 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
549 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 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
552
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553 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
554
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
555 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
556 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
557 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
558 }
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 // 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
561 // 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
562 // 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
563 // mappings as <kSomething>.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 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
565 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 // 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
567 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
568 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569 // 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
570 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
571 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
572 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
574 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
575 // Not a match
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 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
577 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 }
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 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
581 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
582
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 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
584 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585 // 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
586 // 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
587 // marked as changed.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 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
589 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
590
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 // 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
592 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
593 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
594
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
595 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
596 gtk_main_quit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
597 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
598
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600 * Callback invoked after 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
601 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
602 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603 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
604 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
605 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 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
607 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
609 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
610 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
611 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
612 im_show_info();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
613 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 * 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
617 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
619 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
620 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
621 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
622 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
623 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
624 im_delete_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
625
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 // 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
627 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
628 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
629 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
630
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 #if 0
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 // 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
633 // 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
634 // SungHyun Nam).
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635 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
636 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 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
638 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
639 im_show_info();
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 * 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
644 * 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
645 * 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
646 * 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
647 * 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
648 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 * 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
650 * several fundamental problems:
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
652 * - 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
653 * 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
654 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 * - 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
656 * 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
657 * 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
658 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659 * - 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
660 * 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
661 * "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
662 * 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
663 * for proper operation.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 * 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
666 * 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
667 * 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
668 * 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
669 * 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
670 * 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
671 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 * 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
673 * 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
674 * 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
675 * 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
676 * 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
677 * 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
678 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680 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
681 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682 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
683 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
684 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
685 char_u *str;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 char_u *p;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687 int i;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
689 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
690 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
691 &preedit_string, NULL,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 &cursor_index);
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 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
695 &preedit_string, NULL,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 NULL);
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 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 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
700 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 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
703
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704 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
705 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 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
707 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
708 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
709 im_delete_preedit();
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 else
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 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
714 im_show_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 }
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 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 // If preedit_start_col 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
720 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
721 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 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
723
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 // 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
725 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
726 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 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
728 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 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
730
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731 // 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
732 // 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
733 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
734 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 im_delete_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
738 // 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
739 // According to the documentation of
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
740 // 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
741 // 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
742 // 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
743 // 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
744 if (preedit_start_col != MAXCOL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
745 preedit_end_col = preedit_start_col;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 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
747 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
748 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 int is_composing;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
751 is_composing = ((*p & 0x80) != 0
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
752 && utf_iscomposing(utf_ptr2char(p)));
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
753 // 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
754 // <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
755 // 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
756 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
757 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
758 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
759 ++im_preedit_cursor;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
760 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 ++im_preedit_trailing;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 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
764 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
765 // 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
766 // 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
767 ++num_move_back;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
768 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
769 if (preedit_start_col != MAXCOL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
770 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
771 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
772
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
773 if (p > str)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
774 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
775 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
776 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
777 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 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
781
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
782 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
783 gtk_main_quit();
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
786 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 * 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
788 * 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
789 * 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
790 * 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
791 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 static int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
793 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
794 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 PangoAttribute *attr;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796 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
797
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 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
799 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
800 != (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
801 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
802
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 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
804 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
805 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
806
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 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
808 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
809 != (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
810 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
811
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 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
813 if (attr != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
814 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 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
816
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 // 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
818 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
819 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
820 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
822 return char_attr;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
825 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
826 * 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
827 * 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
828 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
830 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
831 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 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
833 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
834 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
835
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 return char_attr;
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 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
840
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 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
842 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843 int idx;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
844
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
845 // 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
846 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
847 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
848
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 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
850 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 PangoAttrIterator *iter;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
852 int start, end;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854 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
855 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
856
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 // 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
858 do
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 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
861
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
862 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
863 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
864 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
865 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
866
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
867 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
868 }
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 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
872 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
873 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
874
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 return char_attr;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 xim_init(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
880 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 xim_log("xim_init()\n");
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 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
886 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
887
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
888 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
889 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
890
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 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
892 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
893 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
894 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
895 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
896 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
897 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
898 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
899
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900 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
901 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 im_shutdown(void)
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 #ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907 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
908 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
910 if (xic != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
912 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
913 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
914 xic = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 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
917 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
918 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
919 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
920 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
921 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
922
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
923 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
924 * 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
925 * 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
926 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
927 * 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
928 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929 static int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930 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
931 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932 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
933 unsigned tmp_keyval;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934 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
935
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 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
937 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
938
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 // Parse modifier keys
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
940 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
941 switch (*str++)
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 case '-': break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 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
945 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
946 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
947 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
948 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
949 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
950 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
951 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
952 default:
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 return FALSE;
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
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 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
957
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958 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
959 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961 if (keyval != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 *keyval = tmp_keyval;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963 if (state != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 *state = tmp_state;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 return TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968
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 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
971 * 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
972 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 * 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
974 * 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
975 * '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
976 * 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
977 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 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
980 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 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
982 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983 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
984 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
985 return TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 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
989 &im_activatekey_keyval,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 &im_activatekey_state);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991 }
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 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 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
995 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 GdkEventKey *event;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 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
999 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
1000 // 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
1001 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
1002 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
1003 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
1004 event->state = state;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005 event->keyval = keyval;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006 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
1007 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
1008 event->length = 0;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 event->string = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 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
1012
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 // 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
1014 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
1015 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
1016 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
1017
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 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
1019 }
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 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 xim_reset(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 # ifdef FEAT_EVAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025 if (USE_IMACTIVATEFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 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
1027 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1029 if (xic != NULL)
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 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
1032
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 if (p_imdisable)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1034 im_shutdown();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035 else
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 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
1038
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 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
1040 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 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
1042 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 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
1044 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
1045 im_activatekey_state);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046 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
1047 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051 im_shutdown();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 xim_init();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 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
1054 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058 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
1059 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
1060 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
1061 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1062
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 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
1065 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1066 if (down)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1067 {
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1068 // 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
1069 // 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
1070 // gdk/gdkkeyuni.c).
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1071 // 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
1072 // 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
1073 // 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
1074 // 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
1075 // 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
1076 // 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
1077 switch (event->keyval)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1078 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1079 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
1080 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
1081 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
1082 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
1083 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
1084 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
1085 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
1086 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
1087 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
1088 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
1089 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
1090 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
1091 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
1092 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
1093 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
1094 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
1095 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
1096 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
1097 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1098 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
1099 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1101 // 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
1102 // 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
1103 // 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
1104 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
1105 && (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
1106 | 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
1107 {
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1108 // 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
1109 // 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
1110 // 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
1111 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
1112 && (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
1113 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1114 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
1115
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1116 // 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
1117 // 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
1118 // 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
1119 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
1120 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
1121 | (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
1122
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1123 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
1124 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126 // Don't 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
1127 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
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
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 27018
diff changeset
1130 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
1131 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 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
1133
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134 // ":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
1135 State ^= MODE_LANGMAP;
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 27018
diff changeset
1136 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
1137 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 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
1139 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
1140 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141 else
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 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
1144 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
1145 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146 return TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1147 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 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
1150 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 // 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
1153 // 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
1154 // 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
1155 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
1156 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1157 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
1158
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1159 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
1160 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1161 // 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
1162 // 1. preedited string.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1163 // 2. committed string.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1164 // 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
1165 // 4. preedited string.
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1166 // 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
1167 // 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
1168 // 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
1169 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
1170 && 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
1171 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 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
1173 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1174 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175 }
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 // 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
1178 // 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
1179 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
1180 // 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
1181 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 // 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
1184 // 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
1185 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
1186
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187 // Normal processing
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 return imresult;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 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
1197 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 # ifdef FEAT_EVAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 if (USE_IMSTATUSFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 return call_imstatusfunc();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 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
1203 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 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
1207 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 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
1209 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1211 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212 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
1213 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1214 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
1215 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1217 # 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
1218
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 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
1220 // mode
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221 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
1222 # 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
1223 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
1224 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
1225 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1226
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1227 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1228 * 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
1229 * 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
1230 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 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
1233 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 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
1235
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 // 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
1237 if (p_imdisable)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238 active = FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1239 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
1240 // 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
1241 // 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
1242 // 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
1243 active = TRUE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1245 # 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
1246 if (USE_IMACTIVATEFUNC)
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 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
1249 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1250 call_imactivatefunc(active);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1251 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
1252 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1254 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1256
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1257 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1258 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1259
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1260 // 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
1261 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
1262 xim_set_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1263 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1264
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1266 * 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
1267 * "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
1268 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1270 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
1271 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1272 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1273 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1274
20671
ccdd80a6dad7 patch 8.2.0889: using old style comments
Bram Moolenaar <Bram@vim.org>
parents: 20637
diff changeset
1275 // 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
1276 // 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
1277 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
1278 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1279 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
1280 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 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
1282 XSetICFocus(xic);
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 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1285 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1286 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1287 if (xim_has_focus)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1288 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1289 xim_has_focus = FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1290 XUnsetICFocus(xic);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1291 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1292 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1293 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1294
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1295 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1296 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
1297 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1298 xim_set_preedit();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1299 }
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 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1302 * 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
1303 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1304 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1305 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
1306 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1307 XVaNestedList attr_list;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1308 XRectangle spot_area;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 XPoint over_spot;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1310 int line_space;
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 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1313 return;
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 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
1316
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1317 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
1318 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1319 // hide XIM cursor
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 = 0;
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 = -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
1322 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
1323 XNSpotLocation,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1324 &over_spot,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1325 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1326 XSetICValues(xic, XNPreeditAttributes, attr_list, NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1327 XFree(attr_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1328 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1330
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1331 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
1332 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1333 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
1334 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1335 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
1336 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
1337 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1338 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
1339 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
1340 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
1341 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
1342 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
1343 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
1344 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
1345 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
1346 XNSpotLocation, &over_spot,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1347 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
1348 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
1349 XNArea, &spot_area,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1350 XNLineSpace, line_space,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1351 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1352 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
1353 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
1354 XFree(attr_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1355 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1356 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1357
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1358 # 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
1359 # 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
1360 # 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
1361 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1362
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1363 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
1364
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 # 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
1367 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1368 xim_instantiate_cb(
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1369 Display *display,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1370 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
1371 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
1372 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1373 Window x11_window;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1374 Display *x11_display;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1375
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1376 # ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1377 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
1378 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1379
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1380 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
1381 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
1382 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1383
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1384 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
1385 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
1386 if (xic != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1387 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
1388 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
1389 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1390
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1391 static void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1392 xim_destroy_cb(
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1393 XIM im UNUSED,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1394 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
1395 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
1396 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1397 Window x11_window;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1398 Display *x11_display;
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 # ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1401 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
1402 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1403 gui_get_x11_windis(&x11_window, &x11_display);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1404
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1405 xic = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1406 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
1407
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1408 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
1409
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1410 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
1411 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
1412 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1413 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1414
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1415 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1416 xim_init(void)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1417 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1418 Window x11_window;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1419 Display *x11_display;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1420
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1421 # ifdef XIM_DEBUG
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1422 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
1423 # endif
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 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
1426
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1427 xic = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1428
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1429 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
1430 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1431
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1432 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
1433
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1434 # 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
1435 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
1436 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
1437 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1438 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1439
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1440 static int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1441 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
1442 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1443 int i;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1444 char *p,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1445 *s,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1446 *ns,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1447 *end,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1448 tmp[1024];
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1449 # 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
1450 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
1451 XIM xim = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1452 XIMStyles *xim_styles;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1453 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
1454 Boolean found;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1455 XPoint over_spot;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1456 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
1457
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1458 input_style = 0;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1459 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
1460
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1461 if (xic != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1462 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1463
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1464 if (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
1465 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1466 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
1467 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
1468 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1469 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
1470 if (*s == NUL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1471 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1472 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
1473 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
1474 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
1475 end--;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1476 *end = NUL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1477
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1478 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
1479 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1480 strcpy(buf, "@im=");
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1481 strcat(buf, s);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1482 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
1483 && (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
1484 != NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1485 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1486 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1487
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1488 s = ns + 1;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1489 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1490 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1491
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1492 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
1493 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
1494
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1495 // 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
1496 // 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
1497 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
1498 && *p != NUL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1499 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
1500
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1501 if (xim == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1502 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1503 // 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
1504 // 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
1505 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
1506 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1507 verbose_enter();
26897
d02d40f0261c patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
1508 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
1509 verbose_leave();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1510 }
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 # 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
1515 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1516 XIMCallback destroy_cb;
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 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
1519 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
1520 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
1521 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
1522 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1523 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1524
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1525 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
1526 {
26897
d02d40f0261c patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
1527 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
1528 XCloseIM(xim);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1529 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1530 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1531
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1532 found = False;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1533 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
1534 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
1535 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1536 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
1537 s++;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1538 if (!*s)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1539 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1540 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
1541 ns++;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1542 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1543 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
1544 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
1545 end--;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1546 *end = '\0';
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 (!strcmp(s, "OverTheSpot"))
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 = (XIMPreeditPosition | XIMStatusArea);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1550 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
1551 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
1552 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
1553 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
1554
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1555 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
1556 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1557 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
1558 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1559 found = True;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1560 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1561 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1562 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1563 if (!found)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1564 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
1565 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1566 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
1567 == (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
1568 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1569 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
1570 found = True;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1571 break;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1572 }
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 s = ns;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1576 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1577 XFree(xim_styles);
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 if (!found)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1580 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1581 // 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
1582 // 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
1583 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
1584 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1585 verbose_enter();
26897
d02d40f0261c patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26518
diff changeset
1586 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
1587 verbose_leave();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1588 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1589 XCloseIM(xim);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1590 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1591 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1592
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1593 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
1594 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
1595 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
1596
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1597 // 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
1598 // 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
1599 # ifdef FEAT_XFONTSET
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1600 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
1601 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1602 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
1603 XNSpotLocation, &over_spot,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1604 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
1605 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
1606 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
1607 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1608 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
1609 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
1610 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
1611 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
1612 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1613 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1614 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1615 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1616 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1617 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
1618 XNSpotLocation, &over_spot,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1619 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
1620 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
1621 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1622 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
1623 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
1624 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
1625 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1626 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1627
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1628 xic = XCreateIC(xim,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1629 XNInputStyle, input_style,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1630 XNClientWindow, x11_window,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1631 XNFocusWindow, gui.wid,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1632 XNPreeditAttributes, preedit_list,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1633 XNStatusAttributes, status_list,
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1634 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1635 XFree(status_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1636 XFree(preedit_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1637 if (xic != NULL)
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 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
1640 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1641 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
1642 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
1643 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1644 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1645 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
1646 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1647 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1648 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1649 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
1650 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
1651 XCloseIM(xim);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1652 return FALSE;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1653 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1654
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1655 return TRUE;
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_X11
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 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1661 * 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
1662 * 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
1663 * 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
1664 * 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
1665 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1666 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1667 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
1668 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1669 # ifdef FEAT_EVAL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1670 if (USE_IMSTATUSFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1671 return call_imstatusfunc();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1672 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1673 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
1674 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1675
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1676 # 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
1677
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1678 # 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
1679 /*
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1680 * 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
1681 *
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1682 * 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
1683 * 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
1684 * 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
1685 * window...
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1686 */
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1687 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1688 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
1689 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1690 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
1691 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
1692
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1693 if (xic == NULL)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1694 return;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1695
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1696 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
1697 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1698 if (input_style & XIMPreeditArea)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1699 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1700 XRectangle *needed_rect;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1701
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1702 // 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
1703 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
1704 &needed_rect, NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1705 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
1706 XFree(status_list);
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.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
1709 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1710 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1711 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
1712
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1713 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
1714 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
1715 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
1716 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
1717 #ifdef FEAT_MENU
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1718 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
1719 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
1720 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1721 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
1722 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
1723 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1724 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1725 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1726 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
1727 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
1728 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
1729 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
1730 #ifdef FEAT_MENU
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1731 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
1732 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
1733 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1734 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
1735 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
1736 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1737
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1738 if (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
1739 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1740 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
1741 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
1742 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
1743 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
1744 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
1745 #ifdef FEAT_MENU
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1746 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
1747 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
1748 #endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1749 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
1750 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
1751 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1752 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
1753 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1754 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
1755 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
1756 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
1757 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
1758 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
1759 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1760
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1761 if (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
1762 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
1763 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
1764 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
1765 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
1766 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1767 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
1768 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
1769 NULL);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1770 else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1771 list = NULL;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1772
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1773 if (list)
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 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
1776 XFree(list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1777 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1778 if (status_list)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1779 XFree(status_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1780 if (preedit_list)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1781 XFree(preedit_list);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1782 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1783
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1784 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1785 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
1786 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1787 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
1788 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
1789 return 0;
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1790 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1791 # endif
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 #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
1794
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1795 # 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
1796 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
1797
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1798 int
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1799 # ifdef VIMDLL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1800 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
1801 # else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1802 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
1803 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1804 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1805 # 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
1806 if (USE_IMSTATUSFUNC)
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1807 return call_imstatusfunc();
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1808 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1809 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
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 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1813 # ifdef VIMDLL
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1814 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
1815 # else
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1816 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
1817 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1818 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1819 # 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
1820 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
1821
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1822 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
1823 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1824 call_imactivatefunc(active);
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1825 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
1826 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1827 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1828 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1829
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1830 # 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
1831 void
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1832 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
1833 {
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1834 }
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1835 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1836 # endif
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1837
6c5b11458f31 patch 8.2.0872: XIM code is mixed with multi-byte code
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1838 #endif // FEAT_XIM