SDL: N-Gage port: add changes from code reviews, overall cleanup (#5618)

From 9b75fa01659bea7f6195386391262e239054103a Mon Sep 17 00:00:00 2001
From: Michael Fitzmayer <[EMAIL REDACTED]>
Date: Wed, 11 May 2022 18:31:34 +0200
Subject: [PATCH] N-Gage port: add changes from code reviews, overall cleanup
 (#5618)

* Add changes from code review by @ccawley2011, #5597, overall cleanup

* Update N-Gage README, minor cleanup and rephrasing

* Call SDL_SetMainReady() before calling SDL_main, return SDL_main instead of main
---
 docs/README-ngage.md                     | 16 ++++++++--------
 include/SDL_config_ngage.h               |  2 +-
 src/main/ngage/SDL_ngage_main.cpp        |  6 +++---
 src/thread/ngage/SDL_sysmutex.cpp        | 20 ++++++++++++++++++--
 src/thread/ngage/SDL_syssem.cpp          |  2 +-
 src/thread/ngage/SDL_systhread.cpp       | 13 -------------
 src/video/ngage/SDL_ngageevents.cpp      | 10 +++++-----
 src/video/ngage/SDL_ngageframebuffer.cpp | 23 +++++++++++++++--------
 8 files changed, 51 insertions(+), 41 deletions(-)

diff --git a/docs/README-ngage.md b/docs/README-ngage.md
index 73878874a00..83c2e3384c4 100644
--- a/docs/README-ngage.md
+++ b/docs/README-ngage.md
@@ -1,7 +1,7 @@
 Nokia N-Gage
 ============
 
-SDL2 port for Symbian S60v1/2 with a main focus on the Nokia N-Gage
+SDL2 port for Symbian S60v1 and v2 with a main focus on the Nokia N-Gage
 (Classic and QD) by [Michael Fitzmayer](https://github.com/mupfdev).
 
 Compiling
@@ -13,8 +13,7 @@ The library is included in the
 sub-module.
 
 A complete example project based on SDL2 can be found in the GitHub
-account of the SDK: [Example
-project](https://github.com/ngagesdk/wordle).
+account of the SDK: [Wordle](https://github.com/ngagesdk/wordle).
 
 Current level of implementation
 -------------------------------
@@ -30,8 +29,9 @@ Acknowledgements
 ----------------
 
 Thanks to Hannu Viitala, Kimmo Kinnunen and Markus Mertama for the
-valuable insight into Symbian programming.  Without the SDL 1.2 port for
-CDoom, this adaptation would not have been possible.
+valuable insight into Symbian programming.  Without the SDL 1.2 port
+which was specially developed for CDoom (Doom for the Nokia 9210), this
+adaptation would not have been possible.
 
 I would like to thank my friends
 [Razvan](https://twitter.com/bewarerazvan) and [Dan
@@ -39,6 +39,6 @@ Whelan](https://danwhelan.ie/), for their continuous support.  Without
 you and the [N-Gage community](https://discord.gg/dbUzqJ26vs), I would
 have lost my patience long ago.
 
-Last but not least, I would like to say a special thank you to the
-[EKA2L1](https://12z1.com/) team.  Thank you for all your patience and
-support in troubleshooting.
+Last but not least, I would like to thank the development team of
+[EKA2L1](https://12z1.com/) (an experimental Symbian OS emulator). Your
+patience and support in troubleshooting helped me a lot.
diff --git a/include/SDL_config_ngage.h b/include/SDL_config_ngage.h
index 07f92541e2e..a9d2d37ab5e 100644
--- a/include/SDL_config_ngage.h
+++ b/include/SDL_config_ngage.h
@@ -62,7 +62,7 @@ typedef unsigned long      uintptr_t;
 /* Enable the N-Gage timer support (src/timer/ngage/\*.c) */
 #define SDL_TIMER_NGAGE  1
 
-/* Enable the N=Hahe video driver (src/video/ngage/\*.c) */
+/* Enable the N-Gage video driver (src/video/ngage/\*.c) */
 #define SDL_VIDEO_DRIVER_NGAGE 1
 
 /* Enable the dummy audio driver (src/audio/dummy/\*.c) */
diff --git a/src/main/ngage/SDL_ngage_main.cpp b/src/main/ngage/SDL_ngage_main.cpp
index bb0f07c26a0..6dbf2f14168 100644
--- a/src/main/ngage/SDL_ngage_main.cpp
+++ b/src/main/ngage/SDL_ngage_main.cpp
@@ -1,6 +1,5 @@
 /*
-    EPOC version (originally for SDL 1.2) by Hannu Viitala
-    (hannu.j.viitala@mbnet.fi).
+    SDL_ngage_main.c, originally for SDL 1.2 by Hannu Viitala
 */
 #include "../../SDL_internal.h"
 
@@ -68,7 +67,8 @@ TInt E32Main()
     {
         oldHeap = User::SwitchHeap(newHeap);
         /* Call stdlib main */
-        ret = main(argc, argv);
+        SDL_SetMainReady();
+        ret = SDL_main(argc, argv);
     }
 
 cleanup:
diff --git a/src/thread/ngage/SDL_sysmutex.cpp b/src/thread/ngage/SDL_sysmutex.cpp
index a79b8ae0e04..34cf4510d6d 100644
--- a/src/thread/ngage/SDL_sysmutex.cpp
+++ b/src/thread/ngage/SDL_sysmutex.cpp
@@ -20,7 +20,7 @@
 */
 #include "../../SDL_internal.h"
 
-/* An implementation of mutexes using semaphores */
+/* An implementation of mutexes using the Symbian API. */
 
 #include <e32std.h>
 
@@ -70,6 +70,22 @@ SDL_DestroyMutex(SDL_mutex * mutex)
     }
 }
 
+/* Try to lock the mutex */
+#if 0
+int
+SDL_TryLockMutex(SDL_mutex * mutex)
+{
+    if (mutex == NULL)
+    {
+        SDL_SetError("Passed a NULL mutex.");
+        return -1;
+    }
+
+    // Not yet implemented.
+    return 0;
+}
+#endif
+
 /* Lock the mutex */
 int
 SDL_LockMutex(SDL_mutex * mutex)
@@ -89,7 +105,7 @@ SDL_LockMutex(SDL_mutex * mutex)
 
 /* Unlock the mutex */
 int
-SDL_mutexV(SDL_mutex * mutex)
+SDL_UnlockMutex(SDL_mutex * mutex)
 {
     if ( mutex == NULL )
     {
diff --git a/src/thread/ngage/SDL_syssem.cpp b/src/thread/ngage/SDL_syssem.cpp
index f7e97ad52e7..ab277ca5d0a 100644
--- a/src/thread/ngage/SDL_syssem.cpp
+++ b/src/thread/ngage/SDL_syssem.cpp
@@ -20,7 +20,7 @@
 */
 #include "../../SDL_internal.h"
 
-/* An implementation of semaphores using mutexes and condition variables */
+/* An implementation of semaphores using the Symbian API. */
 
 #include <e32std.h>
 
diff --git a/src/thread/ngage/SDL_systhread.cpp b/src/thread/ngage/SDL_systhread.cpp
index 18596d99469..f2c30f7b628 100644
--- a/src/thread/ngage/SDL_systhread.cpp
+++ b/src/thread/ngage/SDL_systhread.cpp
@@ -128,19 +128,6 @@ SDL_SYS_DetachThread(SDL_Thread * thread)
     return;
 }
 
-/* WARNING: This function is really a last resort.
- * Threads should be signaled and then exit by themselves.
- * TerminateThread() doesn't perform stack and DLL cleanup.
- */
-void
-SDL_SYS_KillThread(SDL_Thread *thread)
-{
-    RThread rthread;
-    rthread.SetHandle(thread->handle);
-    rthread.Kill(0);
-    rthread.Close();
-}
-
 #endif /* SDL_THREAD_NGAGE */
 
 /* vim: ts=4 sw=4
diff --git a/src/video/ngage/SDL_ngageevents.cpp b/src/video/ngage/SDL_ngageevents.cpp
index 659548ad298..a136333764a 100644
--- a/src/video/ngage/SDL_ngageevents.cpp
+++ b/src/video/ngage/SDL_ngageevents.cpp
@@ -113,7 +113,7 @@ static SDL_Scancode ConvertScancode(_THIS, int key)
             keycode = SDLK_ASTERISK;
             break;
         case EStdKeyHash:         // Hash
-            keycode = SDLK_SLASH;
+            keycode = SDLK_HASH;
             break;
         case EStdKeyDevice0:      // Left softkey
             keycode = SDLK_SOFTLEFT;
@@ -121,14 +121,14 @@ static SDL_Scancode ConvertScancode(_THIS, int key)
         case EStdKeyDevice1:      // Right softkey
             keycode = SDLK_SOFTRIGHT;
             break;
-        case EStdKeyApplication0: // Green softkey
+        case EStdKeyApplication0: // Call softkey
             keycode = SDLK_CALL;
             break;
-        case EStdKeyApplication1: // Red softkey
+        case EStdKeyApplication1: // End call softkey
             keycode = SDLK_ENDCALL;
             break;
         case EStdKeyDevice3:      // Middle softkey
-            keycode = SDLK_RETURN;
+            keycode = SDLK_SELECT;
             break;
         case EStdKeyUpArrow:      // Up arrow
             keycode = SDLK_UP;
@@ -166,7 +166,7 @@ int HandleWsEvent(_THIS, const TWsEvent& aWsEvent)
         case EEventFocusGained: /* SDL window got focus */
             phdata->NGAGE_IsWindowFocused = ETrue;
             /* Draw window background and screen buffer */
-            DisableKeyBlocking(_this);  //Markus: guess why :-)
+            DisableKeyBlocking(_this);
             RedrawWindowL(_this);
             break;
         case EEventFocusLost: /* SDL window lost focus */
diff --git a/src/video/ngage/SDL_ngageframebuffer.cpp b/src/video/ngage/SDL_ngageframebuffer.cpp
index 139d46f4c7b..a67fa5a8a02 100644
--- a/src/video/ngage/SDL_ngageframebuffer.cpp
+++ b/src/video/ngage/SDL_ngageframebuffer.cpp
@@ -106,11 +106,16 @@ int SDL_NGAGE_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * forma
     {
         phdata->NGAGE_FrameBuffer += 32;
     }
-    /*if (phdata->NGAGE_HasFrameBuffer && GetBpp(displayMode) == 12)
-      phdata->NGAGE_FrameBuffer += 16 * 2;
-      if (phdata->NGAGE_HasFrameBuffer && GetBpp(displayMode) == 16)
-      phdata->NGAGE_FrameBuffer += 16 * 2;
-    */
+    #if 0
+    if (phdata->NGAGE_HasFrameBuffer && GetBpp(displayMode) == 12)
+    {
+        phdata->NGAGE_FrameBuffer += 16 * 2;
+    }
+    if (phdata->NGAGE_HasFrameBuffer && GetBpp(displayMode) == 16)
+    {
+        phdata->NGAGE_FrameBuffer += 16 * 2;
+    }
+    #endif
 
     // Get draw device for updating the screen
     TScreenInfoV01 screenInfo2;
@@ -367,11 +372,13 @@ void DirectUpdate(_THIS, int numrects, SDL_Rect *rects)
 
     TUint16* screenBuffer = (TUint16*)phdata->NGAGE_FrameBuffer;
 
-    /*if (phdata->NGAGE_ScreenOrientation == CFbsBitGc::EGraphicsOrientationRotated270)
+#if 0
+    if (phdata->NGAGE_ScreenOrientation == CFbsBitGc::EGraphicsOrientationRotated270)
     {
         // ...
     }
-    else */
+    else
+#endif
     {
         DirectDraw(_this, numrects, rects, screenBuffer);
     }
@@ -385,7 +392,7 @@ void DirectUpdate(_THIS, int numrects, SDL_Rect *rects)
         TInt  aBy   = rects[i].h;
         TRect rect2 = TRect(aAx, aAy, aBx, aBy);
 
-        phdata->NGAGE_DrawDevice->UpdateRegion(rect2); /* Should we update rects parameter area only?? */
+        phdata->NGAGE_DrawDevice->UpdateRegion(rect2); /* Should we update rects parameter area only? */
         phdata->NGAGE_DrawDevice->Update();
     }
 }