* Memory: Rework FCRAM management entirely Disables a lot of functionality... but I didn't want to commit too much to this commit Also reworks virtual memory management somewhat (but needs more work) * Accurately handle MemoryState for virtual memory Previously all non-free blocks were marked as Reserved * Memory: Consolidate state and permission changes Can now use a single function to change either state, permissions, or both Also merge vmem blocks that have the same state and permissions * Memory: Fix double reset for FCRAM manager Fix minor bug with permission tracking * Memory: Implement Protect operation in ControlMemory * Memory: Implement Unmap in ControlMemory Also do a sanity check to make sure the memory region is free for linear allocations * Memory: Make TLS only 0x200 bytes for each thread Also move TLS to Base region * RO: Unmap CROs when unloaded Thanks @noumidev * Kernel: Return used app memory for Commit ResourceLimit Not quite correct, but nothing to be done until process management is improved Also remove the stack limit for CXIs (thanks amogus) * Kernel: Report used app memory for GetProcessInfo 2 Not really correct, but it should be accurate for applications at least * Formatting changes * Initial fastmem support * PCSX2 fastmem depression * Move away from PCSX2 fastmem * Add enum_flag_ops.hpp * Finally building on Windows * Almost got a PoC * Fix arm64 builds * This somehow works * This also works... * Properly fix fastmem * Add free region manager * Update boost * Add ScopeExit * Comment out asserts on Linux/Mac/Android * Comment out ASSERT_MSG asserts too * Fix derp * Attempt to fix Android * Disable fastmem on Android * Fix Android again maybe pt 2 * android pls * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * Update host_memory.cpp * Properly reset memory arena on reset * Proper ashmem code for Android * more * Add temporary Android buildjet script for faster prototype builds * Fix fastmem (again) * Clean up shared memory * Remove Android BuildJet runner * a * Revert "a" This reverts commit 5443ad6f2a794c19c9b1a1567ca1c7f58eed78cd. * Re-add ELF support * Re-add 3DSX support * GetSystemInfo, GetProcessInfo: Memory sizes should be in bytes * Update Boost * Update metal-cpp * Fix metal renderer compilation * Fix fastmem mapping * Clean up fastmem code * Fix oopsie again * Emulator: Reorder struct * Kernel types: Cleanup * Cleanup * More cleanup * Make invalid mprotects warn instead of panicking * Add setting for toggling fastmem * More cleanup * Properly initialize BSS to zeroes * Remove unused code * Formatting * Cleanup * Memory/CRO: Workaround for Pokemon XY * NCSD loader: Fix BSS (again) * NCSD loader: Fix BSS (again) (again) * More memory fixes * Memory: Remove unused code * FS: Warn on unimplemented functions instead of panic * Update software_keyboard.cpp * Libretro: Add fastmem option * FRD: Stub SaveLocalAccountData --------- Co-authored-by: PSI-Rockin <PSI-Rockin@users.noreply.github.com>
93 lines
3.1 KiB
C++
93 lines
3.1 KiB
C++
#include "applets/software_keyboard.hpp"
|
|
|
|
#include <cstring>
|
|
#include <string>
|
|
|
|
#include "kernel/handles.hpp"
|
|
|
|
using namespace Applets;
|
|
|
|
void SoftwareKeyboardApplet::reset() {}
|
|
|
|
Result::HorizonResult SoftwareKeyboardApplet::receiveParameter(const Applets::Parameter& parameter) {
|
|
switch (parameter.signal) {
|
|
// Signal == request -> Applet is asking swkbd for a shared memory handle for backing up the framebuffer before opening the applet
|
|
case u32(APTSignal::Request): {
|
|
Applets::Parameter param = Applets::Parameter{
|
|
.senderID = parameter.destID,
|
|
.destID = AppletIDs::Application,
|
|
.signal = static_cast<u32>(APTSignal::Response),
|
|
.object = KernelHandles::APTCaptureSharedMemHandle,
|
|
.data = {},
|
|
};
|
|
|
|
nextParameter = param;
|
|
break;
|
|
}
|
|
|
|
default: Helpers::panic("Unimplemented swkbd signal %d\n", parameter.signal);
|
|
}
|
|
|
|
return Result::Success;
|
|
}
|
|
|
|
Result::HorizonResult SoftwareKeyboardApplet::start(const MemoryBlock* sharedMem, const std::vector<u8>& parameters, u32 appID) {
|
|
if (parameters.size() < sizeof(SoftwareKeyboardConfig)) {
|
|
Helpers::warn("SoftwareKeyboard::Start: Invalid size for keyboard configuration");
|
|
return Result::Success;
|
|
}
|
|
|
|
if (sharedMem == nullptr) {
|
|
Helpers::warn("SoftwareKeyboard: Missing shared memory");
|
|
return Result::Success;
|
|
}
|
|
|
|
// Get keyboard configuration from the application
|
|
std::memcpy(&config, ¶meters[0], sizeof(config));
|
|
|
|
const std::u16string text = u"Pand";
|
|
u32 textAddress = sharedMem->addr;
|
|
|
|
// Copy text to shared memory the app gave us
|
|
for (u32 i = 0; i < text.size(); i++) {
|
|
mem.write16(textAddress, u16(text[i]));
|
|
textAddress += sizeof(u16);
|
|
}
|
|
mem.write16(textAddress, 0); // Write UTF-16 null terminator
|
|
|
|
// Temporarily hardcode the pressed button to be the first one
|
|
switch (config.numButtonsM1) {
|
|
case SoftwareKeyboardButtonConfig::SingleButton: config.returnCode = SoftwareKeyboardResult::D0Click; break;
|
|
case SoftwareKeyboardButtonConfig::DualButton: config.returnCode = SoftwareKeyboardResult::D1Click1; break;
|
|
case SoftwareKeyboardButtonConfig::TripleButton: config.returnCode = SoftwareKeyboardResult::D2Click2; break;
|
|
case SoftwareKeyboardButtonConfig::NoButton: config.returnCode = SoftwareKeyboardResult::None; break;
|
|
default: Helpers::warn("Software keyboard: Invalid button mode specification"); break;
|
|
}
|
|
|
|
config.textOffset = 0;
|
|
config.textLength = static_cast<u16>(text.size());
|
|
static_assert(offsetof(SoftwareKeyboardConfig, textOffset) == 324);
|
|
static_assert(offsetof(SoftwareKeyboardConfig, textLength) == 328);
|
|
|
|
if (config.filterFlags & SoftwareKeyboardFilter::Callback) {
|
|
Helpers::warn("Unimplemented software keyboard profanity callback");
|
|
}
|
|
|
|
closeKeyboard(appID);
|
|
return Result::Success;
|
|
}
|
|
|
|
void SoftwareKeyboardApplet::closeKeyboard(u32 appID) {
|
|
Applets::Parameter param = Applets::Parameter{
|
|
.senderID = appID,
|
|
.destID = AppletIDs::Application,
|
|
.signal = static_cast<u32>(APTSignal::WakeupByExit),
|
|
.object = 0,
|
|
};
|
|
|
|
// Copy software keyboard configuration into the response parameter
|
|
param.data.resize(sizeof(config));
|
|
std::memcpy(¶m.data[0], &config, sizeof(config));
|
|
|
|
nextParameter = param;
|
|
} |