From 4ab14247ebd5c1a600e8ac4944eccd12738f517f Mon Sep 17 00:00:00 2001 From: ashbb Date: Sat, 14 Nov 2009 04:38:04 +0900 Subject: [PATCH] implement keyup/keydown and non-repeating keydown for Windows --- shoes/app.c | 1 + shoes/app.h | 1 + shoes/native/windows.c | 8 ++++++++ 3 files changed, 10 insertions(+) diff --git a/shoes/app.c b/shoes/app.c index 84018477..abf3a9c5 100644 --- a/shoes/app.c +++ b/shoes/app.c @@ -435,6 +435,7 @@ shoes_app_wheel(shoes_app *app, ID dir, int x, int y) shoes_code shoes_app_keydown(shoes_app *app, VALUE key) { + app->pressedkey = key; if (!RTEST(rb_hash_aref(app->keypresses, key))) { rb_hash_aset(app->keypresses, key, Qtrue); shoes_canvas_send_keydown(app->canvas, key); diff --git a/shoes/app.h b/shoes/app.h index e57e04a1..66eea028 100644 --- a/shoes/app.h +++ b/shoes/app.h @@ -62,6 +62,7 @@ typedef struct _shoes_app { VALUE self; VALUE canvas; VALUE keypresses; + VALUE pressedkey; VALUE nestslot; VALUE nesting; VALUE extras; diff --git a/shoes/native/windows.c b/shoes/native/windows.c index 9c31534e..f00404a2 100644 --- a/shoes/native/windows.c +++ b/shoes/native/windows.c @@ -202,6 +202,7 @@ void shoes_native_remove_item(SHOES_SLOT_OS *slot, VALUE item, char c) ScreenToClient(canvas->app->slot->window, &p); \ #define KEY_SYM(sym) shoes_app_keypress(app, ID2SYM(rb_intern("" # sym))) +#define KEY_SYM2(sym) shoes_app_keydown(app, ID2SYM(rb_intern("" # sym))) #define KEYPRESS(name, sym) \ else if (w == VK_##name) { \ VALUE v = ID2SYM(rb_intern("" # sym)); \ @@ -212,6 +213,7 @@ void shoes_native_remove_item(SHOES_SLOT_OS *slot, VALUE item, char c) if (app->os.ctrlkey) \ KEY_STATE(control); \ shoes_app_keypress(app, v); \ + shoes_app_keydown(app, v); \ } static void @@ -562,14 +564,17 @@ shoes_app_win32proc( { case 0x08: KEY_SYM(backspace); + KEY_SYM2(backspace); break; case 0x09: KEY_SYM(tab); + KEY_SYM2(tab); break; case 0x0D: shoes_app_keypress(app, rb_str_new2("\n")); + shoes_app_keydown(app, rb_str_new2("\n")); break; default: @@ -581,6 +586,7 @@ shoes_app_win32proc( str[len] = '\0'; v = rb_str_new(str, len); shoes_app_keypress(app, v); + shoes_app_keydown(app, v); } } break; @@ -643,12 +649,14 @@ shoes_app_win32proc( if (app->os.altkey) { KEY_STATE(alt); shoes_app_keypress(app, v); + shoes_app_keydown(app, v); } } break; case WM_SYSKEYUP: case WM_KEYUP: + shoes_app_keyup(app, app->pressedkey); if (w == VK_CONTROL) app->os.ctrlkey = false; else if (w == VK_MENU)