Improve IME messaging to embedder with insertion point index and multiline flag.

This commit is contained in:
Philip Lamb 2021-03-29 17:55:54 +13:00
parent 0539043e35
commit b8a74e89cf
8 changed files with 57 additions and 15 deletions

View file

@ -416,7 +416,8 @@ impl HostTrait for HostCallbacks {
fn on_ime_show(
&self,
_input_type: InputMethodType,
_text: Option<String>,
_text: Option<(String, i32)>,
_multiline: bool,
_bounds: DeviceIntRect,
) {
if let Some(keyboard) = self.keyboard.0 {

View file

@ -141,7 +141,13 @@ pub trait HostTrait {
/// Servo finished shutting down.
fn on_shutdown_complete(&self);
/// A text input is focused.
fn on_ime_show(&self, input_type: InputMethodType, text: Option<String>, bounds: DeviceIntRect);
fn on_ime_show(
&self,
input_type: InputMethodType,
text: Option<(String, i32)>,
multiline: bool,
bounds: DeviceIntRect,
);
/// Input lost focus
fn on_ime_hide(&self);
/// Gets sytem clipboard contents.
@ -742,10 +748,10 @@ impl ServoGlue {
let _ = sender.send(result);
},
EmbedderMsg::ShowIME(kind, text, bounds) => {
EmbedderMsg::ShowIME(kind, text, multiline, bounds) => {
self.callbacks
.host_callbacks
.on_ime_show(kind, text, bounds);
.on_ime_show(kind, text, multiline, bounds);
},
EmbedderMsg::HideIME => {
self.callbacks.host_callbacks.on_ime_hide();

View file

@ -204,7 +204,15 @@ pub struct CHostCallbacks {
pub on_history_changed: extern "C" fn(can_go_back: bool, can_go_forward: bool),
pub on_animating_changed: extern "C" fn(animating: bool),
pub on_shutdown_complete: extern "C" fn(),
pub on_ime_show: extern "C" fn(text: *const c_char, x: i32, y: i32, width: i32, height: i32),
pub on_ime_show: extern "C" fn(
text: *const c_char,
text_index: i32,
multiline: bool,
x: i32,
y: i32,
width: i32,
height: i32,
),
pub on_ime_hide: extern "C" fn(),
pub get_clipboard_contents: extern "C" fn() -> *const c_char,
pub set_clipboard_contents: extern "C" fn(contents: *const c_char),
@ -803,17 +811,21 @@ impl HostTrait for HostCallbacks {
fn on_ime_show(
&self,
_input_type: InputMethodType,
text: Option<String>,
text: Option<(String, i32)>,
multiline: bool,
bounds: DeviceIntRect,
) {
debug!("on_ime_show");
let text = text.and_then(|s| CString::new(s).ok());
let text_index = text.as_ref().map_or(0, |(_, i)| *i);
let text = text.and_then(|(s, _)| CString::new(s).ok());
let text_ptr = text
.as_ref()
.map(|cstr| cstr.as_ptr())
.unwrap_or(std::ptr::null());
(self.0.on_ime_show)(
text_ptr,
text_index,
multiline,
bounds.origin.x,
bounds.origin.y,
bounds.size.width,

View file

@ -530,7 +530,14 @@ impl HostTrait for HostCallbacks {
.unwrap();
}
fn on_ime_show(&self, _type: InputEncoding, _text: Option<String>, _rect: DeviceIntRect) {}
fn on_ime_show(
&self,
_type: InputEncoding,
_text: Option<(String, i32)>,
_multiline: bool,
_rect: DeviceIntRect,
) {
}
fn on_ime_hide(&self) {}
fn get_clipboard_contents(&self) -> Option<String> {

View file

@ -487,7 +487,7 @@ where
let permission_state = prompt_user(prompt);
let _ = sender.send(permission_state);
},
EmbedderMsg::ShowIME(_kind, _text, _rect) => {
EmbedderMsg::ShowIME(_kind, _text, _multiline, _rect) => {
debug!("ShowIME received");
},
EmbedderMsg::HideIME => {