Mercurial > repos > blastem
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 { |