Skip to content

Commit

Permalink
To distinguish the left alt/ctrl/shift keys from the right ones at ke…
Browse files Browse the repository at this point in the history
…yup/keydown events.

Now you can get the following output:

  keydown   :right_alt   - when right-alt-key pressed
  keydown   'b'          - when b-key pressed
  keypress  :alt_b       - when b-key pressed
  keyup     'b'          - when b-key released
  keyup     :right_alt   - when right-alt-key released
  • Loading branch information
ashbb committed Dec 16, 2009
1 parent d01565f commit 5e17fc9
Showing 1 changed file with 180 additions and 149 deletions.
329 changes: 180 additions & 149 deletions shoes/native/windows.c
Expand Up @@ -19,11 +19,148 @@
#endif

static WNDPROC shoes_original_edit_line_proc = NULL;
HHOOK hhook;
VALUE kh_up_v = NULL;
VALUE kh_down_v = NULL;

shoes_code shoes_classex_init();
LRESULT CALLBACK shoes_app_win32proc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK shoes_slot_win32proc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK shoes_edit_line_win32proc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK shoes_keyhook(int, WPARAM, LPARAM);

#define KEYUPDOWN \
if (vk == VK_LCONTROL) \
v = ID2SYM(rb_intern("left_ctrl")); \
else if (vk == VK_RCONTROL) \
v = ID2SYM(rb_intern("right_ctrl")); \
else if (vk == VK_LMENU) \
v = ID2SYM(rb_intern("left_alt")); \
else if (vk == VK_RMENU) \
v = ID2SYM(rb_intern("right_alt")); \
else if (vk == VK_LSHIFT) \
v = ID2SYM(rb_intern("left_shift")); \
else if (vk == VK_RSHIFT) \
v = ID2SYM(rb_intern("right_shift")); \
else if (vk == VK_ESCAPE) \
v = ID2SYM(rb_intern("escape")); \
else if (vk == VK_INSERT) \
v = ID2SYM(rb_intern("insert")); \
else if (vk == VK_DELETE) \
v = ID2SYM(rb_intern("delete")); \
else if (vk == VK_PRIOR) \
v = ID2SYM(rb_intern("page_up")); \
else if (vk == VK_NEXT) \
v = ID2SYM(rb_intern("page_down")); \
else if (vk == VK_HOME) \
v = ID2SYM(rb_intern("home")); \
else if (vk == VK_END) \
v = ID2SYM(rb_intern("end")); \
else if (vk == VK_LEFT) \
v = ID2SYM(rb_intern("left")); \
else if (vk == VK_UP) \
v = ID2SYM(rb_intern("up")); \
else if (vk == VK_RIGHT) \
v = ID2SYM(rb_intern("right")); \
else if (vk == VK_DOWN) \
v = ID2SYM(rb_intern("down")); \
else if (vk == VK_F1) \
v = ID2SYM(rb_intern("f1")); \
else if (vk == VK_F2) \
v = ID2SYM(rb_intern("f2")); \
else if (vk == VK_F2) \
v = ID2SYM(rb_intern("f2")); \
else if (vk == VK_F3) \
v = ID2SYM(rb_intern("f3")); \
else if (vk == VK_F4) \
v = ID2SYM(rb_intern("f4")); \
else if (vk == VK_F5) \
v = ID2SYM(rb_intern("f5")); \
else if (vk == VK_F6) \
v = ID2SYM(rb_intern("f6")); \
else if (vk == VK_F7) \
v = ID2SYM(rb_intern("f7")); \
else if (vk == VK_F8) \
v = ID2SYM(rb_intern("f8")); \
else if (vk == VK_F9) \
v = ID2SYM(rb_intern("f9")); \
else if (vk == VK_F10) \
v = ID2SYM(rb_intern("f10")); \
else if (vk == VK_F11) \
v = ID2SYM(rb_intern("f11")); \
else if (vk == VK_F12) \
v = ID2SYM(rb_intern("f12")); \
else if (vk == 186) \
{ \
letter = ':'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 187) \
{ \
letter = ';'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 188) \
{ \
letter = ','; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 189) \
{ \
letter = '-'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 190) \
{ \
letter = '.'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 191) \
{ \
letter = '/'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 192) \
{ \
letter = '@'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 219) \
{ \
letter = '['; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 220) \
{ \
letter = '_'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 221) \
{ \
letter = ']'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 222) \
{ \
letter = '^'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 226) \
{ \
letter = '\\'; \
v = rb_str_new(&letter, 1); \
} \
else if (vk == 0x08) \
v = ID2SYM(rb_intern("backspace")); \
else if (vk == 0x09) \
v = ID2SYM(rb_intern("tab")); \
else if (vk == 0x0D) \
v = ID2SYM(rb_intern("enter")); \
else \
{ \
letter = tolower(letter); \
v = rb_str_new(&letter, 1); \
}

static WCHAR *
shoes_wchar(char *utf8)
Expand Down Expand Up @@ -115,10 +252,51 @@ void shoes_native_init()
shoes_classex_init();
shoes_world->os.hidden = CreateWindow(SHOES_HIDDENCLS, SHOES_HIDDENCLS, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, shoes_world->os.instance, NULL);

hhook = SetWindowsHookEx(WH_KEYBOARD_LL, shoes_keyhook, shoes_world->os.instance, 0);
}

LRESULT CALLBACK shoes_keyhook(int n, WPARAM w, LPARAM l)
{
VALUE v;
WPARAM vk;

kh_up_v = NULL;
kh_down_v = NULL;

if (n == HC_ACTION)
{
KBDLLHOOKSTRUCT *kbdHS = (KBDLLHOOKSTRUCT *)l;
switch (w)
{
case WM_SYSKEYUP:
case WM_KEYUP:
{
vk = kbdHS->vkCode;
char letter = vk;
KEYUPDOWN
kh_up_v = v;
}
break;

case WM_SYSKEYDOWN:
case WM_KEYDOWN:
{
vk = kbdHS->vkCode;
char letter = vk;
KEYUPDOWN
kh_down_v = v;
}
break;
}
}

return CallNextHookEx(hhook, n, w, l);
}

void shoes_native_cleanup(shoes_world_t *world)
{
UnhookWindowsHookEx(hhook);
}

void shoes_native_quit()
Expand Down Expand Up @@ -217,147 +395,6 @@ void shoes_native_remove_item(SHOES_SLOT_OS *slot, VALUE item, char c)
shoes_app_keypress(app, v); \
}

#define KEYUPDOWN \
VALUE v; \
char letter = w; \
if (w == VK_LCONTROL) \
v = ID2SYM(rb_intern("left_ctrl")); \
else if (w == VK_RCONTROL) \
v = ID2SYM(rb_intern("right_ctrl")); \
else if (w == VK_CONTROL) \
v = ID2SYM(rb_intern("ctrl")); \
else if (w == VK_LMENU) \
v = ID2SYM(rb_intern("left_alt")); \
else if (w == VK_RMENU) \
v = ID2SYM(rb_intern("right_alt")); \
else if (w == VK_MENU) \
v = ID2SYM(rb_intern("alt")); \
else if (w == VK_LSHIFT) \
v = ID2SYM(rb_intern("left_shift")); \
else if (w == VK_RSHIFT) \
v = ID2SYM(rb_intern("right_shift")); \
else if (w == VK_SHIFT) \
v = ID2SYM(rb_intern("shift")); \
else if (w == VK_ESCAPE) \
v = ID2SYM(rb_intern("escape")); \
else if (w == VK_INSERT) \
v = ID2SYM(rb_intern("insert")); \
else if (w == VK_DELETE) \
v = ID2SYM(rb_intern("delete")); \
else if (w == VK_PRIOR) \
v = ID2SYM(rb_intern("page_up")); \
else if (w == VK_NEXT) \
v = ID2SYM(rb_intern("page_down")); \
else if (w == VK_HOME) \
v = ID2SYM(rb_intern("home")); \
else if (w == VK_END) \
v = ID2SYM(rb_intern("end")); \
else if (w == VK_LEFT) \
v = ID2SYM(rb_intern("left")); \
else if (w == VK_UP) \
v = ID2SYM(rb_intern("up")); \
else if (w == VK_RIGHT) \
v = ID2SYM(rb_intern("right")); \
else if (w == VK_DOWN) \
v = ID2SYM(rb_intern("down")); \
else if (w == VK_F1) \
v = ID2SYM(rb_intern("f1")); \
else if (w == VK_F2) \
v = ID2SYM(rb_intern("f2")); \
else if (w == VK_F2) \
v = ID2SYM(rb_intern("f2")); \
else if (w == VK_F3) \
v = ID2SYM(rb_intern("f3")); \
else if (w == VK_F4) \
v = ID2SYM(rb_intern("f4")); \
else if (w == VK_F5) \
v = ID2SYM(rb_intern("f5")); \
else if (w == VK_F6) \
v = ID2SYM(rb_intern("f6")); \
else if (w == VK_F7) \
v = ID2SYM(rb_intern("f7")); \
else if (w == VK_F8) \
v = ID2SYM(rb_intern("f8")); \
else if (w == VK_F9) \
v = ID2SYM(rb_intern("f9")); \
else if (w == VK_F10) \
v = ID2SYM(rb_intern("f10")); \
else if (w == VK_F11) \
v = ID2SYM(rb_intern("f11")); \
else if (w == VK_F12) \
v = ID2SYM(rb_intern("f12")); \
else if (w == 186) \
{ \
letter = ':'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 187) \
{ \
letter = ';'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 188) \
{ \
letter = ','; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 189) \
{ \
letter = '-'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 190) \
{ \
letter = '.'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 191) \
{ \
letter = '/'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 192) \
{ \
letter = '@'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 219) \
{ \
letter = '['; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 220) \
{ \
letter = '_'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 221) \
{ \
letter = ']'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 222) \
{ \
letter = '^'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 226) \
{ \
letter = '\\'; \
v = rb_str_new(&letter, 1); \
} \
else if (w == 0x08) \
v = ID2SYM(rb_intern("backspace")); \
else if (w == 0x09) \
v = ID2SYM(rb_intern("tab")); \
else if (w == 0x0D) \
v = ID2SYM(rb_intern("enter")); \
else \
{ \
letter = tolower(letter); \
v = rb_str_new(&letter, 1); \
}

static void
shoes_canvas_win32_vscroll(shoes_canvas *canvas, int code, int pos)
{
Expand Down Expand Up @@ -732,10 +769,7 @@ shoes_app_win32proc(
case WM_KEYDOWN:
app->os.altkey = false;
case WM_SYSKEYDOWN:
{
KEYUPDOWN
shoes_app_keydown(app, v);
}
shoes_app_keydown(app, kh_down_v);
if (w == VK_CONTROL)
app->os.ctrlkey = true;
else if (w == VK_MENU)
Expand Down Expand Up @@ -797,10 +831,7 @@ shoes_app_win32proc(

case WM_SYSKEYUP:
case WM_KEYUP:
{
KEYUPDOWN
shoes_app_keyup(app, v);
}
shoes_app_keyup(app, kh_up_v);
if (w == VK_CONTROL)
app->os.ctrlkey = false;
else if (w == VK_MENU)
Expand Down

0 comments on commit 5e17fc9

Please sign in to comment.