mirror of
https://github.com/kichikuou/system3-sdl2.git
synced 2026-09-29 18:38:13 +03:00
Android: Add system menu
The system menu opens with 3-finger touch. Currently, it can only exit the game.
This commit is contained in:
@@ -22,6 +22,10 @@ import android.media.MediaPlayer
|
||||
import android.os.Bundle
|
||||
import android.text.InputType
|
||||
import android.util.Log
|
||||
import android.view.ContextMenu
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.widget.EditText
|
||||
import org.libsdl.app.SDLActivity
|
||||
import java.io.File
|
||||
@@ -44,6 +48,7 @@ class GameActivity : SDLActivity() {
|
||||
super.onCreate(savedInstanceState)
|
||||
gameRoot = File(intent.getStringExtra(EXTRA_GAME_ROOT))
|
||||
cdda = CddaPlayer(File(gameRoot, Launcher.PLAYLIST_FILE))
|
||||
registerForContextMenu(mLayout)
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
@@ -97,6 +102,34 @@ class GameActivity : SDLActivity() {
|
||||
.show()
|
||||
}
|
||||
|
||||
private var menuShown = false
|
||||
private fun openMenu() {
|
||||
if (menuShown)
|
||||
return
|
||||
openContextMenu(mLayout)
|
||||
menuShown = true
|
||||
}
|
||||
|
||||
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
|
||||
super.onCreateContextMenu(menu, v, menuInfo)
|
||||
menuInflater.inflate(R.menu.game_menu, menu)
|
||||
}
|
||||
|
||||
override fun onContextItemSelected(item: MenuItem): Boolean {
|
||||
return when (item.itemId) {
|
||||
R.id.quit_game -> {
|
||||
finish()
|
||||
true
|
||||
}
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onContextMenuClosed(menu: Menu?) {
|
||||
super.onContextMenuClosed(menu)
|
||||
menuShown = false
|
||||
}
|
||||
|
||||
// The functions below are called in the SDL thread by JNI.
|
||||
@Suppress("unused") fun cddaStart(track: Int, loop: Boolean) = cdda.start(track, loop)
|
||||
@Suppress("unused") fun cddaStop() = cdda.stop()
|
||||
@@ -118,6 +151,10 @@ class GameActivity : SDLActivity() {
|
||||
}
|
||||
return result[0]
|
||||
}
|
||||
|
||||
@Suppress("unused") fun popupMenu() {
|
||||
runOnUiThread { openMenu() }
|
||||
}
|
||||
}
|
||||
|
||||
private class CddaPlayer(private val playlistPath: File) {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:id="@+id/quit_game"
|
||||
android:title="@string/action_quit_game" />
|
||||
</menu>
|
||||
@@ -3,6 +3,7 @@
|
||||
<string name="app_name">System3</string>
|
||||
<string name="action_export_save_data">セーブデータをエクスポート</string>
|
||||
<string name="action_import_save_data">セーブデータをインポート</string>
|
||||
<string name="action_quit_game">ゲーム終了</string>
|
||||
<string name="cancel">キャンセル</string>
|
||||
<string name="cannot_find_adisk">System3 のファイル (*.dat) が見つかりません。</string>
|
||||
<string name="choose_a_file">ファイルを選択</string>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
<string name="app_name">System3</string>
|
||||
<string name="action_export_save_data">Export Save Files</string>
|
||||
<string name="action_import_save_data">Import Save Files</string>
|
||||
<string name="action_quit_game">Quit Game</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="cannot_find_adisk">Cannot find System3 game files (*.dat).</string>
|
||||
<string name="choose_a_file">Choose a file</string>
|
||||
@@ -11,7 +12,7 @@
|
||||
<string name="install_from_zip">Install from ZIP</string>
|
||||
<string name="install_progress">Extracting %s</string>
|
||||
<string name="no_data_to_import">No save/ folder in the ZIP archive.</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="ok" translatable="false">OK</string>
|
||||
<string name="save_data_export_error">Failed to export save files.</string>
|
||||
<string name="save_data_import_success">Imported successfully.</string>
|
||||
<string name="save_data_export_success">Exported successfully.</string>
|
||||
|
||||
@@ -47,6 +47,15 @@ void NACT::output_console(const char *format, ...)
|
||||
#endif
|
||||
}
|
||||
|
||||
void NACT::on_syswmevent(SDL_SysWMmsg* msg)
|
||||
bool NACT::handle_platform_event(const SDL_Event& e)
|
||||
{
|
||||
if (e.type == SDL_FINGERDOWN && SDL_GetNumTouchFingers(e.tfinger.touchId) == 3) {
|
||||
JNILocalFrame jni(16);
|
||||
if (jni.env()) {
|
||||
jmethodID mid = jni.GetMethodID("popupMenu", "()V");
|
||||
jni.env()->CallVoidMethod(jni.context(), mid);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ void NACT::output_console(const char *format, ...)
|
||||
#endif
|
||||
}
|
||||
|
||||
void NACT::on_syswmevent(SDL_SysWMmsg* msg)
|
||||
bool NACT::handle_platform_event(const SDL_Event& e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ void NACT::output_console(const char *format, ...)
|
||||
#endif
|
||||
}
|
||||
|
||||
void NACT::on_syswmevent(SDL_SysWMmsg* msg)
|
||||
bool NACT::handle_platform_event(const SDL_Event& e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ public:
|
||||
|
||||
#ifdef _WIN32
|
||||
void select_sound(BGMDevice dev);
|
||||
void on_mci_notify(SDL_SysWMmsg* msg);
|
||||
void on_mci_notify(const SDL_SysWMmsg* msg);
|
||||
#endif
|
||||
#ifdef __EMSCRIPTEN__
|
||||
void select_synthesizer(bool use_fm);
|
||||
|
||||
+1
-1
@@ -267,7 +267,7 @@ public:
|
||||
|
||||
private:
|
||||
void pump_events();
|
||||
void on_syswmevent(SDL_SysWMmsg* msg);
|
||||
bool handle_platform_event(const SDL_Event& e);
|
||||
};
|
||||
|
||||
class NACT_Sys1 final : public NACT {
|
||||
|
||||
@@ -19,6 +19,9 @@ void NACT::pump_events()
|
||||
{
|
||||
SDL_Event e;
|
||||
while (SDL_PollEvent(&e)) {
|
||||
if (handle_platform_event(e))
|
||||
continue;
|
||||
|
||||
switch (e.type) {
|
||||
case SDL_QUIT:
|
||||
terminate = true;
|
||||
@@ -40,10 +43,6 @@ void NACT::pump_events()
|
||||
case SDL_APP_DIDENTERFOREGROUND:
|
||||
ags->flush_screen(false);
|
||||
break;
|
||||
|
||||
case SDL_SYSWMEVENT:
|
||||
on_syswmevent(e.syswm.msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -200,7 +200,7 @@ public:
|
||||
return playing;
|
||||
}
|
||||
|
||||
bool on_mci_notify(SDL_SysWMmsg* msg) {
|
||||
bool on_mci_notify(const SDL_SysWMmsg* msg) {
|
||||
if (msg->msg.win.lParam != mci_thread->device_id())
|
||||
return true;
|
||||
switch (msg->msg.win.wParam) {
|
||||
@@ -421,7 +421,7 @@ bool MAKO::check_pcm()
|
||||
return !PlaySound(null_wav, NULL, SND_ASYNC | SND_MEMORY | SND_NOSTOP);
|
||||
}
|
||||
|
||||
void MAKO::on_mci_notify(SDL_SysWMmsg* msg)
|
||||
void MAKO::on_mci_notify(const SDL_SysWMmsg* msg)
|
||||
{
|
||||
if (!music)
|
||||
return;
|
||||
|
||||
@@ -130,8 +130,12 @@ void NACT::output_console(const char *format, ...)
|
||||
#endif
|
||||
}
|
||||
|
||||
void NACT::on_syswmevent(SDL_SysWMmsg* msg)
|
||||
bool NACT::handle_platform_event(const SDL_Event& e)
|
||||
{
|
||||
if (e.type != SDL_SYSWMEVENT)
|
||||
return false;
|
||||
const SDL_SysWMmsg* msg = e.syswm.msg;
|
||||
|
||||
switch (msg->msg.win.msg) {
|
||||
case WM_COMMAND:
|
||||
switch (msg->msg.win.wParam) {
|
||||
@@ -171,4 +175,5 @@ void NACT::on_syswmevent(SDL_SysWMmsg* msg)
|
||||
mako->on_mci_notify(msg);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user