finch/libgnt/gntkeys.c

Wed, 13 May 2009 20:29:03 +0000

author
Marcus Lundblad <malu@pidgin.im>
date
Wed, 13 May 2009 20:29:03 +0000
changeset 27110
05ca719b901b
parent 25568
111d979e6b92
child 28199
821421a8d928
permissions
-rw-r--r--

Support custom smileys in MUCs (when all participants support BoB and a maximum
of 10 participants are in the chat).
Always announce support for BoB, since disable custom smileys will still turn
off fetching them, and BoB can be used for other purposes further on.

18114
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
1 /**
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
2 * GNT - The GLib Ncurses Toolkit
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
3 *
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
4 * GNT is the legal property of its developers, whose names are too numerous
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
6 * source distribution.
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
7 *
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
8 * This library is free software; you can redistribute it and/or modify
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
9 * it under the terms of the GNU General Public License as published by
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
11 * (at your option) any later version.
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
12 *
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
13 * This program is distributed in the hope that it will be useful,
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
16 * GNU General Public License for more details.
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
17 *
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
18 * You should have received a copy of the GNU General Public License
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
19 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 18601
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
18114
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
21 */
adb3cfadc125 Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17875
diff changeset
22
24822
d7774462f2ba Use glib log functions to show error messages.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24564
diff changeset
23 #include "gntinternal.h"
d7774462f2ba Use glib log functions to show error messages.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24564
diff changeset
24 #undef GNT_LOG_DOMAIN
d7774462f2ba Use glib log functions to show error messages.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24564
diff changeset
25 #define GNT_LOG_DOMAIN "Keys"
d7774462f2ba Use glib log functions to show error messages.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24564
diff changeset
26
14153
9da98052a4e1 [gaim-migrate @ 16715]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
diff changeset
27 #include "gntkeys.h"
9da98052a4e1 [gaim-migrate @ 16715]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
diff changeset
28
15839
e2b7b5f4f9aa Change a bit how the keystrokes are processed. When a lot of keystrokes come in at the same time, the shortest key-combination is processed first. This should make typing fast over a very slow connection work properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15095
diff changeset
29 #include <glib.h>
14939
7ec81b1b7bba [gaim-migrate @ 17646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14938
diff changeset
30 #include <stdlib.h>
14153
9da98052a4e1 [gaim-migrate @ 16715]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
diff changeset
31 #include <string.h>
9da98052a4e1 [gaim-migrate @ 16715]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
diff changeset
32
15095
f7c98ecaa92b [gaim-migrate @ 17816]
Christopher O'Brien <siege@pidgin.im>
parents: 15038
diff changeset
33 char *gnt_key_cup;
f7c98ecaa92b [gaim-migrate @ 17816]
Christopher O'Brien <siege@pidgin.im>
parents: 15038
diff changeset
34 char *gnt_key_cdown;
f7c98ecaa92b [gaim-migrate @ 17816]
Christopher O'Brien <siege@pidgin.im>
parents: 15038
diff changeset
35 char *gnt_key_cleft;
f7c98ecaa92b [gaim-migrate @ 17816]
Christopher O'Brien <siege@pidgin.im>
parents: 15038
diff changeset
36 char *gnt_key_cright;
f7c98ecaa92b [gaim-migrate @ 17816]
Christopher O'Brien <siege@pidgin.im>
parents: 15038
diff changeset
37
15033
9413ff0ec346 [gaim-migrate @ 17750]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14939
diff changeset
38 static const char *term;
15862
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
39 static GHashTable *specials;
14938
ee27e45919ef [gaim-migrate @ 17645]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14153
diff changeset
40
15038
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
41 void gnt_init_keys()
14153
9da98052a4e1 [gaim-migrate @ 16715]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
diff changeset
42 {
15862
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
43 const char *controls[] = {"", "c-", "ctrl-", "ctr-", "ctl-", NULL};
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
44 const char *alts[] = {"", "alt-", "a-", "m-", "meta-", NULL};
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
45 int c, a, ch;
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
46 char key[32];
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
47
15033
9413ff0ec346 [gaim-migrate @ 17750]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14939
diff changeset
48 if (term == NULL) {
9413ff0ec346 [gaim-migrate @ 17750]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14939
diff changeset
49 term = getenv("TERM");
9413ff0ec346 [gaim-migrate @ 17750]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14939
diff changeset
50 if (!term)
9413ff0ec346 [gaim-migrate @ 17750]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14939
diff changeset
51 term = ""; /* Just in case */
9413ff0ec346 [gaim-migrate @ 17750]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14939
diff changeset
52 }
9413ff0ec346 [gaim-migrate @ 17750]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 14939
diff changeset
53
24330
2a9310f4f833 Fix a bug where some key-bindings wouldn't work with some .
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23561
diff changeset
54 if (strstr(term, "xterm") == term || strcmp(term, "rxvt") == 0) {
15038
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
55 gnt_key_cup = "\033" "[1;5A";
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
56 gnt_key_cdown = "\033" "[1;5B";
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
57 gnt_key_cright = "\033" "[1;5C";
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
58 gnt_key_cleft = "\033" "[1;5D";
24330
2a9310f4f833 Fix a bug where some key-bindings wouldn't work with some .
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23561
diff changeset
59 } else if (strstr(term, "screen") == term || strcmp(term, "rxvt-unicode") == 0) {
15038
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
60 gnt_key_cup = "\033" "Oa";
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
61 gnt_key_cdown = "\033" "Ob";
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
62 gnt_key_cright = "\033" "Oc";
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
63 gnt_key_cleft = "\033" "Od";
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
64 }
15862
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
65
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
66 specials = g_hash_table_new(g_str_hash, g_str_equal);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
67
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
68 #define INSERT_KEY(k, code) do { \
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
69 g_hash_table_insert(specials, g_strdup(k), g_strdup(code)); \
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
70 gnt_keys_add_combination(code); \
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
71 } while (0)
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
72
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
73 INSERT_KEY("home", GNT_KEY_HOME);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
74 INSERT_KEY("end", GNT_KEY_END);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
75 INSERT_KEY("pageup", GNT_KEY_PGUP);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
76 INSERT_KEY("pagedown", GNT_KEY_PGDOWN);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
77 INSERT_KEY("insert", GNT_KEY_INS);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
78 INSERT_KEY("delete", GNT_KEY_DEL);
17875
ad1536695bff (16:39:44) rekkanoryo: i have a feature request
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 16105
diff changeset
79 INSERT_KEY("back_tab", GNT_KEY_BACK_TAB);
15862
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
80
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
81 INSERT_KEY("left", GNT_KEY_LEFT);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
82 INSERT_KEY("right", GNT_KEY_RIGHT);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
83 INSERT_KEY("up", GNT_KEY_UP);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
84 INSERT_KEY("down", GNT_KEY_DOWN);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
85
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
86 INSERT_KEY("tab", "\t");
23537
2ca40708a5ac Allow binding space, escape and return to some action.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19859
diff changeset
87 INSERT_KEY("escape", "\033");
2ca40708a5ac Allow binding space, escape and return to some action.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19859
diff changeset
88 INSERT_KEY("space", " ");
2ca40708a5ac Allow binding space, escape and return to some action.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19859
diff changeset
89 INSERT_KEY("return", GNT_KEY_ENTER);
15862
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
90 INSERT_KEY("menu", GNT_KEY_POPUP);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
91
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
92 INSERT_KEY("f1", GNT_KEY_F1);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
93 INSERT_KEY("f2", GNT_KEY_F2);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
94 INSERT_KEY("f3", GNT_KEY_F3);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
95 INSERT_KEY("f4", GNT_KEY_F4);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
96 INSERT_KEY("f5", GNT_KEY_F5);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
97 INSERT_KEY("f6", GNT_KEY_F6);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
98 INSERT_KEY("f7", GNT_KEY_F7);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
99 INSERT_KEY("f8", GNT_KEY_F8);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
100 INSERT_KEY("f9", GNT_KEY_F9);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
101 INSERT_KEY("f10", GNT_KEY_F10);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
102 INSERT_KEY("f11", GNT_KEY_F11);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
103 INSERT_KEY("f12", GNT_KEY_F12);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
104
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
105 #define REM_LENGTH (sizeof(key) - (cur - key))
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
106 #define INSERT_COMB(k, code) do { \
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
107 snprintf(key, sizeof(key), "%s%s%s", controls[c], alts[a], k); \
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
108 INSERT_KEY(key, code); \
24564
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
109 } while (0)
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
110 #define INSERT_COMB_CODE(k, c1, c2) do { \
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
111 char __[32]; \
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
112 snprintf(__, sizeof(__), "%s%s", c1, c2); \
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
113 INSERT_COMB(k, __); \
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
114 } while (0)
15862
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
115
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
116 /* Lower-case alphabets */
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
117 for (a = 0, c = 0; controls[c]; c++, a = 0) {
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
118 if (c) {
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
119 INSERT_COMB("up", gnt_key_cup);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
120 INSERT_COMB("down", gnt_key_cdown);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
121 INSERT_COMB("left", gnt_key_cleft);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
122 INSERT_COMB("right", gnt_key_cright);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
123 }
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
124
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
125 for (a = 0; alts[a]; a++) {
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
126 for (ch = 0; ch < 26; ch++) {
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
127 char str[2] = {'a' + ch, 0}, code[4] = "\0\0\0\0";
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
128 int ind = 0;
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
129 if (a)
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
130 code[ind++] = '\033';
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
131 code[ind] = (c ? 1 : 'a') + ch;
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
132 INSERT_COMB(str, code);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
133 }
25389
4dbec732f562 Fix rebinding the arrow keys and tab.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24822
diff changeset
134 if (c == 0 && a) {
23537
2ca40708a5ac Allow binding space, escape and return to some action.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19859
diff changeset
135 INSERT_COMB("tab", "\033\t");
24564
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
136 INSERT_COMB_CODE("up", "\033", GNT_KEY_UP);
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
137 INSERT_COMB_CODE("down", "\033", GNT_KEY_DOWN);
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
138 INSERT_COMB_CODE("left", "\033", GNT_KEY_LEFT);
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
139 INSERT_COMB_CODE("right", "\033", GNT_KEY_RIGHT);
23537
2ca40708a5ac Allow binding space, escape and return to some action.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19859
diff changeset
140 }
15862
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
141 }
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
142 }
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
143 c = 0;
15877
ca1fabffc300 Allow non-alt non-ctrl bindings. I broke this with me last few changes.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15874
diff changeset
144 for (a = 0; alts[a]; a++) {
15862
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
145 /* Upper-case alphabets */
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
146 for (ch = 0; ch < 26; ch++) {
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
147 char str[2] = {'A' + ch, 0}, code[] = {'\033', 'A' + ch, 0};
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
148 INSERT_COMB(str, code);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
149 }
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
150 /* Digits */
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
151 for (ch = 0; ch < 10; ch++) {
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
152 char str[2] = {'0' + ch, 0}, code[] = {'\033', '0' + ch, 0};
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
153 INSERT_COMB(str, code);
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
154 }
895c0f69faa0 Make sure unbound key-combinations are handled properly.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15852
diff changeset
155 }
15038
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
156 }
e57ca0ff0489 [gaim-migrate @ 17755]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15037
diff changeset
157
23358
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
158 void gnt_keys_refine(char *text)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
159 {
24564
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
160 while (*text == 27 && *(text + 1) == 27)
f1051b62e007 Allow binding meta-arrow keys for actions. Requested by essobi in #pidgin
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 24330
diff changeset
161 text++;
23358
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
162 if (*text == 27 && *(text + 1) == '[' &&
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
163 (*(text + 2) >= 'A' && *(text + 2) <= 'D')) {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
164 /* Apparently this is necessary for urxvt and screen and xterm */
24330
2a9310f4f833 Fix a bug where some key-bindings wouldn't work with some .
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23561
diff changeset
165 if (strstr(term, "screen") == term || strcmp(term, "rxvt-unicode") == 0 ||
25568
111d979e6b92 Need some refining for vt100 too, apparently. Fixes #8335.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 25389
diff changeset
166 strstr(term, "xterm") == term ||
111d979e6b92 Need some refining for vt100 too, apparently. Fixes #8335.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 25389
diff changeset
167 strstr(term, "vt100") == term)
23358
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
168 *(text + 1) = 'O';
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
169 } else if (*(unsigned char*)text == 195) {
24330
2a9310f4f833 Fix a bug where some key-bindings wouldn't work with some .
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23561
diff changeset
170 if (*(text + 2) == 0 && strstr(term, "xterm") == term) {
23358
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
171 *(text) = 27;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
172 *(text + 1) -= 64; /* Say wha? */
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
173 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
174 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
175 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
176
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
177 const char *gnt_key_translate(const char *name)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
178 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
179 return name ? g_hash_table_lookup(specials, name) : NULL;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
180 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
181
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
182 typedef struct {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
183 const char *name;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
184 const char *key;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
185 } gntkey;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
186
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
187 static void
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
188 get_key_name(gpointer key, gpointer value, gpointer data)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
189 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
190 gntkey *k = data;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
191 if (k->name)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
192 return;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
193 if (g_utf8_collate(value, k->key) == 0)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
194 k->name = key;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
195 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
196
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
197 const char *gnt_key_lookup(const char *key)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
198 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
199 gntkey k = {NULL, key};
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
200 g_hash_table_foreach(specials, get_key_name, &k);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
201 return k.name;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
202 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
203
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
204 /**
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
205 * The key-bindings will be saved in a tree. When a keystroke happens, GNT will
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
206 * find the sequence that matches a binding and return the length.
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
207 * A sequence should not be a prefix of another sequence. If it is, then only
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
208 * the shortest one will be processed. If we want to change that, we will need
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
209 * to allow getting the k-th prefix that matches the input, and pay attention
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
210 * to the return value of gnt_wm_process_input in gntmain.c.
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
211 */
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
212 #define SIZE 256
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
213
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
214 #define IS_END 1 << 0
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
215 struct _node
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
216 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
217 struct _node *next[SIZE];
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
218 int ref;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
219 int flags;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
220 };
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
221
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
222 static struct _node root = {.ref = 1, .flags = 0};
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
223
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
224 static void add_path(struct _node *node, const char *path)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
225 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
226 struct _node *n = NULL;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
227 if (!path || !*path) {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
228 node->flags |= IS_END;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
229 return;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
230 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
231 while (*path && node->next[(unsigned char)*path]) {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
232 node = node->next[(unsigned char)*path];
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
233 node->ref++;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
234 path++;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
235 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
236 if (!*path)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
237 return;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
238 n = g_new0(struct _node, 1);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
239 n->ref = 1;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
240 node->next[(unsigned char)*path++] = n;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
241 add_path(n, path);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
242 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
243
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
244 void gnt_keys_add_combination(const char *path)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
245 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
246 add_path(&root, path);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
247 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
248
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
249 static void del_path(struct _node *node, const char *path)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
250 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
251 struct _node *next = NULL;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
252
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
253 if (!*path)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
254 return;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
255 next = node->next[(unsigned char)*path];
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
256 if (!next)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
257 return;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
258 del_path(next, path + 1);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
259 next->ref--;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
260 if (next->ref == 0) {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
261 node->next[(unsigned char)*path] = NULL;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
262 g_free(next);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
263 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
264 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
265
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
266 void gnt_keys_del_combination(const char *path)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
267 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
268 del_path(&root, path);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
269 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
270
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
271 int gnt_keys_find_combination(const char *path)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
272 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
273 int depth = 0;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
274 struct _node *n = &root;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
275
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
276 root.flags &= ~IS_END;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
277 while (*path && n->next[(unsigned char)*path] && !(n->flags & IS_END)) {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
278 if (!g_ascii_isspace(*path) &&
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
279 !g_ascii_iscntrl(*path) &&
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
280 !g_ascii_isgraph(*path))
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
281 return 0;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
282 n = n->next[(unsigned char)*path++];
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
283 depth++;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
284 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
285
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
286 if (!(n->flags & IS_END))
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
287 depth = 0;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
288 return depth;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
289 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
290
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
291 static void
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
292 print_path(struct _node *node, int depth)
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
293 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
294 int i;
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
295 for (i = 0; i < SIZE; i++) {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
296 if (node->next[i]) {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
297 g_printerr("%*c (%d:%d)\n", depth * 4, i, node->next[i]->ref,
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
298 node->next[i]->flags);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
299 print_path(node->next[i], depth + 1);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
300 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
301 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
302 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
303
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
304 /* this is purely for debugging purposes. */
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
305 void gnt_keys_print_combinations(void);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
306 void gnt_keys_print_combinations()
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
307 {
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
308 g_printerr("--------\n");
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
309 print_path(&root, 1);
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
310 g_printerr("--------\n");
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
311 }
e4290512c192 disapproval of revision '22db0cc69beeebb47320c8e6b6f3d2f908597f17'
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 23357
diff changeset
312

mercurial