console/libgnt/gntstyle.c

changeset 14855
84c869823944
parent 14397
e53755c4dcab
child 14898
107b971b39f2
equal deleted inserted replaced
14854:0a2391b774a4 14855:84c869823944
77 s++; 77 s++;
78 } 78 }
79 *t = '\0'; 79 *t = '\0';
80 } 80 }
81 81
82 void gnt_styles_get_keyremaps(GType type, GHashTable *hash) 82 static char *
83 parse_key(const char *key)
84 {
85 char *ret = NULL;
86 int ctrl = 0, alt = 0;
87 char k;
88
89 /* XXX: Need to do something about ctrl/alt+home, end etc. */
90
91 #define SPECIAL_KEY(k, code) do { \
92 if (strncasecmp(key, k, sizeof(k) - 1) == 0) \
93 return g_strdup(code); \
94 } while (0)
95
96 SPECIAL_KEY("home", "\033" GNT_KEY_HOME);
97 SPECIAL_KEY("end", "\033" GNT_KEY_END);
98 SPECIAL_KEY("pageup", "\033" GNT_KEY_PGUP);
99 SPECIAL_KEY("pagedown", "\033" GNT_KEY_PGDOWN);
100 SPECIAL_KEY("insert", "\033" GNT_KEY_INS);
101 SPECIAL_KEY("delete", "\033" GNT_KEY_DEL);
102
103 SPECIAL_KEY("left", "\033" GNT_KEY_LEFT);
104 SPECIAL_KEY("right", "\033" GNT_KEY_RIGHT);
105 SPECIAL_KEY("up", "\033" GNT_KEY_UP);
106 SPECIAL_KEY("down", "\033" GNT_KEY_DOWN);
107
108 SPECIAL_KEY("tab", "\t");
109 SPECIAL_KEY("menu", "\033" GNT_KEY_POPUP);
110
111 SPECIAL_KEY("f1", "\033" GNT_KEY_F1);
112 SPECIAL_KEY("f2", "\033" GNT_KEY_F2);
113 SPECIAL_KEY("f3", "\033" GNT_KEY_F3);
114 SPECIAL_KEY("f4", "\033" GNT_KEY_F4);
115 SPECIAL_KEY("f5", "\033" GNT_KEY_F5);
116 SPECIAL_KEY("f6", "\033" GNT_KEY_F6);
117 SPECIAL_KEY("f7", "\033" GNT_KEY_F7);
118 SPECIAL_KEY("f8", "\033" GNT_KEY_F8);
119 SPECIAL_KEY("f9", "\033" GNT_KEY_F9);
120 SPECIAL_KEY("f10", "\033" GNT_KEY_F10);
121 SPECIAL_KEY("f11", "\033" GNT_KEY_F11);
122 SPECIAL_KEY("f12", "\033" GNT_KEY_F12);
123
124 #undef SPECIAL_KEY
125
126 #define MATCH(string, var) do { \
127 if (strncasecmp(key, string, sizeof(string) - 1) == 0) { \
128 key += sizeof(string) - 1; \
129 var = 1; \
130 } \
131 }while (0)
132
133 MATCH("c-", ctrl);
134 MATCH("ctl-", ctrl);
135 MATCH("ctr-", ctrl);
136 MATCH("ctrl-", ctrl);
137
138 MATCH("alt-", alt);
139 MATCH("a-", alt);
140 MATCH("m-", alt);
141 MATCH("meta-", alt);
142
143 if (strlen(key) != 1) /* We can only have stuff like "ctrl-alt-a" */
144 return NULL;
145
146 if (ctrl && (strchr("hijm", *key) != NULL || !isalpha(*key))) {
147 /* These keys cannot be used with ctrl */
148 return NULL;
149 }
150
151 if (ctrl)
152 k = *key | 0x20;
153 else
154 k = *key;
155
156 ret = g_strdup_printf("%s%c", alt ? "\033" : "", ctrl ? k - 0x60 : k);
157
158 #undef MATCH
159
160 return ret;
161 }
162
163 void gnt_style_read_actions(GType type, GntWidgetClass *klass)
83 { 164 {
84 #if GLIB_CHECK_VERSION(2,6,0) 165 #if GLIB_CHECK_VERSION(2,6,0)
85 char *name; 166 char *name;
86 GError *error = NULL; 167 GError *error = NULL;
87 168
88 name = g_strdup_printf("%s::remap", g_type_name(type)); 169 name = g_strdup_printf("%s::binding", g_type_name(type));
89 170
90 if (g_key_file_has_group(gkfile, name)) 171 if (g_key_file_has_group(gkfile, name))
91 { 172 {
92 unsigned int len = 0; 173 unsigned int len = 0;
93 char **keys; 174 char **keys;
95 keys = g_key_file_get_keys(gkfile, name, &len, &error); 176 keys = g_key_file_get_keys(gkfile, name, &len, &error);
96 if (error) 177 if (error)
97 { 178 {
98 g_printerr("GntStyle: %s\n", error->message); 179 g_printerr("GntStyle: %s\n", error->message);
99 g_error_free(error); 180 g_error_free(error);
181 g_free(name);
182 return;
183 }
184
185 while (len--)
186 {
187 char *key, *action;
188
189 key = g_strdup(keys[len]);
190 action = g_key_file_get_string(gkfile, name, keys[len], &error);
191
192 if (error)
193 {
194 g_printerr("GntStyle: %s\n", error->message);
195 g_error_free(error);
196 error = NULL;
197 }
198 else
199 {
200 char *keycode = parse_key(key);
201 if (keycode == NULL) {
202 g_printerr("GntStyle: Invalid key-binding %s\n", key);
203 } else {
204 gnt_widget_register_binding(klass, action, keycode, NULL);
205 g_free(keycode);
206 }
207 }
208 g_free(key);
209 g_free(action);
210 }
211 g_strfreev(keys);
212 }
213 g_free(name);
214 #endif
215 }
216
217 void gnt_styles_get_keyremaps(GType type, GHashTable *hash)
218 {
219 #if GLIB_CHECK_VERSION(2,6,0)
220 char *name;
221 GError *error = NULL;
222
223 name = g_strdup_printf("%s::remap", g_type_name(type));
224
225 if (g_key_file_has_group(gkfile, name))
226 {
227 unsigned int len = 0;
228 char **keys;
229
230 keys = g_key_file_get_keys(gkfile, name, &len, &error);
231 if (error)
232 {
233 g_printerr("GntStyle: %s\n", error->message);
234 g_error_free(error);
235 g_free(name);
100 return; 236 return;
101 } 237 }
102 238
103 while (len--) 239 while (len--)
104 { 240 {

mercurial