| 142 | } |
| 143 | |
| 144 | static void swkbdMessageCallback(void* user, NS_APPID sender, void* msg, size_t msgsize) |
| 145 | { |
| 146 | SwkbdExtra* extra = (SwkbdExtra*)user; |
| 147 | SwkbdState* swkbd = (SwkbdState*)msg; |
| 148 | |
| 149 | if (sender != APPID_SOFTWARE_KEYBOARD || msgsize != sizeof(SwkbdState)) |
| 150 | return; |
| 151 | |
| 152 | u16* text16 = (u16*)(swkbdSharedMem + swkbd->text_offset); |
| 153 | ssize_t units = utf16_to_utf8(NULL, text16, 0); |
| 154 | if (units < 0) svcBreak(USERBREAK_PANIC); // Shouldn't happen. |
| 155 | char* text8 = (char*)malloc(units+1); |
| 156 | if (!text8) svcBreak(USERBREAK_PANIC); // Shouldn't happen. |
| 157 | swkbdConvertToUTF8(text8, text16, units); |
| 158 | |
| 159 | const char* retmsg = NULL; |
| 160 | swkbd->callback_result = extra->callback(extra->callback_user, &retmsg, text8, units); |
| 161 | if (swkbd->callback_result > SWKBD_CALLBACK_OK) |
| 162 | swkbdConvertToUTF16(swkbd->callback_msg, retmsg, SWKBD_MAX_CALLBACK_MSG_LEN); |
| 163 | else |
| 164 | swkbd->callback_msg[0] = 0; |
| 165 | |
| 166 | free(text8); |
| 167 | APT_SendParameter(envGetAptAppId(), sender, APTCMD_MESSAGE, swkbd, sizeof(*swkbd), 0); |
| 168 | } |
| 169 | |
| 170 | SwkbdButton swkbdInputText(SwkbdState* swkbd, char* buf, size_t bufsize) |
| 171 | { |
nothing calls this directly
no test coverage detected