| 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 { |