mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
menu: don't assume onoff vars are int
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@933 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
10ef62e381
commit
4187c0ea57
2 changed files with 34 additions and 9 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* (C) Gražvydas "notaz" Ignotas, 2006-2010
|
||||
* (C) Gražvydas "notaz" Ignotas, 2006-2011
|
||||
*
|
||||
* This work is licensed under the terms of any of these licenses
|
||||
* (at your option):
|
||||
|
@ -372,6 +372,28 @@ static int me_count(const menu_entry *ent)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int me_read_onoff(const menu_entry *ent)
|
||||
{
|
||||
// guess var size based on mask to avoid reading too much
|
||||
if (ent->mask & 0xffff0000)
|
||||
return *(unsigned int *)ent->var & ent->mask;
|
||||
else if (ent->mask & 0xff00)
|
||||
return *(unsigned short *)ent->var & ent->mask;
|
||||
else
|
||||
return *(unsigned char *)ent->var & ent->mask;
|
||||
}
|
||||
|
||||
static void me_toggle_onoff(menu_entry *ent)
|
||||
{
|
||||
// guess var size based on mask to avoid reading too much
|
||||
if (ent->mask & 0xffff0000)
|
||||
*(unsigned int *)ent->var ^= ent->mask;
|
||||
else if (ent->mask & 0xff00)
|
||||
*(unsigned short *)ent->var ^= ent->mask;
|
||||
else
|
||||
*(unsigned char *)ent->var ^= ent->mask;
|
||||
}
|
||||
|
||||
static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
|
||||
{
|
||||
const menu_entry *ent, *ent_sel = entries;
|
||||
|
@ -477,7 +499,7 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
|
|||
case MB_NONE:
|
||||
break;
|
||||
case MB_OPT_ONOFF:
|
||||
text_out16(x + col2_offs, y, (*(int *)ent->var & ent->mask) ? "ON" : "OFF");
|
||||
text_out16(x + col2_offs, y, me_read_onoff(ent) ? "ON" : "OFF");
|
||||
break;
|
||||
case MB_OPT_RANGE:
|
||||
text_out16(x + col2_offs, y, "%i", *(int *)ent->var);
|
||||
|
@ -545,7 +567,7 @@ static int me_process(menu_entry *entry, int is_next, int is_lr)
|
|||
{
|
||||
case MB_OPT_ONOFF:
|
||||
case MB_OPT_CUSTONOFF:
|
||||
*(int *)entry->var ^= entry->mask;
|
||||
me_toggle_onoff(entry);
|
||||
return 1;
|
||||
case MB_OPT_RANGE:
|
||||
case MB_OPT_CUSTRANGE:
|
||||
|
@ -560,11 +582,11 @@ static int me_process(menu_entry *entry, int is_next, int is_lr)
|
|||
names = (const char **)entry->data;
|
||||
for (c = 0; names[c] != NULL; c++)
|
||||
;
|
||||
*(int *)entry->var += is_next ? 1 : -1;
|
||||
if (*(int *)entry->var < 0)
|
||||
*(int *)entry->var = 0;
|
||||
if (*(int *)entry->var >= c)
|
||||
*(int *)entry->var = c - 1;
|
||||
*(signed char *)entry->var += is_next ? 1 : -1;
|
||||
if (*(signed char *)entry->var < 0)
|
||||
*(signed char *)entry->var = 0;
|
||||
if (*(signed char *)entry->var >= c)
|
||||
*(signed char *)entry->var = c - 1;
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
|
|
|
@ -61,8 +61,11 @@ typedef struct
|
|||
#define mee_onoff(name, id, var, mask) \
|
||||
mee_onoff_h(name, id, var, mask, NULL)
|
||||
|
||||
#define mee_range_h(name, id, var, min, max, help) \
|
||||
{ name, MB_OPT_RANGE, id, &(var), 0, min, max, 1, 1, 1, NULL, NULL, NULL, help }
|
||||
|
||||
#define mee_range(name, id, var, min, max) \
|
||||
{ name, MB_OPT_RANGE, id, &(var), 0, min, max, 1, 1, 1, NULL, NULL, NULL, NULL }
|
||||
mee_range_h(name, id, var, min, max, NULL)
|
||||
|
||||
#define mee_range_hide(name, id, var, min, max) \
|
||||
{ name, MB_OPT_RANGE, id, &(var), 0, min, max, 0, 1, 0, NULL, NULL, NULL, NULL }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue