- if (button == MB_MENU_INITIALIZE)
- {
- /* advance to first valid menu entry */
- while (choice < num_setup_info &&
- setup_info[choice].type & TYPE_SKIP_ENTRY)
- choice++;
-
- if (position_set_by_scrollbar)
- first_entry = first_entry_store[setup_mode] = dy;
- else
- AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_setup_info,
- NUM_MENU_ENTRIES_ON_SCREEN, first_entry);
-
- drawSetupInfoList(setup_info, first_entry, NUM_MENU_ENTRIES_ON_SCREEN);
-
- if (choice < first_entry)
- {
- choice = first_entry;
-
- if (setup_info[choice].type & TYPE_SKIP_ENTRY)
- choice++;
- }
- else if (choice > first_entry + num_page_entries - 1)
- {
- choice = first_entry + num_page_entries - 1;
-
- if (setup_info[choice].type & TYPE_SKIP_ENTRY)
- choice--;
- }
-
- choice_store[setup_mode] = choice;
-
- DrawCursorAndText_Setup(choice - first_entry, choice, TRUE);
-
- return;
- }
- else if (button == MB_MENU_LEAVE)
- {
- int i;
-
- PlaySound(SND_MENU_ITEM_SELECTING);
-
- for (i = 0; setup_info[i].type != 0; i++)
- {
- if (setup_info[i].type & TYPE_LEAVE_MENU)
- {
- void (*menu_callback_function)(void) = setup_info[i].value;
-
- FadeSetLeaveMenu();
-
- menu_callback_function();
-
- break; /* absolutely needed because function changes 'setup_info'! */
- }
- }
-
- return;
- }
-
- if (mx || my) /* mouse input */
- {
- x = (mx - mSX) / 32;
- y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS;
- }
- else if (dx || dy) /* keyboard or scrollbar/scrollbutton input */
- {
- /* move cursor instead of scrolling when already at start/end of list */
- if (dy == -1 * SCROLL_LINE && first_entry == 0)
- dy = -1;
- else if (dy == +1 * SCROLL_LINE &&
- first_entry + num_page_entries == max_setup_info)
- dy = 1;
-
- /* handle scrolling screen one line or page */
- if (y + dy < 0 ||
- y + dy > num_page_entries - 1)
- {
- boolean redraw = FALSE;
-
- if (ABS(dy) == SCROLL_PAGE)
- step = num_page_entries - 1;
-
- if (dy < 0 && first_entry > 0)
- {
- /* scroll page/line up */
-
- first_entry -= step;
- if (first_entry < 0)
- first_entry = 0;
-
- redraw = TRUE;
- }
- else if (dy > 0 && first_entry + num_page_entries < max_setup_info)
- {
- /* scroll page/line down */
-
- first_entry += step;
- if (first_entry + num_page_entries > max_setup_info)
- first_entry = MAX(0, max_setup_info - num_page_entries);
-
- redraw = TRUE;
- }
-
- if (redraw)
- {
- choice += first_entry - first_entry_store[setup_mode];
-
- if (choice < first_entry)
- {
- choice = first_entry;
-
- if (setup_info[choice].type & TYPE_SKIP_ENTRY)
- choice++;
- }
- else if (choice > first_entry + num_page_entries - 1)
- {
- choice = first_entry + num_page_entries - 1;
-
- if (setup_info[choice].type & TYPE_SKIP_ENTRY)
- choice--;
- }
- else if (setup_info[choice].type & TYPE_SKIP_ENTRY)
- {
- choice += SIGN(dy);
-
- if (choice < first_entry ||
- choice > first_entry + num_page_entries - 1)
- first_entry += SIGN(dy);
- }
-
- first_entry_store[setup_mode] = first_entry;
- choice_store[setup_mode] = choice;
-
- drawSetupInfoList(setup_info, first_entry, NUM_MENU_ENTRIES_ON_SCREEN);
-
- DrawCursorAndText_Setup(choice - first_entry, choice, TRUE);
-
- AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_setup_info,
- NUM_MENU_ENTRIES_ON_SCREEN, first_entry);
- }
-
- return;
- }
-
- if (dx)
- {
- int menu_navigation_type = (dx < 0 ? TYPE_LEAVE : TYPE_ENTER);
-
- if (setup_info[choice].type & menu_navigation_type ||
- setup_info[choice].type & TYPE_BOOLEAN_STYLE ||
- setup_info[choice].type & TYPE_YES_NO_AUTO)
- button = MB_MENU_CHOICE;
- }
- else if (dy)
- y += dy;
-
- /* jump to next non-empty menu entry (up or down) */
- while (first_entry + y > 0 &&
- first_entry + y < max_setup_info - 1 &&
- setup_info[first_entry + y].type & TYPE_SKIP_ENTRY)
- y += dy;
-
- if (!IN_VIS_MENU(x, y))
- {
- choice += y - y_old;
-
- if (choice < first_entry)
- first_entry = choice;
- else if (choice > first_entry + num_page_entries - 1)
- first_entry = choice - num_page_entries + 1;
-
- if (first_entry >= 0 &&
- first_entry + num_page_entries <= max_setup_info)
- {
- first_entry_store[setup_mode] = first_entry;
-
- if (choice < first_entry)
- choice = first_entry;
- else if (choice > first_entry + num_page_entries - 1)
- choice = first_entry + num_page_entries - 1;
-
- choice_store[setup_mode] = choice;
-
- drawSetupInfoList(setup_info, first_entry, NUM_MENU_ENTRIES_ON_SCREEN);
-
- DrawCursorAndText_Setup(choice - first_entry, choice, TRUE);
-
- AdjustScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, max_setup_info,
- NUM_MENU_ENTRIES_ON_SCREEN, first_entry);
- }
-
- return;
- }
- }
-
- if (!anyScrollbarGadgetActive() &&
- IN_VIS_MENU(x, y) &&
- mx < screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->x &&
- y >= 0 && y < num_page_entries)
- {
- if (button)
- {
- if (first_entry + y != choice &&
- setup_info[first_entry + y].type & ~TYPE_SKIP_ENTRY)
- {
- PlaySound(SND_MENU_ITEM_ACTIVATING);
-
- DrawCursorAndText_Setup(choice - first_entry, choice, FALSE);
- DrawCursorAndText_Setup(y, first_entry + y, TRUE);
-
- choice = choice_store[setup_mode] = first_entry + y;
- }
- }
- else if (!(setup_info[first_entry + y].type & TYPE_GHOSTED))
- {
- PlaySound(SND_MENU_ITEM_SELECTING);
-
- /* when selecting key headline, execute function for key value change */
- if (setup_info[first_entry + y].type & TYPE_KEYTEXT &&
- setup_info[first_entry + y + 1].type & TYPE_KEY)
- y++;
-
- /* when selecting string value, execute function for list selection */
- if (setup_info[first_entry + y].type & TYPE_STRING && y > 0 &&
- setup_info[first_entry + y - 1].type & TYPE_ENTER_LIST)
- y--;
-
- if (setup_info[first_entry + y].type & TYPE_ENTER_OR_LEAVE)
- {
- void (*menu_callback_function)(void) =
- setup_info[first_entry + y].value;
-
- FadeSetFromType(setup_info[first_entry + y].type);
-
- menu_callback_function();
- }
- else
- {
- if (setup_info[first_entry + y].type & TYPE_VALUE)
- changeSetupValue(y, first_entry + y, dx);
- }
- }
- }
-}
-
-void DrawSetupScreen_Input()
-{
- int i;