Use textbox shortcuts from the host platform
This commit is contained in:
		
							parent
							
								
									7755827485
								
							
						
					
					
						commit
						a6f81a1320
					
				|  | @ -212,7 +212,6 @@ extern "C" | ||||||
|         OC_KEYMOD_SHIFT = 0x02, |         OC_KEYMOD_SHIFT = 0x02, | ||||||
|         OC_KEYMOD_CTRL = 0x04, |         OC_KEYMOD_CTRL = 0x04, | ||||||
|         OC_KEYMOD_CMD = 0x08, |         OC_KEYMOD_CMD = 0x08, | ||||||
|         OC_KEYMOD_MAIN_MODIFIER = 0x16 /* CMD on Mac, CTRL on Win32 */ |  | ||||||
|     } oc_keymod_flags; |     } oc_keymod_flags; | ||||||
| 
 | 
 | ||||||
|     typedef enum |     typedef enum | ||||||
|  |  | ||||||
|  | @ -215,7 +215,6 @@ static oc_keymod_flags oc_convert_osx_mods(NSUInteger nsFlags) | ||||||
|     if(nsFlags & NSEventModifierFlagCommand) |     if(nsFlags & NSEventModifierFlagCommand) | ||||||
|     { |     { | ||||||
|         mods |= OC_KEYMOD_CMD; |         mods |= OC_KEYMOD_CMD; | ||||||
|         mods |= OC_KEYMOD_MAIN_MODIFIER; |  | ||||||
|     } |     } | ||||||
|     return (mods); |     return (mods); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -196,7 +196,6 @@ static oc_keymod_flags oc_get_mod_keys() | ||||||
|     if(GetKeyState(VK_CONTROL) & 0x8000) |     if(GetKeyState(VK_CONTROL) & 0x8000) | ||||||
|     { |     { | ||||||
|         mods |= OC_KEYMOD_CTRL; |         mods |= OC_KEYMOD_CTRL; | ||||||
|         mods |= OC_KEYMOD_MAIN_MODIFIER; |  | ||||||
|     } |     } | ||||||
|     if(GetKeyState(VK_MENU) & 0x8000) |     if(GetKeyState(VK_MENU) & 0x8000) | ||||||
|     { |     { | ||||||
|  |  | ||||||
|  | @ -20,6 +20,7 @@ | ||||||
|     #include "platform/win32_path.c" |     #include "platform/win32_path.c" | ||||||
|     #include "platform/win32_io.c" |     #include "platform/win32_io.c" | ||||||
|     #include "platform/win32_thread.c" |     #include "platform/win32_thread.c" | ||||||
|  |     #include "platform/win32_platform.c" | ||||||
| //TODO
 | //TODO
 | ||||||
| #elif OC_PLATFORM_MACOS | #elif OC_PLATFORM_MACOS | ||||||
|     #include "platform/native_debug.c" |     #include "platform/native_debug.c" | ||||||
|  | @ -27,6 +28,7 @@ | ||||||
|     #include "platform/osx_clock.c" |     #include "platform/osx_clock.c" | ||||||
|     #include "platform/posix_io.c" |     #include "platform/posix_io.c" | ||||||
|     #include "platform/posix_thread.c" |     #include "platform/posix_thread.c" | ||||||
|  |     #include "platform/osx_platform.c" | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| 	#include"platform/unix_rng.c" | 	#include"platform/unix_rng.c" | ||||||
|  | @ -50,6 +52,7 @@ | ||||||
|     #include "platform/orca_malloc.c" |     #include "platform/orca_malloc.c" | ||||||
|     #include "platform/platform_io_common.c" |     #include "platform/platform_io_common.c" | ||||||
|     #include "platform/orca_io_stubs.c" |     #include "platform/orca_io_stubs.c" | ||||||
|  |     #include "platform/orca_platform.c" | ||||||
| #else | #else | ||||||
|     #error "Unsupported platform" |     #error "Unsupported platform" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | #include "platform.h" | ||||||
|  | 
 | ||||||
|  | oc_host_platform ORCA_IMPORT(oc_get_host_platform_impl)(); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" | ||||||
|  | { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	oc_host_platform oc_get_host_platform() | ||||||
|  | 	{ | ||||||
|  | 		return oc_get_host_platform_impl(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } // extern "C"
 | ||||||
|  | #endif | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | #include "platform.h" | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" | ||||||
|  | { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	oc_host_platform oc_get_host_platform() | ||||||
|  | 	{ | ||||||
|  | 		return OC_HOST_PLATFORM_MACOS; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } // extern "C"
 | ||||||
|  | #endif | ||||||
|  | @ -108,4 +108,21 @@ | ||||||
|     #endif |     #endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" | ||||||
|  | { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     typedef enum | ||||||
|  |     { | ||||||
|  |         OC_HOST_PLATFORM_MACOS, | ||||||
|  |         OC_HOST_PLATFORM_WINDOWS, | ||||||
|  |     } oc_host_platform; | ||||||
|  | 
 | ||||||
|  |     ORCA_API oc_host_platform oc_get_host_platform(); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } // extern "C"
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #endif // __PLATFORM_H_
 | #endif // __PLATFORM_H_
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | #include "platform.h" | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" | ||||||
|  | { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	oc_host_platform oc_get_host_platform() | ||||||
|  | 	{ | ||||||
|  | 		return OC_HOST_PLATFORM_WINDOWS; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } // extern "C"
 | ||||||
|  | #endif | ||||||
							
								
								
									
										144
									
								
								src/ui/ui.c
								
								
								
								
							
							
						
						
									
										144
									
								
								src/ui/ui.c
								
								
								
								
							|  | @ -2300,7 +2300,7 @@ typedef struct oc_ui_edit_command | ||||||
| 
 | 
 | ||||||
| } oc_ui_edit_command; | } oc_ui_edit_command; | ||||||
| 
 | 
 | ||||||
| const oc_ui_edit_command OC_UI_EDIT_COMMANDS[] = { | const oc_ui_edit_command OC_UI_EDIT_COMMANDS_MACOS[] = { | ||||||
|     //NOTE(martin): move one left
 |     //NOTE(martin): move one left
 | ||||||
|     { |     { | ||||||
|         .key = OC_KEY_LEFT, |         .key = OC_KEY_LEFT, | ||||||
|  | @ -2376,7 +2376,7 @@ const oc_ui_edit_command OC_UI_EDIT_COMMANDS[] = { | ||||||
|     //NOTE(martin): select all
 |     //NOTE(martin): select all
 | ||||||
|     { |     { | ||||||
|         .key = OC_KEY_Q, |         .key = OC_KEY_Q, | ||||||
|         .mods = OC_KEYMOD_MAIN_MODIFIER, |         .mods = OC_KEYMOD_CMD, | ||||||
|         .operation = OC_UI_EDIT_SELECT_ALL, |         .operation = OC_UI_EDIT_SELECT_ALL, | ||||||
|         .move = OC_UI_EDIT_MOVE_NONE }, |         .move = OC_UI_EDIT_MOVE_NONE }, | ||||||
|     //NOTE(martin): delete
 |     //NOTE(martin): delete
 | ||||||
|  | @ -2394,24 +2394,134 @@ const oc_ui_edit_command OC_UI_EDIT_COMMANDS[] = { | ||||||
|     //NOTE(martin): cut
 |     //NOTE(martin): cut
 | ||||||
|     { |     { | ||||||
|         .key = OC_KEY_X, |         .key = OC_KEY_X, | ||||||
|         .mods = OC_KEYMOD_MAIN_MODIFIER, |         .mods = OC_KEYMOD_CMD, | ||||||
|         .operation = OC_UI_EDIT_CUT, |         .operation = OC_UI_EDIT_CUT, | ||||||
|         .move = OC_UI_EDIT_MOVE_NONE }, |         .move = OC_UI_EDIT_MOVE_NONE }, | ||||||
|     //NOTE(martin): copy
 |     //NOTE(martin): copy
 | ||||||
|     { |     { | ||||||
|         .key = OC_KEY_C, |         .key = OC_KEY_C, | ||||||
|         .mods = OC_KEYMOD_MAIN_MODIFIER, |         .mods = OC_KEYMOD_CMD, | ||||||
|         .operation = OC_UI_EDIT_COPY, |         .operation = OC_UI_EDIT_COPY, | ||||||
|         .move = OC_UI_EDIT_MOVE_NONE }, |         .move = OC_UI_EDIT_MOVE_NONE }, | ||||||
|     //NOTE(martin): paste
 |     //NOTE(martin): paste
 | ||||||
|     { |     { | ||||||
|         .key = OC_KEY_V, |         .key = OC_KEY_V, | ||||||
|         .mods = OC_KEYMOD_MAIN_MODIFIER, |         .mods = OC_KEYMOD_CMD, | ||||||
|         .operation = OC_UI_EDIT_PASTE, |         .operation = OC_UI_EDIT_PASTE, | ||||||
|         .move = OC_UI_EDIT_MOVE_NONE } |         .move = OC_UI_EDIT_MOVE_NONE } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const u32 OC_UI_EDIT_COMMAND_COUNT = sizeof(OC_UI_EDIT_COMMANDS) / sizeof(oc_ui_edit_command); | const oc_ui_edit_command OC_UI_EDIT_COMMANDS_WINDOWS[] = { | ||||||
|  |     //NOTE(martin): move one left
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_LEFT, | ||||||
|  |         .operation = OC_UI_EDIT_MOVE, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_ONE, | ||||||
|  |         .direction = -1 }, | ||||||
|  |     //NOTE(martin): move one right
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_RIGHT, | ||||||
|  |         .operation = OC_UI_EDIT_MOVE, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_ONE, | ||||||
|  |         .direction = 1 }, | ||||||
|  |     //NOTE(martin): move start
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_HOME, | ||||||
|  |         .operation = OC_UI_EDIT_MOVE, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_LINE, | ||||||
|  |         .direction = -1 }, | ||||||
|  |     { .key = OC_KEY_UP, | ||||||
|  |       .operation = OC_UI_EDIT_MOVE, | ||||||
|  |       .move = OC_UI_EDIT_MOVE_LINE, | ||||||
|  |       .direction = -1 }, | ||||||
|  |     //NOTE(martin): move end
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_END, | ||||||
|  |         .operation = OC_UI_EDIT_MOVE, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_LINE, | ||||||
|  |         .direction = 1 }, | ||||||
|  |     { .key = OC_KEY_DOWN, | ||||||
|  |       .operation = OC_UI_EDIT_MOVE, | ||||||
|  |       .move = OC_UI_EDIT_MOVE_LINE, | ||||||
|  |       .direction = 1 }, | ||||||
|  |     //NOTE(martin): select one left
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_LEFT, | ||||||
|  |         .mods = OC_KEYMOD_SHIFT, | ||||||
|  |         .operation = OC_UI_EDIT_SELECT, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_ONE, | ||||||
|  |         .direction = -1 }, | ||||||
|  |     //NOTE(martin): select one right
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_RIGHT, | ||||||
|  |         .mods = OC_KEYMOD_SHIFT, | ||||||
|  |         .operation = OC_UI_EDIT_SELECT, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_ONE, | ||||||
|  |         .direction = 1 }, | ||||||
|  |     //NOTE(martin): extend select to start
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_HOME, | ||||||
|  |         .mods = OC_KEYMOD_SHIFT, | ||||||
|  |         .operation = OC_UI_EDIT_SELECT_EXTEND, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_LINE, | ||||||
|  |         .direction = -1 }, | ||||||
|  |     { .key = OC_KEY_UP, | ||||||
|  |       .mods = OC_KEYMOD_SHIFT, | ||||||
|  |       .operation = OC_UI_EDIT_SELECT_EXTEND, | ||||||
|  |       .move = OC_UI_EDIT_MOVE_LINE, | ||||||
|  |       .direction = -1 }, | ||||||
|  |     //NOTE(martin): extend select to end
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_END, | ||||||
|  |         .mods = OC_KEYMOD_SHIFT, | ||||||
|  |         .operation = OC_UI_EDIT_SELECT_EXTEND, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_LINE, | ||||||
|  |         .direction = 1 }, | ||||||
|  |     { .key = OC_KEY_DOWN, | ||||||
|  |       .mods = OC_KEYMOD_SHIFT, | ||||||
|  |       .operation = OC_UI_EDIT_SELECT_EXTEND, | ||||||
|  |       .move = OC_UI_EDIT_MOVE_LINE, | ||||||
|  |       .direction = 1 }, | ||||||
|  |     //NOTE(martin): select all
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_A, | ||||||
|  |         .mods = OC_KEYMOD_CTRL, | ||||||
|  |         .operation = OC_UI_EDIT_SELECT_ALL, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_NONE }, | ||||||
|  |     //NOTE(martin): delete
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_DELETE, | ||||||
|  |         .operation = OC_UI_EDIT_DELETE, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_ONE, | ||||||
|  |         .direction = 1 }, | ||||||
|  |     //NOTE(martin): backspace
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_BACKSPACE, | ||||||
|  |         .operation = OC_UI_EDIT_DELETE, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_ONE, | ||||||
|  |         .direction = -1 }, | ||||||
|  |     //NOTE(martin): cut
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_X, | ||||||
|  |         .mods = OC_KEYMOD_CTRL, | ||||||
|  |         .operation = OC_UI_EDIT_CUT, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_NONE }, | ||||||
|  |     //NOTE(martin): copy
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_C, | ||||||
|  |         .mods = OC_KEYMOD_CTRL, | ||||||
|  |         .operation = OC_UI_EDIT_COPY, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_NONE }, | ||||||
|  |     //NOTE(martin): paste
 | ||||||
|  |     { | ||||||
|  |         .key = OC_KEY_V, | ||||||
|  |         .mods = OC_KEYMOD_CTRL, | ||||||
|  |         .operation = OC_UI_EDIT_PASTE, | ||||||
|  |         .move = OC_UI_EDIT_MOVE_NONE } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const u32 OC_UI_EDIT_COMMAND_MACOS_COUNT = sizeof(OC_UI_EDIT_COMMANDS_MACOS) / sizeof(oc_ui_edit_command); | ||||||
|  | const u32 OC_UI_EDIT_COMMAND_WINDOWS_COUNT = sizeof(OC_UI_EDIT_COMMANDS_WINDOWS) / sizeof(oc_ui_edit_command); | ||||||
| 
 | 
 | ||||||
| void oc_ui_edit_perform_move(oc_ui_context* ui, oc_ui_edit_move move, int direction, u32 textLen) | void oc_ui_edit_perform_move(oc_ui_context* ui, oc_ui_edit_move move, int direction, u32 textLen) | ||||||
| { | { | ||||||
|  | @ -2733,10 +2843,26 @@ oc_ui_text_box_result oc_ui_text_box(const char* name, oc_arena* arena, oc_str8 | ||||||
| 
 | 
 | ||||||
|         //NOTE handle shortcuts
 |         //NOTE handle shortcuts
 | ||||||
|         oc_keymod_flags mods = oc_key_mods(&ui->input); |         oc_keymod_flags mods = oc_key_mods(&ui->input); | ||||||
| 
 |         const oc_ui_edit_command*  editCommands; | ||||||
|         for(int i = 0; i < OC_UI_EDIT_COMMAND_COUNT; i++) |         u32 editCommandCount; | ||||||
|  |         oc_host_platform hostPlatform = oc_get_host_platform(); | ||||||
|  |         switch(hostPlatform) | ||||||
|         { |         { | ||||||
|             const oc_ui_edit_command* command = &(OC_UI_EDIT_COMMANDS[i]); |             case OC_HOST_PLATFORM_MACOS: | ||||||
|  |                 editCommands = OC_UI_EDIT_COMMANDS_MACOS; | ||||||
|  |                 editCommandCount = OC_UI_EDIT_COMMAND_MACOS_COUNT; | ||||||
|  |                 break; | ||||||
|  |             case OC_HOST_PLATFORM_WINDOWS: | ||||||
|  |                 editCommands = OC_UI_EDIT_COMMANDS_WINDOWS; | ||||||
|  |                 editCommandCount = OC_UI_EDIT_COMMAND_WINDOWS_COUNT; | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 OC_ASSERT(0, "unknown host platform: %i", hostPlatform); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         for(int i = 0; i < editCommandCount; i++) | ||||||
|  |         { | ||||||
|  |             const oc_ui_edit_command* command = &(editCommands[i]); | ||||||
| 
 | 
 | ||||||
|             if((oc_key_pressed(&ui->input, command->key) || oc_key_repeated(&ui->input, command->key)) |             if((oc_key_pressed(&ui->input, command->key) || oc_key_repeated(&ui->input, command->key)) | ||||||
|                && mods == command->mods) |                && mods == command->mods) | ||||||
|  |  | ||||||
|  | @ -57,5 +57,11 @@ | ||||||
| 			  {"name": "note", | 			  {"name": "note", | ||||||
| 			   "type": {"name": "const char*", "tag": "p"}} | 			   "type": {"name": "const char*", "tag": "p"}} | ||||||
| 			] | 			] | ||||||
|  | }, | ||||||
|  | { | ||||||
|  | 	"name": "oc_get_host_platform_impl", | ||||||
|  | 	"cname": "oc_get_host_platform", | ||||||
|  | 	"ret": {"name": "int", "tag": "i"}, | ||||||
|  | 	"args": [] | ||||||
| } | } | ||||||
| ] | ] | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue