diff --git a/include/nn/swkbd/swkbd_cpp.h b/include/nn/swkbd/swkbd_cpp.h index c2b5f302..42a05e6f 100644 --- a/include/nn/swkbd/swkbd_cpp.h +++ b/include/nn/swkbd/swkbd_cpp.h @@ -98,10 +98,10 @@ enum class State enum class InputFormType { - //! Input form seen when adding an NNID on Friends List or creating a folder on the System Menu. (Individual square design with up to 40 characters) - InputForm0 = 0, - //! The default input layout that is usually used (Page design) - Default = 1, + //! Spaced boxes design with up to 40 characters + Boxes = 0, + //! The page design + Page = 1, }; enum class KeyboardLayout @@ -247,7 +247,7 @@ WUT_CHECK_SIZE(KeyboardArg, 0xC0); struct InputFormArg { //! The type of input form - InputFormType type = InputFormType::Default; + InputFormType type = InputFormType::Page; int32_t unk_0x04 = -1; //! Initial string to open the keyboard with const char16_t *initialText = nullptr; @@ -258,8 +258,8 @@ struct InputFormArg //! Which password inputting preset to use nn::swkbd::PasswordMode passwordMode = nn::swkbd::PasswordMode::Clear; uint32_t unk_0x18 = 0; - //! Whether or not to draw a cursor. Exclusive to the inputform0 input form type. - bool drawInput0Cursor = false; + //! Whether or not to draw a cursor. Exclusive to the boxes input form type. + bool drawCursorForBoxes = true; //! Whether or not to highlight the initial string. Exclusive to the Default input form type. bool higlightInitialText = false; //! Whether or not to show a copy and a paste button. @@ -273,7 +273,7 @@ WUT_CHECK_OFFSET(InputFormArg, 0x0C, hintText); WUT_CHECK_OFFSET(InputFormArg, 0x10, maxTextLength); WUT_CHECK_OFFSET(InputFormArg, 0x14, passwordMode); WUT_CHECK_OFFSET(InputFormArg, 0x18, unk_0x18); -WUT_CHECK_OFFSET(InputFormArg, 0x1C, drawInput0Cursor); +WUT_CHECK_OFFSET(InputFormArg, 0x1C, drawCursorForBoxes); WUT_CHECK_OFFSET(InputFormArg, 0x1D, higlightInitialText); WUT_CHECK_OFFSET(InputFormArg, 0x1E, showCopyPasteButtons); WUT_CHECK_SIZE(InputFormArg, 0x20); diff --git a/samples/cmake/erreula/main.cpp b/samples/cmake/erreula/main.cpp index 8003b1c1..260ff5c7 100644 --- a/samples/cmake/erreula/main.cpp +++ b/samples/cmake/erreula/main.cpp @@ -1,6 +1,9 @@ #include #include +#include #include +#include +#include #include #include @@ -15,7 +18,7 @@ main(int argc, char **argv) WHBProcInit(); WHBGfxInit(); FSInit(); - VPADInit(); + AXInit(); // Create FSClient for erreula FSClient *fsClient = (FSClient *)MEMAllocFromDefaultHeap(sizeof(FSClient)); @@ -33,6 +36,9 @@ main(int argc, char **argv) return -1; } + // Play a sound effect that will play when erreula appears on screen + nn::erreula::PlayAppearSE(true); + // Show the error viewer nn::erreula::AppearArg appearArg; appearArg.errorArg.errorType = nn::erreula::ErrorType::Message2Button; @@ -44,6 +50,10 @@ main(int argc, char **argv) appearArg.errorArg.errorTitle = u"Title"; nn::erreula::AppearErrorViewer(appearArg); + // Get WHBGfx's colour buffers for proper erreula rendering + GX2ColorBuffer *cbTV = WHBGfxGetTVColourBuffer(); + GX2ColorBuffer *cbDRC = WHBGfxGetDRCColourBuffer(); + WHBLogPrintf("Begin rendering..."); while (WHBProcIsRunning()) { // Read vpad for erreula::Calc @@ -62,19 +72,39 @@ main(int argc, char **argv) if (nn::erreula::IsDecideSelectButtonError()) { nn::erreula::DisappearErrorViewer(); - break; + SYSLaunchMenu(); } WHBGfxBeginRender(); WHBGfxBeginRenderTV(); WHBGfxClearColor(0.0f, 0.0f, 1.0f, 1.0f); + // Set our colour buffer's surface format to SRGB for correct rendering of erreula + GX2SurfaceFormat fTV = cbTV->surface.format; + cbTV->surface.format = GX2_SURFACE_FORMAT_SRGB_R8_G8_B8_A8; + GX2InitColorBufferRegs(cbTV); + GX2SetColorBuffer(cbTV, GX2_RENDER_TARGET_0); + nn::erreula::DrawTV(); + + // Set our colour buffer's surface format back to what it was before. + cbTV->surface.format = fTV; + GX2InitColorBufferRegs(cbTV); + GX2SetColorBuffer(cbTV, GX2_RENDER_TARGET_0); WHBGfxFinishRenderTV(); WHBGfxBeginRenderDRC(); WHBGfxClearColor(1.0f, 0.0f, 1.0f, 1.0f); + GX2SurfaceFormat fDRC = cbDRC->surface.format; + cbDRC->surface.format = GX2_SURFACE_FORMAT_SRGB_R8_G8_B8_A8; + GX2InitColorBufferRegs(cbDRC); + GX2SetColorBuffer(cbDRC, GX2_RENDER_TARGET_0); + nn::erreula::DrawDRC(); + + cbDRC->surface.format = fDRC; + GX2InitColorBufferRegs(cbDRC); + GX2SetColorBuffer(cbDRC, GX2_RENDER_TARGET_0); WHBGfxFinishRenderDRC(); WHBGfxFinishRender(); diff --git a/samples/cmake/swkbd/main.cpp b/samples/cmake/swkbd/main.cpp index 2dab8668..9f8cbaad 100644 --- a/samples/cmake/swkbd/main.cpp +++ b/samples/cmake/swkbd/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -17,7 +18,6 @@ main(int argc, char **argv) WHBProcInit(); WHBGfxInit(); FSInit(); - VPADInit(); AXInit(); // Create FSClient for swkbd @@ -35,9 +35,6 @@ main(int argc, char **argv) return -1; } - // Enable sound - nn::swkbd::MuteAllSound(false); - // Show the keyboard nn::swkbd::AppearArg appearArg; appearArg.keyboardArg.configArg.languageType = nn::swkbd::LanguageType::English; @@ -48,6 +45,10 @@ main(int argc, char **argv) return -1; } + // Get WHBGfx's colour buffers for proper swkbd rendering + GX2ColorBuffer *cbTV = WHBGfxGetTVColourBuffer(); + GX2ColorBuffer *cbDRC = WHBGfxGetDRCColourBuffer(); + WHBLogPrintf("Begin rendering..."); while (WHBProcIsRunning()) { // Read vpad for swkbd::Calc @@ -82,12 +83,32 @@ main(int argc, char **argv) WHBGfxBeginRenderTV(); WHBGfxClearColor(0.0f, 0.0f, 1.0f, 1.0f); + // Set our colour buffer's surface format to SRGB for correct rendering of swkbd + GX2SurfaceFormat fTV = cbTV->surface.format; + cbTV->surface.format = GX2_SURFACE_FORMAT_SRGB_R8_G8_B8_A8; + GX2InitColorBufferRegs(cbTV); + GX2SetColorBuffer(cbTV, GX2_RENDER_TARGET_0); + nn::swkbd::DrawTV(); + + // Set our colour buffer's surface format back to what it was before. + cbTV->surface.format = fTV; + GX2InitColorBufferRegs(cbTV); + GX2SetColorBuffer(cbTV, GX2_RENDER_TARGET_0); WHBGfxFinishRenderTV(); WHBGfxBeginRenderDRC(); WHBGfxClearColor(1.0f, 0.0f, 1.0f, 1.0f); + GX2SurfaceFormat fDRC = cbDRC->surface.format; + cbDRC->surface.format = GX2_SURFACE_FORMAT_SRGB_R8_G8_B8_A8; + GX2InitColorBufferRegs(cbDRC); + GX2SetColorBuffer(cbDRC, GX2_RENDER_TARGET_0); + nn::swkbd::DrawDRC(); + + cbDRC->surface.format = fDRC; + GX2InitColorBufferRegs(cbDRC); + GX2SetColorBuffer(cbDRC, GX2_RENDER_TARGET_0); WHBGfxFinishRenderDRC(); WHBGfxFinishRender();