Browse Source

Improved soft keyboard support

seibelj 8 years ago
parent
commit
1cf83d258e
3 changed files with 48 additions and 14 deletions
  1. 1 1
      demo/allegro5/main.c
  2. 17 8
      demo/allegro5/nuklear_allegro5.h
  3. 30 5
      nuklear.h

+ 1 - 1
demo/allegro5/main.c

@@ -90,7 +90,7 @@ int main(void)
     font = nk_allegro5_font_create_from_file("../../extra_font/Roboto-Regular.ttf", 12, 0);
     font = nk_allegro5_font_create_from_file("../../extra_font/Roboto-Regular.ttf", 12, 0);
     struct nk_context *ctx;
     struct nk_context *ctx;
 
 
-    ctx = nk_allegro5_init(font, display, WINDOW_WIDTH, WINDOW_HEIGHT);
+    ctx = nk_allegro5_init(font, display, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL);
     /* Load Fonts: if none of these are loaded a default font will be used  */
     /* Load Fonts: if none of these are loaded a default font will be used  */
     /* Load Cursor: if you uncomment cursor loading please hide the cursor */
     /* Load Cursor: if you uncomment cursor loading please hide the cursor */
     
     

+ 17 - 8
demo/allegro5/nuklear_allegro5.h

@@ -21,15 +21,18 @@
 #include <allegro5/allegro_ttf.h>
 #include <allegro5/allegro_ttf.h>
 
 
 typedef struct NkAllegro5Font NkAllegro5Font;
 typedef struct NkAllegro5Font NkAllegro5Font;
-NK_API struct nk_context*   nk_allegro5_init(NkAllegro5Font *font, ALLEGRO_DISPLAY *dsp, 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);
+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));
+NK_API void                   nk_allegro5_handle_event(ALLEGRO_EVENT *ev);
+NK_API void                   nk_allegro5_shutdown(void);
+NK_API void                   nk_allegro5_render(void);
 
 
 /* Fonts. We wrap normal allegro fonts in some nuklear book keeping */
 /* Fonts. We wrap normal allegro fonts in some nuklear book keeping */
-NK_API NkAllegro5Font*      nk_allegro5_font_create_from_file(const char *file_name, int font_size, int flags);
-NK_API void                 nk_allegro5_font_del(NkAllegro5Font *font);
-NK_API void                 nk_allegro5_font_set_font(NkAllegro5Font *font);
+NK_API NkAllegro5Font*        nk_allegro5_font_create_from_file(const char *file_name, int font_size, int flags);
+NK_API void                   nk_allegro5_font_del(NkAllegro5Font *font);
+NK_API void                   nk_allegro5_font_set_font(NkAllegro5Font *font);
 
 
 #endif
 #endif
 /*
 /*
@@ -447,7 +450,9 @@ nk_allegro5_clipboard_copy(nk_handle usr, const char *text, int len)
 }
 }
 
 
 NK_API struct nk_context*
 NK_API struct nk_context*
-nk_allegro5_init(NkAllegro5Font *allegro5font, ALLEGRO_DISPLAY *dsp, unsigned int width, unsigned int height)
+nk_allegro5_init(NkAllegro5Font *allegro5font, ALLEGRO_DISPLAY *dsp,
+    unsigned int width, unsigned int height,
+    void (*open_keyboard_func)(void), void (*close_keyboard_func)(void))
 {
 {
     if (!al_init_primitives_addon()) {
     if (!al_init_primitives_addon()) {
         fprintf(stdout, "Unable to initialize required allegro5 primitives addon\n");
         fprintf(stdout, "Unable to initialize required allegro5 primitives addon\n");
@@ -469,6 +474,10 @@ nk_allegro5_init(NkAllegro5Font *allegro5font, ALLEGRO_DISPLAY *dsp, unsigned in
     allegro5.ctx.clip.copy = nk_allegro5_clipboard_copy;
     allegro5.ctx.clip.copy = nk_allegro5_clipboard_copy;
     allegro5.ctx.clip.paste = nk_allegro5_clipboard_paste;
     allegro5.ctx.clip.paste = nk_allegro5_clipboard_paste;
     allegro5.ctx.clip.userdata = nk_handle_ptr(0);
     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;
     return &allegro5.ctx;
 }
 }
 
 

+ 30 - 5
nuklear.h

@@ -127,6 +127,14 @@ OPTIONAL DEFINES:
         Can be combined with the style structures.
         Can be combined with the style structures.
         <!> If used needs to be defined for implementation and header <!>
         <!> If used needs to be defined for implementation and header <!>
 
 
+    NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD
+        Defining this means that when a textedit field is begun editing,
+        nuklear will look for ctx->open_keyboard() and ctx->close_keyboard()
+        functions to call. Set these functions during nk_context initialization
+        in your backend. This is "DYNAMIC" because a PC soft keyboard is always open,
+        but a mobile device will show and hide the soft keyboard dynamically
+        as needed.
+
     NK_BUTTON_TRIGGER_ON_RELEASE
     NK_BUTTON_TRIGGER_ON_RELEASE
         Different platforms require button clicks occuring either on buttons being
         Different platforms require button clicks occuring either on buttons being
         pressed (up to down) or released (down to up).
         pressed (up to down) or released (down to up).
@@ -477,6 +485,8 @@ typedef void (*nk_plugin_free)(nk_handle, void *old);
 typedef int(*nk_plugin_filter)(const struct nk_text_edit*, nk_rune unicode);
 typedef int(*nk_plugin_filter)(const struct nk_text_edit*, nk_rune unicode);
 typedef void(*nk_plugin_paste)(nk_handle, struct nk_text_edit*);
 typedef void(*nk_plugin_paste)(nk_handle, struct nk_text_edit*);
 typedef void(*nk_plugin_copy)(nk_handle, const char*, int len);
 typedef void(*nk_plugin_copy)(nk_handle, const char*, int len);
+typedef void(*nk_plugin_open_keyboard)(void);
+typedef void(*nk_plugin_close_keyboard)(void);
 
 
 struct nk_allocator {
 struct nk_allocator {
     nk_handle userdata;
     nk_handle userdata;
@@ -2932,6 +2942,10 @@ struct nk_context {
 #endif
 #endif
 #ifdef NK_INCLUDE_COMMAND_USERDATA
 #ifdef NK_INCLUDE_COMMAND_USERDATA
     nk_handle userdata;
     nk_handle userdata;
+#endif
+#ifdef NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD
+    nk_plugin_open_keyboard open_keyboard;
+    nk_plugin_close_keyboard close_keyboard;
 #endif
 #endif
     /* text editor objects are quite big because of an internal
     /* text editor objects are quite big because of an internal
      * undo/redo stack. Therefore it does not make sense to have one for
      * undo/redo stack. Therefore it does not make sense to have one for
@@ -14126,7 +14140,8 @@ nk_edit_draw_text(struct nk_command_buffer *out,
 }
 }
 
 
 NK_INTERN nk_flags
 NK_INTERN nk_flags
-nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
+nk_do_edit(struct nk_context *ctx,
+    nk_flags *state, struct nk_command_buffer *out,
     struct nk_rect bounds, nk_flags flags, nk_plugin_filter filter,
     struct nk_rect bounds, nk_flags flags, nk_plugin_filter filter,
     struct nk_text_edit *edit, const struct nk_style_edit *style,
     struct nk_text_edit *edit, const struct nk_style_edit *style,
     struct nk_input *in, const struct nk_user_font *font)
     struct nk_input *in, const struct nk_user_font *font)
@@ -14181,13 +14196,23 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
             edit->cursor = edit->string.len;
             edit->cursor = edit->string.len;
             in = 0;
             in = 0;
         }
         }
+#ifdef NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD
+        if (ctx->open_keyboard)
+            ctx->open_keyboard();
+#endif
     } else if (!edit->active) edit->mode = NK_TEXT_EDIT_MODE_VIEW;
     } else if (!edit->active) edit->mode = NK_TEXT_EDIT_MODE_VIEW;
     if (flags & NK_EDIT_READ_ONLY)
     if (flags & NK_EDIT_READ_ONLY)
         edit->mode = NK_TEXT_EDIT_MODE_VIEW;
         edit->mode = NK_TEXT_EDIT_MODE_VIEW;
 
 
     ret = (edit->active) ? NK_EDIT_ACTIVE: NK_EDIT_INACTIVE;
     ret = (edit->active) ? NK_EDIT_ACTIVE: NK_EDIT_INACTIVE;
     if (prev_state != edit->active)
     if (prev_state != edit->active)
+    {
         ret |= (edit->active) ? NK_EDIT_ACTIVATED: NK_EDIT_DEACTIVATED;
         ret |= (edit->active) ? NK_EDIT_ACTIVATED: NK_EDIT_DEACTIVATED;
+#ifdef NK_INCLUDE_DYNAMIC_SOFT_KEYBOARD
+        if (!edit->active)
+            ctx->close_keyboard();
+#endif
+    }
 
 
     /* handle user input */
     /* handle user input */
     if (edit->active && in)
     if (edit->active && in)
@@ -14753,7 +14778,7 @@ nk_draw_property(struct nk_command_buffer *out, const struct nk_style_property *
 }
 }
 
 
 NK_INTERN void
 NK_INTERN void
-nk_do_property(nk_flags *ws,
+nk_do_property(struct nk_context *ctx, nk_flags *ws,
     struct nk_command_buffer *out, struct nk_rect property,
     struct nk_command_buffer *out, struct nk_rect property,
     const char *name, struct nk_property_variant *variant,
     const char *name, struct nk_property_variant *variant,
     float inc_per_pixel, char *buffer, int *len,
     float inc_per_pixel, char *buffer, int *len,
@@ -14893,7 +14918,7 @@ nk_do_property(nk_flags *ws,
     text_edit->string.buffer.memory.ptr = dst;
     text_edit->string.buffer.memory.ptr = dst;
     text_edit->string.buffer.size = NK_MAX_NUMBER_BUFFER;
     text_edit->string.buffer.size = NK_MAX_NUMBER_BUFFER;
     text_edit->mode = NK_TEXT_EDIT_MODE_INSERT;
     text_edit->mode = NK_TEXT_EDIT_MODE_INSERT;
-    nk_do_edit(ws, out, edit, NK_EDIT_ALWAYS_INSERT_MODE, filters[filter],
+    nk_do_edit(ctx, ws, out, edit, NK_EDIT_ALWAYS_INSERT_MODE, filters[filter],
         text_edit, &style->edit, (*state == NK_PROPERTY_EDIT) ? in: 0, font);
         text_edit, &style->edit, (*state == NK_PROPERTY_EDIT) ? in: 0, font);
 
 
     *length = text_edit->string.len;
     *length = text_edit->string.len;
@@ -19701,7 +19726,7 @@ nk_edit_buffer(struct nk_context *ctx, nk_flags flags,
     filter = (!filter) ? nk_filter_default: filter;
     filter = (!filter) ? nk_filter_default: filter;
     prev_state = (unsigned char)edit->active;
     prev_state = (unsigned char)edit->active;
     in = (flags & NK_EDIT_READ_ONLY) ? 0: in;
     in = (flags & NK_EDIT_READ_ONLY) ? 0: in;
-    ret_flags = nk_do_edit(&ctx->last_widget_state, &win->buffer, bounds, flags,
+    ret_flags = nk_do_edit(ctx, &ctx->last_widget_state, &win->buffer, bounds, flags,
                     filter, edit, &style->edit, in, style->font);
                     filter, edit, &style->edit, in, style->font);
 
 
     if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
     if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
@@ -19828,7 +19853,7 @@ nk_property(struct nk_context *ctx, const char *name, struct nk_property_variant
 
 
     /* execute property widget */
     /* execute property widget */
     old_state = *state;
     old_state = *state;
-    nk_do_property(&ctx->last_widget_state, &win->buffer, bounds, name,
+    nk_do_property(ctx, &ctx->last_widget_state, &win->buffer, bounds, name,
         variant, inc_per_pixel, buffer, len, state, cursor,
         variant, inc_per_pixel, buffer, len, state, cursor,
         &style->property, filter, in, style->font, &ctx->text_edit);
         &style->property, filter, in, style->font, &ctx->text_edit);