diff options
author | Aurélien Aptel <aurelien.aptel@gmail.com> | 2009-09-07 21:19:29 +0200 |
---|---|---|
committer | Aurélien Aptel <aurelien.aptel@gmail.com> | 2009-09-07 21:19:29 +0200 |
commit | 4e6915a16b75c1e79142e15a9b23e761140d4e9b (patch) | |
tree | 23d8e60a16069631b0b2634aa0f3ef2388c5ed88 | |
parent | dab8326e6428a5db6b7a6e08f40fa1e5ac77bc6f (diff) | |
download | st-4e6915a16b75c1e79142e15a9b23e761140d4e9b.tar.gz st-4e6915a16b75c1e79142e15a9b23e761140d4e9b.zip |
Fixed possible segfault by reverting to the key struct (again).
-rw-r--r-- | config.h | 21 | ||||
-rw-r--r-- | st.c | 21 |
2 files changed, 29 insertions, 13 deletions
@@ -24,16 +24,15 @@ static const char *colorname[] = { | |||
24 | #define DefaultCS 1 | 24 | #define DefaultCS 1 |
25 | #define BellCol DefaultFG | 25 | #define BellCol DefaultFG |
26 | 26 | ||
27 | |||
28 | /* special keys */ | 27 | /* special keys */ |
29 | static const char *key[] = { | 28 | static Key key[] = { |
30 | [XK_Delete] = "\033[3~", | 29 | { XK_Delete, "\033[3~" }, |
31 | [XK_Home] = "\033[1~", | 30 | { XK_Home, "\033[1~" }, |
32 | [XK_End] = "\033[4~", | 31 | { XK_End, "\033[4~" }, |
33 | [XK_Prior] = "\033[5~", | 32 | { XK_Prior, "\033[5~" }, |
34 | [XK_Next] = "\033[6~", | 33 | { XK_Next, "\033[6~" }, |
35 | [XK_Left] = "\033[D", | 34 | { XK_Left, "\033[D" }, |
36 | [XK_Right] = "\033[C", | 35 | { XK_Right, "\033[C" }, |
37 | [XK_Up] = "\033[A", | 36 | { XK_Up, "\033[A" }, |
38 | [XK_Down] = "\033[B", | 37 | { XK_Down, "\033[B" }, |
39 | }; | 38 | }; |
@@ -93,6 +93,11 @@ typedef struct { | |||
93 | int cw; /* char width */ | 93 | int cw; /* char width */ |
94 | } XWindow; | 94 | } XWindow; |
95 | 95 | ||
96 | typedef struct { | ||
97 | KeySym k; | ||
98 | char s[ESCSIZ]; | ||
99 | } Key; | ||
100 | |||
96 | #include "config.h" | 101 | #include "config.h" |
97 | 102 | ||
98 | /* Drawing Context */ | 103 | /* Drawing Context */ |
@@ -146,6 +151,7 @@ static void xinit(void); | |||
146 | static void xscroll(void); | 151 | static void xscroll(void); |
147 | 152 | ||
148 | static void expose(XEvent *); | 153 | static void expose(XEvent *); |
154 | static char * kmap(KeySym); | ||
149 | static void kpress(XEvent *); | 155 | static void kpress(XEvent *); |
150 | static void resize(XEvent *); | 156 | static void resize(XEvent *); |
151 | 157 | ||
@@ -1005,11 +1011,21 @@ expose(XEvent *ev) { | |||
1005 | draw(SCredraw); | 1011 | draw(SCredraw); |
1006 | } | 1012 | } |
1007 | 1013 | ||
1014 | char * | ||
1015 | kmap(KeySym k) { | ||
1016 | int i; | ||
1017 | for(i = 0; i < LEN(key); i++) | ||
1018 | if(key[i].k == k) | ||
1019 | return (char*)key[i].s; | ||
1020 | return NULL; | ||
1021 | } | ||
1022 | |||
1008 | void | 1023 | void |
1009 | kpress(XEvent *ev) { | 1024 | kpress(XEvent *ev) { |
1010 | XKeyEvent *e = &ev->xkey; | 1025 | XKeyEvent *e = &ev->xkey; |
1011 | KeySym ksym; | 1026 | KeySym ksym; |
1012 | char buf[32]; | 1027 | char buf[32]; |
1028 | char *customkey; | ||
1013 | int len; | 1029 | int len; |
1014 | int meta; | 1030 | int meta; |
1015 | int shift; | 1031 | int shift; |
@@ -1017,8 +1033,9 @@ kpress(XEvent *ev) { | |||
1017 | meta = e->state & Mod1Mask; | 1033 | meta = e->state & Mod1Mask; |
1018 | shift = e->state & ShiftMask; | 1034 | shift = e->state & ShiftMask; |
1019 | len = XLookupString(e, buf, sizeof(buf), &ksym, NULL); | 1035 | len = XLookupString(e, buf, sizeof(buf), &ksym, NULL); |
1020 | if(key[ksym]) | 1036 | |
1021 | ttywrite(key[ksym], strlen(key[ksym])); | 1037 | if(customkey = kmap(ksym)) |
1038 | ttywrite(customkey, strlen(customkey)); | ||
1022 | else if(len > 0) { | 1039 | else if(len > 0) { |
1023 | buf[sizeof(buf)-1] = '\0'; | 1040 | buf[sizeof(buf)-1] = '\0'; |
1024 | if(meta && len == 1) | 1041 | if(meta && len == 1) |