PR fixes. Removed all keyboard callback code as it can be accomplished with nk_edit flags

This commit is contained in:
seibelj 2017-01-06 14:09:44 -05:00
parent e6798bc1b4
commit 7dbd9f910e
4 changed files with 14 additions and 32 deletions

View File

@ -12,12 +12,21 @@ You must link with image, font, ttf, and primitives Allegro addons. See the `Mak
Like every nuklear backend, handling many different resolutions and resolution densities can be tricky. 14px font on a desktop may be perfect, but extremely small on a retina iPad. I recommend writing a middleware that will detect what kind of screen is being used, and modify the sizes of widgets accordingly.
## Soft Keyboard for Touch Screen Devices
For keyboard support on devices without hardware keyboards (iOS, Android, etc.) you should define `NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD` and pass open and close keyboard functions to `nk_allegro5_init()`. See the `main.c` demo for more information.
Information on how to implement soft keyboard callbacks for Android can be on the Allegro community wiki: https://wiki.allegro.cc/index.php?title=Running_Allegro_applications_on_Android#Displaying_the_Android_keyboard
To display a soft keyboard on iOS, you must create a `UIView` subclass that implements the `UIKeyInput` interface. See `KeyboardHandleriOS.h` and `KeyboardHandleriOS.m` Objective-C source code files for an example on how to do this. As the Allegro keyboard driver does not currently listen for iOS events, we use a custom event emitter to emit keyboard events, which is passed in after initialization with `(void)setCustomKeyboardEventSource:(ALLEGRO_EVENT_SOURCE *)ev_src`. This causes normal keyboard events to be emitted and properly caught by the nuklear backend. The provided `main.c` demo file does not implement this, but with the provided source code files it is not difficult to do. See this Allegro community forum thread for more information: https://www.allegro.cc/forums/thread/616672
To know when nuklear wants to open and close the keyboard, you can check edit widget flags:
```
nk_flags ed_flags = nk_edit_string(ctx, NK_EDIT_FIELD, field_buffer, &field_len, 64, nk_filter_default);
if (ed_flags & NK_EDIT_ACTIVATED)
open_ios_soft_keyboard();
if (ed_flags & NK_EDIT_DEACTIVATED)
close_ios_soft_keyboard();
```
### Manual Soft Keyboard Dismissal
As the user can dismiss a keyboard manually, nuklear will not be aware when this occurs, and the text edit cursor will think the entry field is still active. I recommend catching the dismiss event, then emitting `ALLEGRO_EVENT_TOUCH_BEGIN` and `ALLEGRO_EVENT_TOUCH_END` events in an unused portion of the screen (like the bottom-right corner). This will simulate the user touching outside of the text entry widget, which will make the edit field inactive.

View File

@ -19,9 +19,6 @@
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_STANDARD_VARARGS
#define NK_INCLUDE_DEFAULT_ALLOCATOR
/* Uncomment this for iOS / Android keyboard support
#define NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD
*/
#define NK_IMPLEMENTATION
#define NK_ALLEGRO5_IMPLEMENTATION
#include "../../nuklear.h"
@ -54,20 +51,6 @@
static void error_callback(int e, const char *d)
{printf("Error %d: %s\n", e, d);}
/* If NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD is enabled, implement these
two methods and pass them as the last 2 arguments to nk_allegro5_init()
to have nuklear call them when appropriate.
void open_soft_keyboard()
{
[implement opening keyboard code]
}
void close_soft_keyboard()
{
[implement close keyboard code]
}
*/
int main(void)
{
/* Platform */
@ -107,10 +90,7 @@ int main(void)
font = nk_allegro5_font_create_from_file("../../../extra_font/Roboto-Regular.ttf", 12, 0);
struct nk_context *ctx;
/* If NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD is enabled, pass open_soft_keyboard and
close_soft_keyboard as the last 2 arguments to nk_allegro5_init() instead
of NULL, NULL */
ctx = nk_allegro5_init(font, display, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL);
ctx = nk_allegro5_init(font, display, WINDOW_WIDTH, WINDOW_HEIGHT);
/* style.c */
/*set_style(ctx, THEME_WHITE);*/

View File

@ -22,9 +22,7 @@
typedef struct NkAllegro5Font NkAllegro5Font;
NK_API struct nk_context* nk_allegro5_init(NkAllegro5Font *font, ALLEGRO_DISPLAY *dsp,
unsigned int width, unsigned int height,
void (*open_keyboard_func)(void),
void (*close_keyboard_func)(void));
unsigned int width, unsigned int height);
NK_API void nk_allegro5_handle_event(ALLEGRO_EVENT *ev);
NK_API void nk_allegro5_shutdown(void);
NK_API void nk_allegro5_render(void);
@ -431,8 +429,7 @@ nk_allegro5_clipboard_copy(nk_handle usr, const char *text, int len)
NK_API struct nk_context*
nk_allegro5_init(NkAllegro5Font *allegro5font, ALLEGRO_DISPLAY *dsp,
unsigned int width, unsigned int height,
void (*open_keyboard_func)(void), void (*close_keyboard_func)(void))
unsigned int width, unsigned int height)
{
if (!al_init_primitives_addon()) {
fprintf(stdout, "Unable to initialize required allegro5 primitives addon\n");
@ -454,10 +451,6 @@ nk_allegro5_init(NkAllegro5Font *allegro5font, ALLEGRO_DISPLAY *dsp,
allegro5.ctx.clip.copy = nk_allegro5_clipboard_copy;
allegro5.ctx.clip.paste = nk_allegro5_clipboard_paste;
allegro5.ctx.clip.userdata = nk_handle_ptr(0);
#ifdef NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD
allegro5.ctx.open_keyboard = open_keyboard_func;
allegro5.ctx.close_keyboard = close_keyboard_func;
#endif
return &allegro5.ctx;
}

View File

@ -22010,4 +22010,4 @@ NK_API void
nk_menu_end(struct nk_context *ctx)
{nk_contextual_end(ctx);}
#endif
#endif