all repos — mgba @ 7c906e855866d015ae23c35c35066d6838ecec21

mGBA Game Boy Advance Emulator

src/gba/context/gui-runner.c (view raw)

  1/* Copyright (c) 2013-2015 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#include "gui-runner.h"
  7
  8#include "util/gui/file-select.h"
  9#include "util/gui/font.h"
 10#include "util/gui/menu.h"
 11
 12enum {
 13	RUNNER_CONTINUE,
 14	RUNNER_EXIT
 15};
 16
 17void GBAGUIInit(struct GBAGUIRunner* runner, const char* port) {
 18	GUIInit(&runner->params);
 19	GBAContextInit(&runner->context, port);
 20	if (runner->setup) {
 21		runner->setup(runner);
 22	}
 23}
 24
 25void GBAGUIDeinit(struct GBAGUIRunner* runner) {
 26	if (runner->teardown) {
 27		runner->teardown(runner);
 28	}
 29	GBAContextDeinit(&runner->context);
 30}
 31
 32void GBAGUIRunloop(struct GBAGUIRunner* runner) {
 33	struct GUIMenu pauseMenu = {
 34		.title = "Game Paused",
 35		.index = 0,
 36	};
 37	GUIMenuItemListInit(&pauseMenu.items, 0);
 38	*GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Unpause", .data = (void*) RUNNER_CONTINUE };
 39	*GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Exit game", .data = (void*) RUNNER_EXIT };
 40
 41	while (true) {
 42		if (runner->params.guiPrepare) {
 43			runner->params.guiPrepare();
 44		}
 45		char path[256];
 46		if (!GUISelectFile(&runner->params, path, sizeof(path), GBAIsROM)) {
 47			if (runner->params.guiFinish) {
 48				runner->params.guiFinish();
 49			}
 50			GUIMenuItemListDeinit(&pauseMenu.items);
 51			return;
 52		}
 53
 54		// TODO: Message box API
 55		runner->params.drawStart();
 56		GUIFontPrint(runner->params.font, runner->params.width / 2, (GUIFontHeight(runner->params.font) + runner->params.height) / 2, GUI_TEXT_CENTER, 0xFFFFFFFF, "Loading...");
 57		runner->params.drawEnd();
 58		runner->params.drawStart();
 59		GUIFontPrint(runner->params.font, runner->params.width / 2, (GUIFontHeight(runner->params.font) + runner->params.height) / 2, GUI_TEXT_CENTER, 0xFFFFFFFF, "Loading...");
 60		runner->params.drawEnd();
 61
 62		if (!GBAContextLoadROM(&runner->context, path, true)) {
 63			int i;
 64			for (i = 0; i < 300; ++i) {
 65				runner->params.drawStart();
 66				GUIFontPrint(runner->params.font, runner->params.width / 2, (GUIFontHeight(runner->params.font) + runner->params.height) / 2, GUI_TEXT_CENTER, 0xFFFFFFFF, "Load failed!");
 67				runner->params.drawEnd();
 68			}
 69		}
 70		if (runner->params.guiFinish) {
 71			runner->params.guiFinish();
 72		}
 73		GBAContextStart(&runner->context);
 74		if (runner->gameLoaded) {
 75			runner->gameLoaded(runner);
 76		}
 77		bool running = true;
 78		while (running) {
 79			while (true) {
 80				int guiKeys = runner->params.pollInput();
 81				if (guiKeys & (1 << GUI_INPUT_CANCEL)) {
 82					break;
 83				}
 84				uint16_t keys = runner->pollGameInput(runner);
 85				if (runner->prepareForFrame) {
 86					runner->prepareForFrame(runner);
 87				}
 88				GBAContextFrame(&runner->context, keys);
 89				if (runner->drawFrame) {
 90					runner->drawFrame(runner, false);
 91				}
 92			}
 93
 94			if (runner->params.guiPrepare) {
 95				runner->params.guiPrepare();
 96			}
 97			GUIInvalidateKeys(&runner->params);
 98			while (true) {
 99				struct GUIMenuItem item;
100				enum GUIMenuExitReason reason = GUIShowMenu(&runner->params, &pauseMenu, &item);
101				if (reason == GUI_MENU_EXIT_ACCEPT) {
102					if (item.data == (void*) RUNNER_EXIT) {
103						running = false;
104						break;
105					}
106					if (item.data == (void*) RUNNER_CONTINUE) {
107						int keys = -1;
108						while (keys) {
109							GUIPollInput(&runner->params, 0, &keys);
110						}
111						break;
112					}
113				} else {
114					int keys = -1;
115					while (keys) {
116						GUIPollInput(&runner->params, 0, &keys);
117					}
118					break;
119				}
120			}
121			if (runner->params.guiFinish) {
122				runner->params.guiFinish();
123			}
124		}
125		GBAContextStop(&runner->context);
126		if (runner->gameUnloaded) {
127			runner->gameUnloaded(runner);
128		}
129		GBAContextUnloadROM(&runner->context);
130	}
131	GUIMenuItemListDeinit(&pauseMenu.items);
132}