|
|
@ -2,6 +2,7 @@ use bitflags::bitflags; |
|
|
|
use ctru_sys::{ |
|
|
|
use ctru_sys::{ |
|
|
|
self, swkbdInit, swkbdInputText, swkbdSetButton, swkbdSetFeatures, swkbdSetHintText, SwkbdState, |
|
|
|
self, swkbdInit, swkbdInputText, swkbdSetButton, swkbdSetFeatures, swkbdSetHintText, SwkbdState, |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
use libc; |
|
|
|
use std::iter::once; |
|
|
|
use std::iter::once; |
|
|
|
use std::str; |
|
|
|
use std::str; |
|
|
|
|
|
|
|
|
|
|
@ -100,21 +101,24 @@ impl Swkbd { |
|
|
|
///
|
|
|
|
///
|
|
|
|
/// The text received from the keyboard will be truncated if it is greater than 2048 bytes
|
|
|
|
/// The text received from the keyboard will be truncated if it is greater than 2048 bytes
|
|
|
|
/// in length.
|
|
|
|
/// in length.
|
|
|
|
pub fn write_to_string(&mut self) -> Result<(String, Button), Error> { |
|
|
|
pub fn write_to_string(&mut self, buf: &mut String) -> Result<Button, Error> { |
|
|
|
// Unfortunately the libctru API doesn't really provide a way to get the exact length
|
|
|
|
// Unfortunately the libctru API doesn't really provide a way to get the exact length
|
|
|
|
// of the string that it receieves from the software keyboard. Instead it expects you
|
|
|
|
// of the string that it receieves from the software keyboard. Instead it expects you
|
|
|
|
// to pass in a buffer and hope that it's big enough to fit the entire string, so
|
|
|
|
// to pass in a buffer and hope that it's big enough to fit the entire string, so
|
|
|
|
// you have to set some upper limit on the potential size of the user's input.
|
|
|
|
// you have to set some upper limit on the potential size of the user's input.
|
|
|
|
const MAX_BYTES: usize = 2048; |
|
|
|
const MAX_BYTES: usize = 2048; |
|
|
|
let mut buf = vec![0u8; MAX_BYTES]; |
|
|
|
let mut tmp = [0u8; MAX_BYTES]; |
|
|
|
let button = self.write_bytes(&mut buf)?; |
|
|
|
let button = self.write_bytes(&mut tmp)?; |
|
|
|
|
|
|
|
|
|
|
|
// libctru does, however, seem to ensure that the buffer will always contain a properly
|
|
|
|
// libctru does, however, seem to ensure that the buffer will always contain a properly
|
|
|
|
// terminated UTF-8 sequence even if the input has to be truncated, so this operation
|
|
|
|
// terminated UTF-8 sequence even if the input has to be truncated, so these operations
|
|
|
|
// should be safe.
|
|
|
|
// should be safe.
|
|
|
|
let res = String::from_utf8(buf).unwrap(); |
|
|
|
let len = unsafe { libc::strlen(tmp.as_ptr()) }; |
|
|
|
|
|
|
|
let utf8 = unsafe { str::from_utf8_unchecked(&tmp[..len]) }; |
|
|
|
|
|
|
|
|
|
|
|
Ok((res, button)) |
|
|
|
// Copy the input into the user's `String`
|
|
|
|
|
|
|
|
*buf += utf8; |
|
|
|
|
|
|
|
Ok(button) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// Fills the provided buffer with a UTF-8 encoded, NUL-terminated sequence of bytes from
|
|
|
|
/// Fills the provided buffer with a UTF-8 encoded, NUL-terminated sequence of bytes from
|
|
|
|