Fixed buffer overflowing because of mouse input
This commit is contained in:
@ -38,36 +38,56 @@ void menuUpdate(menu_t *menu, engine_t *engine) {
|
||||
} else if(inputIsPressed(&engine->input, INPUT_RIGHT)) {
|
||||
x = 1;
|
||||
y = 0;
|
||||
} else {
|
||||
x = 0;
|
||||
y = 0;
|
||||
}
|
||||
|
||||
// Update cursor positions
|
||||
if(x > 0) {
|
||||
menu->cursorX = (current->x + current->width - 1) + x;
|
||||
} else if(x < 0) {
|
||||
menu->cursorX = current->x + x;
|
||||
}
|
||||
if(x != 0 || y != 0) {
|
||||
if(x > 0) {
|
||||
menu->cursorX = (current->x + current->width - 1) + x;
|
||||
} else if(x < 0) {
|
||||
menu->cursorX = current->x + x;
|
||||
}
|
||||
|
||||
if(y > 0) {
|
||||
menu->cursorY = (current->y + current->height - 1) + y;
|
||||
} else if(y < 0) {
|
||||
menu->cursorY = current->y + y;
|
||||
}
|
||||
|
||||
// Get the item selected
|
||||
int32_t targetIndex = -1;
|
||||
for(i = 0; i < menu->itemCount; i++) {
|
||||
if(i == menu->selected) continue;
|
||||
item = menu->items + i;
|
||||
if(y > 0) {
|
||||
menu->cursorY = (current->y + current->height - 1) + y;
|
||||
} else if(y < 0) {
|
||||
menu->cursorY = current->y + y;
|
||||
}
|
||||
|
||||
if(
|
||||
item->i == -1 ||
|
||||
item->x > menu->cursorX || (item->x + item->width - 1) < menu->cursorX ||
|
||||
item->y > menu->cursorY || (item->y + item->height - 1) < menu->cursorY
|
||||
) continue;
|
||||
// Get the item selected
|
||||
int32_t targetIndex = -1;
|
||||
for(i = 0; i < menu->itemCount; i++) {
|
||||
if(i == menu->selected) continue;
|
||||
item = menu->items + i;
|
||||
|
||||
targetIndex = i;
|
||||
break;
|
||||
if(
|
||||
item->i == -1 ||
|
||||
item->x > menu->cursorX || (item->x+item->width-1) < menu->cursorX ||
|
||||
item->y > menu->cursorY || (item->y+item->height-1) < menu->cursorY
|
||||
) continue;
|
||||
|
||||
targetIndex = i;
|
||||
break;
|
||||
}
|
||||
|
||||
// Was a target found?
|
||||
if(targetIndex == -1) return;
|
||||
menu->selected = targetIndex;
|
||||
}
|
||||
if(targetIndex == -1) return;
|
||||
menu->selected = targetIndex;
|
||||
}
|
||||
|
||||
menuitem_t * menuAdd(menu_t *menu) {
|
||||
menuitem_t *item = menu->items + menu->itemCount;
|
||||
|
||||
item->i = menu->itemCount;
|
||||
item->x = 0;
|
||||
item->y = 0;
|
||||
item->width = 1;
|
||||
item->height = 1;
|
||||
|
||||
menu->itemCount++;
|
||||
return item;
|
||||
}
|
@ -26,4 +26,12 @@ void menuInit(menu_t *menu);
|
||||
* @param menu Menu to update.
|
||||
* @param engine Engine to update from.
|
||||
*/
|
||||
void menuUpdate(menu_t *menu, engine_t *engine);
|
||||
void menuUpdate(menu_t *menu, engine_t *engine);
|
||||
|
||||
/**
|
||||
* Add an item to the menu
|
||||
*
|
||||
* @param menu Menu to add to.
|
||||
* @return Item to add to.
|
||||
*/
|
||||
menuitem_t * menuAdd(menu_t *menu);
|
Reference in New Issue
Block a user