1 /* Editor key translation.
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007 Free Software Foundation, Inc.
6 Authors: 1996, 1997 Paul Sheer
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 * \brief Source: editor key translation
33 #include <sys/types.h>
42 #include "../src/global.h"
44 #include "edit-impl.h"
45 #include "edit-widget.h" /* edit->macro_i */
46 #include "editcmd_dialogs.h"
48 #include "../src/tty/tty.h" /* keys */
49 #include "../src/tty/key.h" /* KEY_M_SHIFT */
50 #include "../src/cmddef.h" /* list of commands */
52 #include "../src/charsets.h" /* convert_from_input_c() */
53 #include "../src/main.h" /* display_codepage */
54 #include "../src/strutil.h" /* str_isutf8 () */
57 * Translate the keycode into either 'command' or 'char_for_insertion'.
58 * 'command' is one of the editor commands from cmddef.h.
61 edit_translate_key (WEdit
*edit
, long x_key
, int *cmd
, int *ch
)
63 int command
= CK_Insert_Char
;
64 int char_for_insertion
= -1;
68 /* an ordinary insertable character */
71 if ( edit
->charpoint
>= 4 ) {
73 edit
->charbuf
[edit
->charpoint
] = '\0';
75 if ( edit
->charpoint
< 4 ) {
76 edit
->charbuf
[edit
->charpoint
++] = x_key
;
77 edit
->charbuf
[edit
->charpoint
] = '\0';
80 /* input from 8-bit locale */
81 if ( !utf8_display
) {
82 /* source in 8-bit codeset */
84 #endif /* HAVE_CHARSET */
85 c
= convert_from_input_c (x_key
);
86 if (is_printable (c
)) {
87 char_for_insertion
= c
;
92 c
= convert_from_input_c (x_key
);
93 if (is_printable (c
)) {
94 char_for_insertion
= convert_from_8bit_to_utf_c2((unsigned char) x_key
);
100 /* source in UTF-8 codeset */
102 int res
= str_is_valid_char (edit
->charbuf
, edit
->charpoint
);
105 edit
->charpoint
= 0; /* broken multibyte char, skip */
108 char_for_insertion
= x_key
;
111 edit
->charbuf
[edit
->charpoint
]='\0';
113 if ( g_unichar_isprint (g_utf8_get_char(edit
->charbuf
))) {
114 char_for_insertion
= x_key
;
121 int res
= str_is_valid_char (edit
->charbuf
, edit
->charpoint
);
124 edit
->charpoint
= 0; /* broken multibyte char, skip */
127 /* not finised multibyte input (in meddle multibyte utf-8 char) */
130 if ( g_unichar_isprint (g_utf8_get_char(edit
->charbuf
)) ) {
131 c
= convert_from_utf_to_current ( edit
->charbuf
);
132 edit
->charbuf
[0] = '\0';
134 char_for_insertion
= c
;
137 /* unprinteble utf input, skip it */
138 edit
->charbuf
[0] = '\0';
143 #endif /* HAVE_CHARSET */
146 /* Commands specific to the key emulation */
149 for (i
= 0; editor_x_map
[i
].key
; i
++) {
150 if (x_key
== editor_x_map
[i
].key
) {
151 command
= editor_x_map
[i
].command
;
156 for (i
= 0; editor_map
[i
].key
!= 0; i
++) {
157 if (x_key
== editor_map
[i
].key
) {
158 command
= editor_map
[i
].command
;
165 *ch
= char_for_insertion
;
167 return (command
== CK_Insert_Char
&& char_for_insertion
== -1) ? 0 : 1;