1
0
Fork 0
forked from len0rd/rockbox

Invert buttons in RTL mode

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22961 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Tomer Shalev 2009-10-05 17:17:30 +00:00
parent e04acd8c3e
commit f7bd7252e1
6 changed files with 63 additions and 8 deletions

View file

@ -34,6 +34,9 @@
#include "settings.h" #include "settings.h"
#include "pcmbuf.h" #include "pcmbuf.h"
#include "misc.h" #include "misc.h"
#if defined(HAVE_LCD_BITMAP) && !defined(BOOTLOADER)
#include "language.h"
#endif
static int last_button = BUTTON_NONE|BUTTON_REL; /* allow the ipod wheel to static int last_button = BUTTON_NONE|BUTTON_REL; /* allow the ipod wheel to
work on startup */ work on startup */
@ -56,6 +59,20 @@ static int unlock_combo = BUTTON_NONE;
static bool screen_has_lock = false; static bool screen_has_lock = false;
#endif /* HAVE_SOFTWARE_KEYLOCK */ #endif /* HAVE_SOFTWARE_KEYLOCK */
#if defined(HAVE_LCD_BITMAP) && !defined(BOOTLOADER)
/*
* checks whether the given language and context combination require that the
* button is horizontally inverted to support RTL language
*
*/
static bool rtl_button_flip_needed(int context)
{
return lang_is_rtl() && ((context == CONTEXT_STD) ||
(context & CONTEXT_TREE) || (context & CONTEXT_MAINMENU) ||
(context & CONTEXT_TREE));
}
#endif
/* /*
* do_button_check is the worker function for get_default_action. * do_button_check is the worker function for get_default_action.
* returns ACTION_UNKNOWN or the requested return value from the list. * returns ACTION_UNKNOWN or the requested return value from the list.
@ -201,6 +218,11 @@ static int get_action_worker(int context, int timeout,
context &= ~ALLOW_SOFTLOCK; context &= ~ALLOW_SOFTLOCK;
#endif /* HAS_BUTTON_HOLD */ #endif /* HAS_BUTTON_HOLD */
#if defined(HAVE_LCD_BITMAP) && !defined(BOOTLOADER)
if (rtl_button_flip_needed(context))
button = button_flip_horizontally(button);
#endif
/* logf("%x,%x",last_button,button); */ /* logf("%x,%x",last_button,button); */
while (1) while (1)
{ {

View file

@ -67,7 +67,7 @@ static int flipdisplay_callback(int action,const struct menu_item_ex *this_item)
switch (action) switch (action)
{ {
case ACTION_EXIT_MENUITEM: case ACTION_EXIT_MENUITEM:
button_set_flip(global_settings.flip_display); button_set_flip_vertically(global_settings.flip_display);
lcd_set_flip(global_settings.flip_display); lcd_set_flip(global_settings.flip_display);
lcd_update(); lcd_update();
#ifdef HAVE_REMOTE_LCD #ifdef HAVE_REMOTE_LCD

View file

@ -846,7 +846,7 @@ void settings_apply(bool read_disk)
#endif #endif
#ifdef HAVE_LCD_FLIP #ifdef HAVE_LCD_FLIP
lcd_set_flip(global_settings.flip_display); lcd_set_flip(global_settings.flip_display);
button_set_flip(global_settings.flip_display); button_set_flip_vertically(global_settings.flip_display);
#endif #endif
lcd_update(); /* refresh after flipping the screen */ lcd_update(); /* refresh after flipping the screen */
settings_apply_pm_range(); settings_apply_pm_range();

View file

@ -437,7 +437,7 @@ void button_close(void)
/* /*
* helper function to swap LEFT/RIGHT, UP/DOWN (if present), and F1/F3 (Recorder) * helper function to swap LEFT/RIGHT, UP/DOWN (if present), and F1/F3 (Recorder)
*/ */
static int button_flip(int button) static int button_flip_vertically(int button)
{ {
int newbutton; int newbutton;
@ -507,19 +507,49 @@ static int button_flip(int button)
* set the flip attribute * set the flip attribute
* better only call this when the queue is empty * better only call this when the queue is empty
*/ */
void button_set_flip(bool flip) void button_set_flip_vertically(bool flip)
{ {
if (flip != flipped) /* not the current setting */ if (flip != flipped) /* not the current setting */
{ {
/* avoid race condition with the button_tick() */ /* avoid race condition with the button_tick() */
int oldlevel = disable_irq_save(); int oldlevel = disable_irq_save();
lastbtn = button_flip(lastbtn); lastbtn = button_flip_vertically(lastbtn);
flipped = flip; flipped = flip;
restore_irq(oldlevel); restore_irq(oldlevel);
} }
} }
#endif /* HAVE_LCD_FLIP */ #endif /* HAVE_LCD_FLIP */
#if defined(HAVE_LCD_BITMAP) && !defined(BOOTLOADER)
/*
* helper function to swap LEFT/RIGHT sides (for RTL mode)
*/
int button_flip_horizontally(int button)
{
int newbutton;
newbutton = button &
~(BUTTON_LEFT | BUTTON_RIGHT
#if defined(BUTTON_SCROLL_BACK) && defined(BUTTON_SCROLL_FWD)
| BUTTON_SCROLL_BACK | BUTTON_SCROLL_FWD
#endif
);
if (button & BUTTON_LEFT)
newbutton |= BUTTON_RIGHT;
if (button & BUTTON_RIGHT)
newbutton |= BUTTON_LEFT;
#if defined(BUTTON_SCROLL_BACK) && defined(BUTTON_SCROLL_FWD)
if (button & BUTTON_SCROLL_BACK)
newbutton |= BUTTON_SCROLL_FWD;
if (button & BUTTON_SCROLL_FWD)
newbutton |= BUTTON_SCROLL_BACK;
#endif
return newbutton;
}
#endif
#ifdef HAVE_BACKLIGHT #ifdef HAVE_BACKLIGHT
void set_backlight_filter_keypress(bool value) void set_backlight_filter_keypress(bool value)
{ {
@ -550,7 +580,7 @@ static int button_read(void)
#ifdef HAVE_LCD_FLIP #ifdef HAVE_LCD_FLIP
if (btn && flipped) if (btn && flipped)
btn = button_flip(btn); /* swap upside down */ btn = button_flip_vertically(btn); /* swap upside down */
#endif /* HAVE_LCD_FLIP */ #endif /* HAVE_LCD_FLIP */
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN

View file

@ -42,7 +42,10 @@ int button_status_wdata(int *pdata);
#endif #endif
void button_clear_queue(void); void button_clear_queue(void);
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
void button_set_flip(bool flip); /* turn 180 degrees */ void button_set_flip_vertically(bool flip); /* turn 180 degrees */
#ifndef BOOTLOADER
int button_flip_horizontally(int button); /* for RTL mode */
#endif
#endif #endif
#ifdef HAVE_BACKLIGHT #ifdef HAVE_BACKLIGHT
void set_backlight_filter_keypress(bool value); void set_backlight_filter_keypress(bool value);

View file

@ -312,7 +312,7 @@ void cpu_sleep(bool enabled)
(void)enabled; (void)enabled;
} }
void button_set_flip(bool yesno) void button_set_flip_vertically(bool yesno)
{ {
(void)yesno; (void)yesno;
} }