comparison nuklear_ui/blastem_nuklear.c @ 1522:63659fb92db4 nuklear_ui

Key binding menu is now functional
author Michael Pavone <pavone@retrodev.com>
date Tue, 06 Feb 2018 22:42:16 -0800
parents a51721408c15
children 9bea1a199f15
comparison
equal deleted inserted replaced
1521:a51721408c15 1522:63659fb92db4
233 } 233 }
234 tern_node **binding_lookup = data; 234 tern_node **binding_lookup = data;
235 *binding_lookup = tern_insert_ptr(*binding_lookup, val.ptrval, strdup(key)); 235 *binding_lookup = tern_insert_ptr(*binding_lookup, val.ptrval, strdup(key));
236 } 236 }
237 237
238 static int32_t keycode;
238 static const char *set_binding; 239 static const char *set_binding;
239 char *set_label; 240 char *set_label;
240 void binding_group(struct nk_context *context, char *name, const char **binds, const char **bind_names, uint32_t num_binds, tern_node *binding_lookup) 241 void binding_group(struct nk_context *context, char *name, const char **binds, const char **bind_names, uint32_t num_binds, tern_node *binding_lookup)
241 { 242 {
242 nk_layout_row_static(context, 34*num_binds+60, render_width() - 80, 1); 243 nk_layout_row_static(context, 34*num_binds+60, render_width() - 80, 1);
252 } 253 }
253 nk_label(context, label, NK_TEXT_LEFT); 254 nk_label(context, label, NK_TEXT_LEFT);
254 if (nk_button_label(context, tern_find_ptr_default(binding_lookup, binds[i], "Not Set"))) { 255 if (nk_button_label(context, tern_find_ptr_default(binding_lookup, binds[i], "Not Set"))) {
255 set_binding = binds[i]; 256 set_binding = binds[i];
256 set_label = strdup(label); 257 set_label = strdup(label);
258 keycode = 0;
257 } 259 }
258 if (label_alloc) { 260 if (label_alloc) {
259 free(label_alloc); 261 free(label_alloc);
260 } 262 }
261 } 263 }
262 nk_group_end(context); 264 nk_group_end(context);
263 } 265 }
266 }
267
268 static char *get_key_name(int32_t keycode)
269 {
270 char *name = NULL;
271 if (keycode > ' ' && keycode < 0x80) {
272 //key corresponds to a printable non-whitespace character
273 name = malloc(2);
274 name[0] = keycode;
275 name[1] = 0;
276 } else {
277 switch (keycode)
278 {
279 case RENDERKEY_UP: name = "up"; break;
280 case RENDERKEY_DOWN: name = "down"; break;
281 case RENDERKEY_LEFT: name = "left"; break;
282 case RENDERKEY_RIGHT: name = "right"; break;
283 case '\r': name = "enter"; break;
284 case ' ': name = "space"; break;
285 case '\t': name = "tab"; break;
286 case '\b': name = "backspace"; break;
287 case RENDERKEY_ESC: name = "esc"; break;
288 case RENDERKEY_DEL: name = "delete"; break;
289 case RENDERKEY_LSHIFT: name = "lshift"; break;
290 case RENDERKEY_RSHIFT: name = "rshift"; break;
291 case RENDERKEY_LCTRL: name = "lctrl"; break;
292 case RENDERKEY_RCTRL: name = "rctrl"; break;
293 case RENDERKEY_LALT: name = "lalt"; break;
294 case RENDERKEY_RALT: name = "ralt"; break;
295 case RENDERKEY_HOME: name = "home"; break;
296 case RENDERKEY_END: name = "end"; break;
297 case RENDERKEY_PAGEUP: name = "pageup"; break;
298 case RENDERKEY_PAGEDOWN: name = "pagedown"; break;
299 case RENDERKEY_F1: name = "f1"; break;
300 case RENDERKEY_F2: name = "f2"; break;
301 case RENDERKEY_F3: name = "f3"; break;
302 case RENDERKEY_F4: name = "f4"; break;
303 case RENDERKEY_F5: name = "f5"; break;
304 case RENDERKEY_F6: name = "f6"; break;
305 case RENDERKEY_F7: name = "f7"; break;
306 case RENDERKEY_F8: name = "f8"; break;
307 case RENDERKEY_F9: name = "f9"; break;
308 case RENDERKEY_F10: name = "f10"; break;
309 case RENDERKEY_F11: name = "f11"; break;
310 case RENDERKEY_F12: name = "f12"; break;
311 case RENDERKEY_SELECT: name = "select"; break;
312 case RENDERKEY_PLAY: name = "play"; break;
313 case RENDERKEY_SEARCH: name = "search"; break;
314 case RENDERKEY_BACK: name = "back"; break;
315 }
316 if (name) {
317 name = strdup(name);
318 }
319 }
320 return name;
264 } 321 }
265 322
266 void view_key_bindings(struct nk_context *context) 323 void view_key_bindings(struct nk_context *context)
267 { 324 {
268 const char *controller1_binds[] = { 325 const char *controller1_binds[] = {
280 const char *general_binds[] = { 337 const char *general_binds[] = {
281 "ui.exit", "ui.save_state", "ui.toggle_fullscreen", "ui.soft_reset", "ui.reload", 338 "ui.exit", "ui.save_state", "ui.toggle_fullscreen", "ui.soft_reset", "ui.reload",
282 "ui.screenshot", "ui.sms_pause", "ui.toggle_keyboard_cpatured", "ui.release_mouse" 339 "ui.screenshot", "ui.sms_pause", "ui.toggle_keyboard_cpatured", "ui.release_mouse"
283 }; 340 };
284 const char *general_names[] = { 341 const char *general_names[] = {
285 "Show Menu", "Quick Save", "Toggle Fullscreen", "Soft Reset", "Reload Media" 342 "Show Menu", "Quick Save", "Toggle Fullscreen", "Soft Reset", "Reload Media",
286 "Internal Screenshot", "SMS Pause", "Capture Keyboard", "Release Mouse" 343 "Internal Screenshot", "SMS Pause", "Capture Keyboard", "Release Mouse"
287 }; 344 };
288 const char *speed_binds[] = { 345 const char *speed_binds[] = {
289 "ui.next_speed", "ui.prev_speed", 346 "ui.next_speed", "ui.prev_speed",
290 "ui.set_speed.0", "ui.set_speed.1", "ui.set_speed.2" ,"ui.set_speed.3", "ui.set_speed.4", 347 "ui.set_speed.0", "ui.set_speed.1", "ui.set_speed.2" ,"ui.set_speed.3", "ui.set_speed.4",
327 if (set_binding && nk_begin(context, "Set Binding", nk_rect(width/4, height/4, width/2/*width*3/4*/, height/2), NK_WINDOW_TITLE | NK_WINDOW_BORDER)) { 384 if (set_binding && nk_begin(context, "Set Binding", nk_rect(width/4, height/4, width/2/*width*3/4*/, height/2), NK_WINDOW_TITLE | NK_WINDOW_BORDER)) {
328 nk_layout_row_static(context, 30, width/2-30, 1); 385 nk_layout_row_static(context, 30, width/2-30, 1);
329 nk_label(context, "Press new key for", NK_TEXT_CENTERED); 386 nk_label(context, "Press new key for", NK_TEXT_CENTERED);
330 nk_label(context, set_label, NK_TEXT_CENTERED); 387 nk_label(context, set_label, NK_TEXT_CENTERED);
331 if (nk_button_label(context, "Cancel")) { 388 if (nk_button_label(context, "Cancel")) {
389 free(set_label);
390 set_binding = set_label = NULL;
391 } else if (keycode) {
392 char *name = get_key_name(keycode);
393 if (name) {
394 uint32_t prefix_len = strlen("bindings") + strlen("keys") + 2;
395 char * old = tern_find_ptr(binding_lookup, set_binding);
396 if (old) {
397 uint32_t suffix_len = strlen(old) + 1;
398 char *old_path = malloc(prefix_len + suffix_len + 1);
399 memcpy(old_path, "bindings\0keys\0", prefix_len);
400 memcpy(old_path + prefix_len, old, suffix_len);
401 old_path[prefix_len + suffix_len] = 0;
402 tern_val old_val;
403 if (tern_delete_path(&config, old_path, &old_val) == TVAL_PTR) {
404 free(old_val.ptrval);
405 }
406 }
407 uint32_t suffix_len = strlen(name) + 1;
408 char *path = malloc(prefix_len + suffix_len + 1);
409 memcpy(path, "bindings\0keys\0", prefix_len);
410 memcpy(path + prefix_len, name, suffix_len);
411 path[prefix_len + suffix_len] = 0;
412
413 config = tern_insert_path(config, path, (tern_val){.ptrval = strdup(set_binding)}, TVAL_PTR);
414 free(path);
415 free(name);
416 tern_free(binding_lookup);
417 binding_lookup = NULL;
418 }
332 free(set_label); 419 free(set_label);
333 set_binding = set_label = NULL; 420 set_binding = set_label = NULL;
334 } 421 }
335 nk_end(context); 422 nk_end(context);
336 } 423 }
751 render_update_display(); 838 render_update_display();
752 } 839 }
753 } 840 }
754 static void handle_event(SDL_Event *event) 841 static void handle_event(SDL_Event *event)
755 { 842 {
843 if (event->type == SDL_KEYDOWN) {
844 keycode = event->key.keysym.sym;
845 }
756 nk_sdl_handle_event(event); 846 nk_sdl_handle_event(event);
757 } 847 }
758 848
759 static void context_destroyed(void) 849 static void context_destroyed(void)
760 { 850 {