diff options
Diffstat (limited to 'android/skin')
-rw-r--r-- | android/skin/file.c | 9 | ||||
-rw-r--r-- | android/skin/file.h | 2 | ||||
-rw-r--r-- | android/skin/keyboard.h | 3 | ||||
-rw-r--r-- | android/skin/window.c | 12 |
4 files changed, 24 insertions, 2 deletions
diff --git a/android/skin/file.c b/android/skin/file.c index 3d5ea7f..f7f0be9 100644 --- a/android/skin/file.c +++ b/android/skin/file.c @@ -424,6 +424,9 @@ skin_layout_get_display( SkinLayout* layout ) SkinRotation skin_layout_get_dpad_rotation( SkinLayout* layout ) { + if (layout->has_dpad_rotation) + return layout->dpad_rotation; + SKIN_LAYOUT_LOOP_LOCS(layout, loc) SkinPart* part = loc->part; SKIN_PART_LOOP_BUTTONS(part,button) @@ -505,6 +508,12 @@ skin_layout_create_from_v2( AConfig* root, SkinPart* parts ) layout->color = aconfig_unsigned( root, "color", 0x808080 ) | 0xff000000; ptail = &layout->locations; + node = aconfig_find( root, "dpad-rotation" ); + if (node != NULL) { + layout->dpad_rotation = aconfig_int( root, "dpad-rotation", 0 ); + layout->has_dpad_rotation = 1; + } + for (node = root->first_child; node; node = node->next) { if (!memcmp(node->name, "part", 4)) { diff --git a/android/skin/file.h b/android/skin/file.h index 8f95368..9f188b9 100644 --- a/android/skin/file.h +++ b/android/skin/file.h @@ -75,6 +75,8 @@ typedef struct SkinLayout { int event_type; int event_code; int event_value; + char has_dpad_rotation; + SkinRotation dpad_rotation; SkinSize size; SkinLocation* locations; } SkinLayout; diff --git a/android/skin/keyboard.h b/android/skin/keyboard.h index 45efd18..f583298 100644 --- a/android/skin/keyboard.h +++ b/android/skin/keyboard.h @@ -42,6 +42,9 @@ extern void skin_keyboard_on_command( SkinKeyboard* keyboard, extern void skin_keyboard_set_rotation( SkinKeyboard* keyboard, SkinRotation rotation ); +extern AndroidKeyCode skin_keyboard_rotate_keycode( SkinKeyboard* keyboard, + AndroidKeyCode keycode ); + extern void skin_keyboard_on_key_press( SkinKeyboard* keyboard, SkinKeyEventFunc press_func, void* press_opaque ); diff --git a/android/skin/window.c b/android/skin/window.c index 674b594..156ac56 100644 --- a/android/skin/window.c +++ b/android/skin/window.c @@ -523,7 +523,7 @@ button_done( Button* button ) } static void -button_init( Button* button, SkinButton* sbutton, SkinLocation* loc, Background* back, SkinRect* frame ) +button_init( Button* button, SkinButton* sbutton, SkinLocation* loc, Background* back, SkinRect* frame, SkinLayout* slayout ) { SkinRect r; @@ -532,6 +532,14 @@ button_init( Button* button, SkinButton* sbutton, SkinLocation* loc, Backgrou button->keycode = sbutton->keycode; button->down = 0; + if (slayout->has_dpad_rotation) { + /* Dpad keys must be rotated if the skin provides a 'dpad-rotation' field. + * this is used as a counter-measure to the fact that the framework always assumes + * that the physical D-Pad has been rotated when in landscape mode. + */ + button->keycode = android_keycode_rotate( button->keycode, -slayout->dpad_rotation ); + } + skin_rect_rotate( &r, &sbutton->rect, loc->rotation ); r.pos.x += loc->anchor.x; r.pos.y += loc->anchor.y; @@ -792,7 +800,7 @@ layout_init( Layout* layout, SkinLayout* slayout ) SKIN_PART_LOOP_BUTTONS(part, sbutton) Button* button = layout->buttons + n_buttons; - button_init( button, sbutton, loc, back, &layout->rect ); + button_init( button, sbutton, loc, back, &layout->rect, slayout ); n_buttons += 1; SKIN_PART_LOOP_END SKIN_LAYOUT_LOOP_END |