Add composition event on macOS (#1979)
* Enable to show text when IME is active * Remove unnecessary variable * Enable to use IME * fmt * Remove println! for debug * Fix handling of utf-8 string * clear_marked_text should be rust function, not member function * Store state information in ViewState * Remove unnecessary function * format * Remove mut * format * Remove duplicate marked text * Remove unused `is_preediting` field Co-authored-by: Artúr Kovács <kovacs.artur.barnabas@gmail.com>
This commit is contained in:
parent
f16ed98af4
commit
8afeb910bd
4 changed files with 121 additions and 30 deletions
|
|
@ -3,8 +3,13 @@ mod cursor;
|
|||
|
||||
pub use self::{cursor::*, r#async::*};
|
||||
|
||||
use std::ops::{BitAnd, Deref};
|
||||
use std::{
|
||||
cell::Cell,
|
||||
ops::{BitAnd, Deref},
|
||||
rc::Rc,
|
||||
};
|
||||
|
||||
use block::ConcreteBlock;
|
||||
use cocoa::{
|
||||
appkit::{NSApp, NSWindowStyleMask},
|
||||
base::{id, nil},
|
||||
|
|
@ -13,8 +18,12 @@ use cocoa::{
|
|||
use core_graphics::display::CGDisplay;
|
||||
use objc::runtime::{Class, Object, Sel, BOOL, YES};
|
||||
|
||||
use crate::dpi::LogicalPosition;
|
||||
use crate::platform_impl::platform::ffi;
|
||||
use crate::{
|
||||
dpi::LogicalPosition,
|
||||
platform_impl::platform::ffi::{
|
||||
self, NSRange, NSStringEnumerationByComposedCharacterSequences,
|
||||
},
|
||||
};
|
||||
|
||||
// Replace with `!` once stable
|
||||
#[derive(Debug)]
|
||||
|
|
@ -104,6 +113,31 @@ pub unsafe fn ns_string_id_ref(s: &str) -> IdRef {
|
|||
IdRef::new(NSString::alloc(nil).init_str(s))
|
||||
}
|
||||
|
||||
/// Returns the number of characters in a string.
|
||||
/// (A single character may consist of multiple UTF-32 code units.
|
||||
/// This is possible when long sequences of composing characters are present)
|
||||
///
|
||||
/// Unsafe because assumes that the `string` is an `NSString` object
|
||||
pub unsafe fn ns_string_char_count(string: id) -> usize {
|
||||
let length: NSUInteger = msg_send![string, length];
|
||||
let range = NSRange {
|
||||
location: 0,
|
||||
length,
|
||||
};
|
||||
let char_count = Rc::new(Cell::new(0));
|
||||
let block = {
|
||||
let char_count = char_count.clone();
|
||||
ConcreteBlock::new(move || char_count.set(char_count.get() + 1)).copy()
|
||||
};
|
||||
let block = &*block;
|
||||
let () = msg_send![string,
|
||||
enumerateSubstringsInRange:range
|
||||
options:NSStringEnumerationByComposedCharacterSequences
|
||||
usingBlock:block
|
||||
];
|
||||
char_count.get()
|
||||
}
|
||||
|
||||
#[allow(dead_code)] // In case we want to use this function in the future
|
||||
pub unsafe fn app_name() -> Option<id> {
|
||||
let bundle: id = msg_send![class!(NSBundle), mainBundle];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue