aboutsummaryrefslogtreecommitdiffstats
path: root/android/skin
diff options
context:
space:
mode:
Diffstat (limited to 'android/skin')
-rw-r--r--android/skin/file.c9
-rw-r--r--android/skin/file.h2
-rw-r--r--android/skin/keyboard.h3
-rw-r--r--android/skin/window.c12
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