diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2015-09-03 15:05:32 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2015-10-06 11:21:23 +0200 |
commit | 5ae0871d6e950f5afad17c01362b9d95ecec6a9d (patch) | |
tree | 084e3bb9e82bdceb590725391ce1e308e40568bf | |
parent | e526430ba459b09ed854c462a75e0dbb5ff210d7 (diff) | |
download | mupdf-5ae0871d6e950f5afad17c01362b9d95ecec6a9d.tar.xz |
gl: Cut, copy, and paste in text fields.
-rw-r--r-- | platform/gl/gl-app.h | 1 | ||||
-rw-r--r-- | platform/gl/gl-input.c | 52 | ||||
-rw-r--r-- | platform/gl/gl-main.c | 3 |
3 files changed, 41 insertions, 15 deletions
diff --git a/platform/gl/gl-app.h b/platform/gl/gl-app.h index 37b7941a..2a16cfdb 100644 --- a/platform/gl/gl-app.h +++ b/platform/gl/gl-app.h @@ -2,6 +2,7 @@ #include <GLFW/glfw3.h> extern fz_context *ctx; +extern GLFWwindow *window; enum { diff --git a/platform/gl/gl-input.c b/platform/gl/gl-input.c index 93f6b897..0788eca2 100644 --- a/platform/gl/gl-input.c +++ b/platform/gl/gl-input.c @@ -90,6 +90,21 @@ static void ui_input_delete_selection(struct input *input) input->p = input->q = p; } +static void ui_input_paste(struct input *input, const char *buf, int n) +{ + if (input->p != input->q) + ui_input_delete_selection(input); + if (input->end + n + 1 < input->text + sizeof(input->text)) + { + memmove(input->p + n, input->p, input->end - input->p); + memmove(input->p, buf, n); + input->p += n; + input->end += n; + *input->end = 0; + } + input->q = input->p; +} + static int ui_input_key(struct input *input) { switch (ui.key) @@ -228,25 +243,36 @@ static int ui_input_key(struct input *input) case KEY_CTL_U: input->p = input->q = input->end = input->text; break; + case KEY_CTL_C: + case KEY_CTL_X: + if (input->p != input->q) + { + char buf[sizeof input->text]; + char *p = input->p < input->q ? input->p : input->q; + char *q = input->p > input->q ? input->p : input->q; + memmove(buf, p, q - p); + buf[q-p] = 0; + glfwSetClipboardString(window, buf); + if (ui.key == KEY_CTL_X) + ui_input_delete_selection(input); + } + break; + case KEY_CTL_V: + { + const char *buf = glfwGetClipboardString(window); + if (buf) + ui_input_paste(input, buf, strlen(buf)); + } + break; default: if (ui.key >= 32) { int cat = ucdn_get_general_category(ui.key); if (ui.key == ' ' || (cat >= UCDN_GENERAL_CATEGORY_LL && cat < UCDN_GENERAL_CATEGORY_ZL)) { - if (input->p != input->q) - ui_input_delete_selection(input); - if (input->end < input->text + nelem(input->text) - 1) - { - char buf[8]; - int n = fz_runetochar(buf, ui.key); - memmove(input->p + n, input->p, input->end - input->p); - memmove(input->p, buf, n); - input->p += n; - input->end += n; - *input->end = 0; - } - input->q = input->p; + char buf[8]; + int n = fz_runetochar(buf, ui.key); + ui_input_paste(input, buf, n); } } break; diff --git a/platform/gl/gl-main.c b/platform/gl/gl-main.c index 8acb0baa..88eaf5b0 100644 --- a/platform/gl/gl-main.c +++ b/platform/gl/gl-main.c @@ -9,8 +9,7 @@ struct ui ui; fz_context *ctx = NULL; - -static GLFWwindow *window; +GLFWwindow *window = NULL; /* OpenGL capabilities */ static int has_ARB_texture_non_power_of_two = 1; |