Build: Recovered CMakeSettings.json configuration file

Input Handling: Temporarily removed custom keyboard shortcut code; navigation is now handled via ImGui's native navigation system

Virtual Keyboard:

Modified first symbols layout (based on PS5 layout)

Added second symbols layout (based on PS5 layout)

Fonts: Added required symbols to ImGui font atlas for correct rendering in keyboard layouts
This commit is contained in:
w1naenator 2025-04-02 17:56:35 +03:00
parent 9f5afa812e
commit 3b662681cb
8 changed files with 293 additions and 156 deletions

View file

@ -6,7 +6,7 @@
"configurationType": "Release",
"buildRoot": "${projectDir}\\Build\\${name}",
"installRoot": "${projectDir}\\Install\\${name}",
"cmakeCommandArgs": "-DENABLE_QT_GUI=ON -DCMAKE_PREFIX_PATH=C:\\Qt\\6.8.2\\msvc2022_64",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"inheritEnvironments": [ "clang_cl_x64_x64" ],

View file

@ -342,7 +342,7 @@ void ImeDialogUi::DrawMultiLineInputText() {
}
void ImeDialogUi::DrawKeyboard() {
static KeyboardMode kb_mode = KeyboardMode::Letters;
static KeyboardMode kb_mode = KeyboardMode::Letters1;
static bool shift_enabled = false;
static bool has_logged = false;

View file

@ -1,25 +1,24 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/libraries/pad/pad.h"
#include <imgui.h>
#include "ime_keyboard_layouts.h"
using B = Libraries::Pad::OrbisPadButtonDataOffset;
constexpr auto L1 = B::L1;
constexpr auto R1 = B::R1;
constexpr auto L2 = B::L2;
constexpr auto R2 = B::R2;
constexpr auto L3 = B::L3;
constexpr auto R3 = B::R3;
constexpr auto Up = B::Up;
constexpr auto Down = B::Down;
constexpr auto Left = B::Left;
constexpr auto Right = B::Right;
constexpr auto Cross = B::Cross;
constexpr auto Circle = B::Circle;
constexpr auto Square = B::Square;
constexpr auto Triangle = B::Triangle;
constexpr auto TouchPad = B::TouchPad;
constexpr auto L1 = ImGuiNavInput_FocusPrev;
constexpr auto R1 = ImGuiNavInput_FocusNext;
constexpr auto L2 = ImGuiNavInput_TweakSlow;
constexpr auto R2 = ImGuiNavInput_TweakFast;
constexpr auto L3 = ImGuiNavInput_DpadLeft; // adjust if needed
constexpr auto R3 = ImGuiNavInput_DpadRight; // adjust if needed
constexpr auto Up = ImGuiNavInput_DpadUp;
constexpr auto Down = ImGuiNavInput_DpadDown;
constexpr auto Left = ImGuiNavInput_DpadLeft;
constexpr auto Right = ImGuiNavInput_DpadRight;
constexpr auto Cross = ImGuiNavInput_Activate;
constexpr auto Circle = ImGuiNavInput_Menu;
constexpr auto Square = ImGuiNavInput_Cancel;
constexpr auto Triangle = ImGuiNavInput_Input;
constexpr auto TouchPad = ImGuiNavInput_Menu; // reuse if needed
const std::vector<Key> kUppercaseLayout = {
// Row 1
@ -73,15 +72,15 @@ const std::vector<Key> kUppercaseLayout = {
// Row 5
{4, 0, 1, 1, "", "L2", KeyType::Shift, {L2}},
{4, 1, 1, 1, "@#:", "L2+△", KeyType::SymbolsLayout, {L3, Triangle}},
{4, 1, 1, 1, "@#:", "L2+△", KeyType::Symbols1Layout, {L3, Triangle}},
{4, 2, 1, 1, "à", "L3", KeyType::UnknownFunction, {L3}},
{4, 3, 4, 1, "Space", "", KeyType::Space, {Triangle}},
//{4, 4, 4, 1, "Space", "△", KeyType::Space,{}},
//{4, 5, 4, 1, "Space", "△", KeyType::Space,{}},
//{4, 6, 4, 1, "Space", "△", KeyType::Space,{}},
//{4, 4, 4, 1, "Space", "△", KeyType::Space,{Triangle}},
//{4, 5, 4, 1, "Space", "△", KeyType::Space,{Triangle}},
//{4, 6, 4, 1, "Space", "△", KeyType::Space,{Triangle}},
{4, 7, 1, 1, "", "", KeyType::Disabled, {}},
{4, 8, 2, 1, "", "", KeyType::Backspace, {Square}},
//{4, 9, 2, 1, "⇦", "□", KeyType::Backspace,{}},
//{4, 9, 2, 1, "⇦", "□", KeyType::Backspace,{Square}},
// Row 6
{5, 0, 1, 1, "", "", KeyType::CursorUp, {Up}},
@ -95,7 +94,7 @@ const std::vector<Key> kUppercaseLayout = {
{5, 6, 1, 1, "+/⊗", "R3", KeyType::ControllerAction, {R3}},
{5, 7, 1, 1, "", "", KeyType::Disabled, {}},
{5, 8, 2, 1, "Done", "R2", KeyType::Done, {R2}},
//{5, 9, 2, 1, "Done", "R2", KeyType::Done,{}},
//{5, 9, 2, 1, "Done", "R2", KeyType::Done,{R2}},
};
const std::vector<Key> kLowercaseLayout = {
@ -149,7 +148,7 @@ const std::vector<Key> kLowercaseLayout = {
// Row 5
{4, 0, 1, 1, "", "L2", KeyType::Shift, {L2}},
{4, 1, 1, 1, "@#:", "L2+△", KeyType::SymbolsLayout, {L2, Triangle}},
{4, 1, 1, 1, "@#:", "L2+△", KeyType::Symbols1Layout, {L2, Triangle}},
{4, 2, 1, 1, "à", "L3", KeyType::UnknownFunction, {L3}},
{4, 3, 4, 1, "Space", "", KeyType::Space, {Triangle}},
//{4, 4, 4, 1, "Space", "△", KeyType::Space, {Triangle}},
@ -171,7 +170,7 @@ const std::vector<Key> kLowercaseLayout = {
{5, 8, 2, 1, "Done", "R2", KeyType::Done, {R2}},
//{5, 9, 2, 1, "Done", "R2", KeyType::Done, {R2}},
};
/*
const std::vector<Key> kSymbols1Layout = {
// Row 1
{0, 0, 1, 1, "!", "", KeyType::Text, {}},
@ -246,3 +245,155 @@ const std::vector<Key> kSymbols1Layout = {
//{5, 9, 2, 1, "Done", "R2", KeyType::Done, {R2}},
};
*/
// From PS5
const std::vector<Key> kSymbols1Layout = {
// Row 1
{0, 0, 1, 1, "!", "", KeyType::Text, {}},
{0, 1, 1, 1, "?", "", KeyType::Text, {}},
{0, 2, 1, 1, "\"", "", KeyType::Text, {}},
{0, 3, 1, 1, "'", "", KeyType::Text, {}},
{0, 4, 1, 1, "#", "", KeyType::Text, {}},
{0, 5, 1, 1, "%", "", KeyType::Text, {}},
{0, 6, 1, 1, "(", "", KeyType::Text, {}},
{0, 7, 1, 1, ")", "", KeyType::Text, {}},
{0, 8, 1, 1, "()", "", KeyType::Text, {}},
{0, 9, 1, 1, "/", "", KeyType::Text, {}},
// Row 2
{1, 0, 1, 1, "-", "", KeyType::Text, {}},
{1, 1, 1, 1, "_", "", KeyType::Text, {}},
{1, 2, 1, 1, ",", "", KeyType::Text, {}},
{1, 3, 1, 1, ".", "", KeyType::Text, {}},
{1, 4, 1, 1, ":", "", KeyType::Text, {}},
{1, 5, 1, 1, ";", "", KeyType::Text, {}},
{1, 6, 1, 1, "*", "", KeyType::Text, {}},
{1, 7, 1, 1, "&", "", KeyType::Text, {}},
{1, 8, 1, 1, "+", "", KeyType::Text, {}},
{1, 9, 1, 1, "=", "", KeyType::Text, {}},
// Row 3
{2, 0, 1, 1, "<", "", KeyType::Text, {}},
{2, 1, 1, 1, ">", "", KeyType::Text, {}},
{2, 2, 1, 1, "@", "", KeyType::Text, {}},
{2, 3, 1, 1, "[", "", KeyType::Text, {}},
{2, 4, 1, 1, "]", "", KeyType::Text, {}},
{2, 5, 1, 1, "[]", "", KeyType::Text, {}},
{2, 6, 1, 1, "{", "", KeyType::Text, {}},
{2, 7, 1, 1, "}", "", KeyType::Text, {}},
{2, 8, 1, 1, "{}", "", KeyType::Text, {}},
{2, 9, 1, 2, "", "", KeyType::Symbols2Layout, {}},
// Row 4
{3, 0, 1, 1, "\\", "", KeyType::Text, {}},
{3, 1, 1, 1, "|", "", KeyType::Text, {}},
{3, 2, 1, 1, "^", "", KeyType::Text, {}},
{3, 3, 1, 1, "`", "", KeyType::Text, {}},
{3, 4, 1, 1, "$", "", KeyType::Text, {}},
{3, 5, 1, 1, "", "", KeyType::Text, {}},
{3, 6, 1, 1, "£", "", KeyType::Text, {}},
{3, 7, 1, 1, "¥", "", KeyType::Text, {}},
{3, 8, 1, 1, "", "", KeyType::Text, {}},
//{3, 9, 1, 2, "→", "", KeyType::Symbols2Layout,{}},
// Row 5
{4, 0, 1, 1, "", "", KeyType::Disabled, {}},
{4, 1, 1, 1, "ABC", "L2+△", KeyType::TextLayout, {L2, Triangle}},
{4, 2, 1, 1, "", "", KeyType::Disabled, {}},
{4, 3, 4, 1, "Space", "", KeyType::Space, {Triangle}},
//{4, 4, 4, 1, "Space", "△", KeyType::Space, {Triangle}},
//{4, 5, 4, 1, "Space", "△", KeyType::Space, {Triangle}},
//{4, 6, 4, 1, "Space", "△", KeyType::Space, {Triangle}},
{4, 7, 1, 1, "", "", KeyType::Disabled, {}},
{4, 8, 2, 1, "", "", KeyType::Backspace, {Square}},
//{4, 9, 2, 1, "⇦", "□", KeyType::Backspace, {Square}},
// Row 6
{5, 0, 1, 1, "", "", KeyType::CursorUp, {Up}},
{5, 1, 1, 1, "", "", KeyType::CursorDown, {Down}},
{5, 2, 1, 1, "", "L1", KeyType::CursorLeft, {L1}},
{5, 3, 1, 1, "", "R1", KeyType::CursorRight, {R1}},
{5, 4, 1, 1, "KB", "", KeyType::ToggleKeyboard, {}},
{5, 5, 1, 1, "...", "", KeyType::MoreOptions, {}},
{5, 6, 1, 1, "+/⊗", "R3", KeyType::ControllerAction, {R3}},
{5, 7, 1, 1, "", "", KeyType::Disabled, {}},
{5, 8, 2, 1, "Done", "R2", KeyType::Done, {R2}},
//{5, 9, 2, 1, "Done", "R2", KeyType::Done, {R2}},
};
// From PS5
const std::vector<Key> kSymbols2Layout = {
// Row 1
{0, 0, 1, 1, "", "", KeyType::Text, {}},
{0, 1, 1, 1, "", "", KeyType::Text, {}},
{0, 2, 1, 1, "", "", KeyType::Text, {}},
{0, 3, 1, 1, "¡", "", KeyType::Text, {}},
{0, 4, 1, 1, "", "", KeyType::Text, {}},
{0, 5, 1, 1, "¿", "", KeyType::Text, {}},
{0, 6, 1, 1, "", "", KeyType::Text, {}},
{0, 7, 1, 1, "~", "", KeyType::Text, {}},
{0, 8, 1, 1, "·", "", KeyType::Text, {}},
{0, 9, 1, 1, "", "", KeyType::Disabled, {}},
// Row 2
{1, 0, 1, 1, "×", "", KeyType::Text, {}},
{1, 1, 1, 1, "÷", "", KeyType::Text, {}},
{1, 2, 1, 1, "", "", KeyType::Text, {}},
{1, 3, 1, 1, "", "", KeyType::Text, {}},
{1, 4, 1, 1, "«", "", KeyType::Text, {}},
{1, 5, 1, 1, "»", "", KeyType::Text, {}},
{1, 6, 1, 1, "º", "", KeyType::Text, {}},
{1, 7, 1, 1, "ª", "", KeyType::Text, {}},
{1, 8, 1, 1, "°", "", KeyType::Text, {}},
{1, 9, 1, 1, "§", "", KeyType::Text, {}},
// Row 3
{2, 0, 1, 2, "", "", KeyType::Symbols1Layout, {}},
{2, 1, 1, 1, "¦", "", KeyType::Text, {}},
{2, 2, 1, 1, "µ", "", KeyType::Text, {}},
{2, 3, 1, 1, "¬", "", KeyType::Text, {}},
{2, 4, 1, 1, "¹", "", KeyType::Text, {}},
{2, 5, 1, 1, "²", "", KeyType::Text, {}},
{2, 6, 1, 1, "³", "", KeyType::Text, {}},
{2, 7, 1, 1, "¼", "", KeyType::Text, {}},
{2, 8, 1, 1, "½", "", KeyType::Text, {}},
{2, 9, 1, 1, "¾", "", KeyType::Text, {}},
// Row 4
//{3, 0, 1, 1, "←", "", KeyType::Symbols1Layout, {}},
{3, 1, 1, 1, "¢", "", KeyType::Text, {}},
{3, 2, 1, 1, "¤", "", KeyType::Text, {}},
{3, 3, 1, 1, "", "", KeyType::Text, {}},//not sure
{3, 4, 1, 1, "", "", KeyType::Text, {}},//not sure
{3, 5, 1, 1, "", "", KeyType::Text, {}},//not sure
{3, 6, 1, 1, "", "", KeyType::Text, {}},//not sure
{3, 7, 1, 1, "", "", KeyType::Text, {}},
{3, 8, 1, 1, "", "", KeyType::Disabled, {}},
{3, 9, 1, 1, "", "", KeyType::Disabled,{}},
// Row 5
{4, 0, 1, 1, "", "", KeyType::Disabled, {}},
{4, 1, 1, 1, "ABC", "L2+△", KeyType::TextLayout, {L2, Triangle}},
{4, 2, 1, 1, "", "", KeyType::Disabled, {}},
{4, 3, 4, 1, "Space", "", KeyType::Space, {Triangle}},
//{4, 4, 4, 1, "Space", "△", KeyType::Space, {Triangle}},
//{4, 5, 4, 1, "Space", "△", KeyType::Space, {Triangle}},
//{4, 6, 4, 1, "Space", "△", KeyType::Space, {Triangle}},
{4, 7, 1, 1, "", "", KeyType::Disabled, {}},
{4, 8, 2, 1, "", "", KeyType::Backspace, {Square}},
//{4, 9, 2, 1, "⇦", "□", KeyType::Backspace, {Square}},
// Row 6
{5, 0, 1, 1, "", "", KeyType::CursorUp, {Up}},
{5, 1, 1, 1, "", "", KeyType::CursorDown, {Down}},
{5, 2, 1, 1, "", "L1", KeyType::CursorLeft, {L1}},
{5, 3, 1, 1, "", "R1", KeyType::CursorRight, {R1}},
{5, 4, 1, 1, "KB", "", KeyType::ToggleKeyboard, {}},
{5, 5, 1, 1, "...", "", KeyType::MoreOptions, {}},
{5, 6, 1, 1, "+/⊗", "R3", KeyType::ControllerAction, {R3}},
{5, 7, 1, 1, "", "", KeyType::Disabled, {}},
{5, 8, 2, 1, "Done", "R2", KeyType::Done, {R2}},
//{5, 9, 2, 1, "Done", "R2", KeyType::Done, {R2}},
};

View file

@ -5,8 +5,7 @@
#include <string>
#include <vector>
#include "core/libraries/pad/pad.h"
// using B = Libraries::Pad::OrbisPadButtonDataOffset;
#include <imgui.h>
enum class KeyType {
Text, // Inserts character(s) into input buffer
@ -14,7 +13,8 @@ enum class KeyType {
Space, // Adds space
Enter, // Submits input
Shift, // Toggle uppercase/lowercase
SymbolsLayout, // Switch to symbols layout
Symbols1Layout, // Switch to symbols layout
Symbols2Layout, // Switch to symbols layout
TextLayout, // Switch to text layout
Done, // Finish and close keyboard
CursorLeft,
@ -35,10 +35,11 @@ struct Key {
int rowspan = 1;
std::string label;
std::string controller_hint;
KeyType type = KeyType::Text; // default to Text input
std::vector<Libraries::Pad::OrbisPadButtonDataOffset> bound_buttons = {}; // new field
KeyType type = KeyType::Text;
std::vector<ImGuiNavInput> bound_buttons = {}; // Now using ImGui navigation inputs
};
extern const std::vector<Key> kUppercaseLayout;
extern const std::vector<Key> kLowercaseLayout;
extern const std::vector<Key> kSymbols1Layout;
extern const std::vector<Key> kSymbols2Layout;

View file

@ -5,40 +5,55 @@
#include <imgui.h>
#include "ime_keyboard_layouts.h"
#include "ime_keyboard_ui.h"
#include "input/controller.h"
#include "common/singleton.h"
#include "ime_ui.h" // for ImeState
#include "ime_common.h"
using namespace ImGui;
// --- UTF-8 safe backspace helper ---
void Utf8SafeBackspace(char* buffer) {
size_t len = std::strlen(buffer);
if (len == 0)
return;
while (len > 0 && (static_cast<unsigned char>(buffer[len]) & 0b11000000) == 0b10000000) {
--len;
}
if (len > 0) {
buffer[len - 1] = '\0';
buffer[len] = '\0';
}
}
void DrawVirtualKeyboard(char* buffer, std::size_t buffer_capacity, bool* input_changed,
KeyboardMode& kb_mode, bool& shift_enabled, bool* done_pressed) {
const std::vector<Key>* layout = nullptr;
if (kb_mode == KeyboardMode::Symbols) {
switch (kb_mode) {
case KeyboardMode::Symbols1:
layout = &kSymbols1Layout;
} else {
break;
case KeyboardMode::Symbols2:
layout = &kSymbols2Layout;
break;
default:
layout = shift_enabled ? &kUppercaseLayout : &kLowercaseLayout;
break;
}
auto current_pad_button =
Common::Singleton<Input::GameController>::Instance()->GetLastState().buttonsState;
RenderKeyboardLayout(*layout, buffer, buffer_capacity, input_changed, kb_mode, shift_enabled,
done_pressed, current_pad_button);
done_pressed);
}
void RenderKeyboardLayout(const std::vector<Key>& layout, char* buffer, std::size_t buffer_capacity,
bool* input_changed, KeyboardMode& kb_mode, bool& shift_enabled,
bool* done_pressed,
Libraries::Pad::OrbisPadButtonDataOffset current_pad_button) {
// Define desired total layout size (in pixels)
bool* done_pressed) {
const float layout_width = 485.0f;
const float layout_height = 200.0f;
const float cell_spacing = 4.0f;
const float hint_padding = 2.0f;
// Find max rows and columns
int max_col = 0;
int max_row = 0;
for (const Key& key : layout) {
@ -46,7 +61,6 @@ void RenderKeyboardLayout(const std::vector<Key>& layout, char* buffer, std::siz
max_row = std::max(max_row, key.row + static_cast<int>(key.rowspan));
}
// Calculate cell size dynamically
const float cell_width = (layout_width - (max_col - 1) * cell_spacing) / max_col;
const float cell_height = (layout_height - (max_row - 1) * cell_spacing) / max_row;
@ -66,8 +80,9 @@ void RenderKeyboardLayout(const std::vector<Key>& layout, char* buffer, std::siz
: key.label;
ImGui::SetCursorScreenPos(pos);
bool key_activated = ImGui::Button(button_id.c_str(), size);
if (ImGui::Button(button_id.c_str(), size)) {
if (key_activated) {
switch (key.type) {
case KeyType::Text:
if (!key.label.empty()) {
@ -77,78 +92,11 @@ void RenderKeyboardLayout(const std::vector<Key>& layout, char* buffer, std::siz
if (input_changed)
*input_changed = true;
}
// Controller debug injection
for (Libraries::Pad::OrbisPadButtonDataOffset button : key.bound_buttons) {
if (current_pad_button == button) {
// DEBUG: always insert "ok" when a key is triggered via gamepad
size_t len = std::strlen(buffer);
if (len + 2 < buffer_capacity) {
std::strcat(buffer, "ok");
if (input_changed)
*input_changed = true;
}
}
}
// Controller press simulation
for (Libraries::Pad::OrbisPadButtonDataOffset button : key.bound_buttons) {
if (current_pad_button == button) {
switch (key.type) {
case KeyType::Text:
if (!key.label.empty()) {
size_t len = std::strlen(buffer);
if (len + key.label.size() < buffer_capacity) {
std::strcat(buffer, key.label.c_str());
if (input_changed)
*input_changed = true;
}
}
break;
case KeyType::Backspace:
if (buffer[0] != '\0') {
size_t len = std::strlen(buffer);
buffer[len - 1] = '\0';
if (input_changed)
*input_changed = true;
}
break;
case KeyType::Space:
if (std::strlen(buffer) + 1 < buffer_capacity) {
std::strcat(buffer, " ");
if (input_changed)
*input_changed = true;
}
break;
case KeyType::Enter:
case KeyType::Done:
if (done_pressed)
*done_pressed = true;
break;
case KeyType::Shift:
shift_enabled = !shift_enabled;
break;
case KeyType::SymbolsLayout:
kb_mode = KeyboardMode::Symbols;
break;
case KeyType::TextLayout:
kb_mode = KeyboardMode::Letters;
break;
case KeyType::ToggleKeyboard:
kb_mode = (kb_mode == KeyboardMode::Letters)
? KeyboardMode::Symbols
: KeyboardMode::Letters;
break;
default:
break;
}
}
}
}
break;
case KeyType::Backspace:
if (buffer[0] != '\0') {
size_t len = std::strlen(buffer);
buffer[len - 1] = '\0';
Utf8SafeBackspace(buffer);
if (input_changed)
*input_changed = true;
}
@ -168,22 +116,25 @@ void RenderKeyboardLayout(const std::vector<Key>& layout, char* buffer, std::siz
case KeyType::Shift:
shift_enabled = !shift_enabled;
break;
case KeyType::SymbolsLayout:
kb_mode = KeyboardMode::Symbols;
case KeyType::Symbols1Layout:
kb_mode = KeyboardMode::Symbols1;
break;
case KeyType::Symbols2Layout:
kb_mode = KeyboardMode::Symbols2;
break;
case KeyType::TextLayout:
kb_mode = KeyboardMode::Letters;
kb_mode = KeyboardMode::Letters1;
break;
case KeyType::ToggleKeyboard:
kb_mode = (kb_mode == KeyboardMode::Letters) ? KeyboardMode::Symbols
: KeyboardMode::Letters;
kb_mode = (kb_mode == KeyboardMode::Letters1) ? KeyboardMode::Symbols1
: KeyboardMode::Letters1;
break;
default:
break;
}
}
// Controller hint
// Draw controller hint label
if (!key.controller_hint.empty()) {
float original_font_size = ImGui::GetFontSize();
float small_font_size = original_font_size * 0.5f;
@ -204,4 +155,4 @@ void RenderKeyboardLayout(const std::vector<Key>& layout, char* buffer, std::siz
key.controller_hint.c_str());
}
}
}
}

View file

@ -6,14 +6,19 @@
#include <cstddef>
#include <cstdint>
#include <vector>
#include "core/libraries/pad/pad.h"
#include "ime_keyboard_layouts.h"
#include "core/libraries/ime/ime.h"
#include "core/libraries/ime/ime_error.h"
#include "core/libraries/ime/ime_ui.h"
#include "core/libraries/ime/ime_common.h"
enum class KeyboardMode { Letters, Symbols };
enum class KeyboardMode { Letters1, Letters2, Symbols1, Symbols2 };
void DrawVirtualKeyboard(char* buffer, std::size_t buffer_capacity, bool* input_changed,
KeyboardMode& kb_mode, bool& shift_enabled, bool* done_pressed);
void RenderKeyboardLayout(const std::vector<Key>& layout, char* buffer, std::size_t buffer_capacity,
bool* input_changed, KeyboardMode& kb_mode, bool& shift_enabled,
bool* done_pressed,
Libraries::Pad::OrbisPadButtonDataOffset current_pad_button);
bool* done_pressed);

View file

@ -190,7 +190,7 @@ void ImeUi::DrawInputText() {
}
void ImeUi::DrawKeyboard() {
static KeyboardMode kb_mode = KeyboardMode::Letters;
static KeyboardMode kb_mode = KeyboardMode::Letters1;
static bool shift_enabled = false;
static bool has_logged = false;
@ -205,11 +205,35 @@ void ImeUi::DrawKeyboard() {
DrawVirtualKeyboard(state->current_text.begin(), state->current_text.capacity(), &input_changed,
kb_mode, shift_enabled, &done_pressed);
if (input_changed) {
OrbisImeEditText eventParam{};
eventParam.str = reinterpret_cast<char16_t*>(ime_param->work);
eventParam.caret_index = std::strlen(state->current_text.begin());
eventParam.area_num = 1;
eventParam.text_area[0].mode = 1;
eventParam.text_area[0].index = 0;
eventParam.text_area[0].length = eventParam.caret_index;
state->ConvertUTF8ToOrbis(state->current_text.begin(), eventParam.caret_index,
eventParam.str, ime_param->maxTextLength);
state->ConvertUTF8ToOrbis(state->current_text.begin(), eventParam.caret_index,
ime_param->inputTextBuffer, ime_param->maxTextLength);
OrbisImeEvent event{};
event.id = OrbisImeEventId::UpdateText;
event.param.text = eventParam;
state->SendEvent(&event);
}
if (done_pressed) {
state->SendEnterEvent(); // Submit action
state->SendEnterEvent();
}
}
int ImeUi::InputTextCallback(ImGuiInputTextCallbackData* data) {
ImeUi* ui = static_cast<ImeUi*>(data->UserData);
ASSERT(ui);

View file

@ -69,37 +69,42 @@ void Initialize(const ::Vulkan::Instance& instance, const Frontend::WindowSDL& w
rb.AddRanges(io.Fonts->GetGlyphRangesKorean());
rb.AddRanges(io.Fonts->GetGlyphRangesJapanese());
rb.AddRanges(io.Fonts->GetGlyphRangesCyrillic());
rb.AddChar(0x00D7); // × Cross
rb.AddChar(0x25CB); // ○ Circle
rb.AddChar(0x25B3); // △ Triangle
rb.AddChar(0x25A1); // □ Square
rb.AddChar(0x2191); // ↑ Up Arrow
rb.AddChar(0x2193); // ↓ Down Arrow
rb.AddChar(0x2190); // ← Left Arrow
rb.AddChar(0x2192); // → Right Arrow
rb.AddChar(0x2297); // ⊗ Circled Times (often used as cross)
rb.AddChar(0x2BBE); // ⮾ Circled X (if supported by font)
rb.AddChar(0x1F5D9); // 🗙 Cancellation X (heavy)
rb.AddChar(0x25C0); // ◀ Black Left-Pointing Triangle
rb.AddChar(0x25B2); // ▲ Black Up-Pointing Triangle
rb.AddChar(0x25B6); // ▶ Black Right-Pointing Triangle
rb.AddChar(0x25BC); // ▼ Black Down-Pointing Triangle
rb.AddChar(0x232B); // ⌫ Backspace
rb.AddChar(0x21E7); // ⇧ UPWARDS WHITE ARROW
rb.AddChar(0x2B06); // ⬆ UPWARDS BLACK ARROW
rb.AddChar(0x21E6); // ⇦ Leftwards White Arrow
//For keyboard
rb.AddChar(U'×');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'🗙');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'¿');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
rb.AddChar(U'');
//rb.AddRanges(io.Fonts->GetGlyphRangesDefault());
// Manually add full BMP range
//for (ImWchar c = 0x0020; c <= 0xFFFF; ++c) {
// rb.AddChar(c);
//}
ImVector<ImWchar> ranges{};
rb.BuildRanges(&ranges);
ImFontConfig font_cfg{};