Compare commits

..

11 Commits

Author SHA1 Message Date
Kirill Chibisov
640c51fe6f Winit version 0.28.6 2023-05-14 19:02:10 +03:00
Kirill Chibisov
8e4ef92669 On macOS, fix backspace emission on preedit clear
Fixes: d15feb5cfa (On macOS, fix empty marked text)
2023-05-14 19:02:10 +03:00
Xiaopeng Li
5278441547 Fix device description leak (#2758)
* Fix device description leak

* Update CHANGELOG.md

---------

Co-authored-by: Xiaopeng Li <lixiaopeng.jetspark@bytedance.com>
2023-05-14 19:02:10 +03:00
Kirill Chibisov
340202f842 Winit version 0.28.5 2023-05-06 20:42:05 +03:00
Kirill Chibisov
870e6d1cb2 On macOS, fix key_up being ignored without IME
Fixes: d15feb5cfa (On macOS, fix empty marked text)
2023-05-06 20:42:05 +03:00
Kirill Chibisov
b455f88f40 Winit version 0.28.4 2023-05-04 17:00:41 +03:00
Kirill Chibisov
30678cbcef On Wayland, fix nightly warnings
The new analysis suggests that we can remove mut.
2023-05-04 17:00:41 +03:00
Kirill Chibisov
bb26b0355c On macOS, fix empty marked text blocking input
Fixes #2775.
2023-05-04 17:00:41 +03:00
Kirill Chibisov
6f97ff174b On X11, fix nightly warnings
The new analysis suggests that we can remove mut.
2023-05-04 17:00:41 +03:00
Amandus Søve Thorsrud
0881a28302 Run Window::set_ime_position on main thread on macOS
Fixes #2756.
2023-05-04 17:00:41 +03:00
Xiaopeng Li
d37dac8f39 Fix potential panic (#2755)
* Fix potential panic

* Update CHANGELOG.md

* Use checked_div

---------

Co-authored-by: Xiaopeng Li <lixiaopeng.jetspark@bytedance.com>
2023-05-04 17:00:41 +03:00
10 changed files with 78 additions and 43 deletions

View File

@@ -8,6 +8,22 @@ And please only add new entries to the top of this list, right below the `# Unre
# Unreleased
# 0.28.6
- On macOS, fixed memory leak when getting monitor handle.
- On macOS, fix `Backspace` being emitted when clearing preedit with it.
# 0.28.5
- On macOS, fix `key_up` beind ignored when `Ime` is disabled.
# 0.28.4
- On macOS, fix empty marked text blocking regular input.
- On macOS, fixed potential panic when getting refresh rate.
- On macOS, fix crash when calling `Window::set_ime_position` from another thread.
- On macOS, fixed memory leak when getting monitor handle.
# 0.28.3
- Fix macOS memory leaks.

View File

@@ -1,6 +1,6 @@
[package]
name = "winit"
version = "0.28.3"
version = "0.28.6"
authors = ["The winit contributors", "Pierre Krieger <pierre.krieger1708@gmail.com>"]
description = "Cross-platform window creation library."
edition = "2021"

View File

@@ -6,7 +6,7 @@
```toml
[dependencies]
winit = "0.28.3"
winit = "0.28.6"
```
## [Documentation](https://docs.rs/winit)

View File

@@ -170,12 +170,12 @@ impl Window {
use sctk::window::{Event, State};
let winit_state = dispatch_data.get::<WinitState>().unwrap();
let mut window_compositor_update = winit_state
let window_compositor_update = winit_state
.window_compositor_updates
.get_mut(&window_id)
.unwrap();
let mut window_user_requests = winit_state
let window_user_requests = winit_state
.window_user_requests
.get_mut(&window_id)
.unwrap();

View File

@@ -384,7 +384,7 @@ impl UnownedWindow {
}
}
let mut shared_state = window.shared_state.get_mut().unwrap();
let shared_state = window.shared_state.get_mut().unwrap();
shared_state.min_inner_size = min_inner_size.map(Into::into);
shared_state.max_inner_size = max_inner_size.map(Into::into);
shared_state.resize_increments = window_attrs.resize_increments;

View File

@@ -39,21 +39,25 @@ extern_methods!(
}
pub fn display_id(&self) -> u32 {
let device_description = self.deviceDescription();
let key = ns_string!("NSScreenNumber");
// Retrieve the CGDirectDisplayID associated with this screen
//
// SAFETY: The value from @"NSScreenNumber" in deviceDescription is guaranteed
// to be an NSNumber. See documentation for `deviceDescription` for details:
// <https://developer.apple.com/documentation/appkit/nsscreen/1388360-devicedescription?language=objc>
let obj = device_description
.get(ns_string!("NSScreenNumber"))
.expect("failed getting screen display id from device description");
let obj: *const Object = obj;
let obj: *const NSNumber = obj.cast();
let obj: &NSNumber = unsafe { &*obj };
objc2::rc::autoreleasepool(|_| {
let device_description = self.deviceDescription();
obj.as_u32()
// Retrieve the CGDirectDisplayID associated with this screen
//
// SAFETY: The value from @"NSScreenNumber" in deviceDescription is guaranteed
// to be an NSNumber. See documentation for `deviceDescription` for details:
// <https://developer.apple.com/documentation/appkit/nsscreen/1388360-devicedescription?language=objc>
let obj = device_description
.get(key)
.expect("failed getting screen display id from device description");
let obj: *const Object = obj;
let obj: *const NSNumber = obj.cast();
let obj: &NSNumber = unsafe { &*obj };
obj.as_u32()
})
}
#[sel(backingScaleFactor)]

View File

@@ -230,7 +230,9 @@ impl MonitorHandle {
return None;
}
Some((time.time_scale as i64 / time.time_value * 1000) as u32)
(time.time_scale as i64)
.checked_div(time.time_value)
.map(|v| (v * 1000) as u32)
}
}

View File

@@ -2,10 +2,10 @@ use std::ops::Deref;
use dispatch::Queue;
use objc2::foundation::{is_main_thread, CGFloat, NSPoint, NSSize, NSString};
use objc2::rc::autoreleasepool;
use objc2::rc::{autoreleasepool, Id};
use crate::{
dpi::LogicalSize,
dpi::{LogicalPosition, LogicalSize},
platform_impl::platform::{
appkit::{NSScreen, NSWindow, NSWindowLevel, NSWindowStyleMask},
ffi,
@@ -201,3 +201,11 @@ pub(crate) fn close_sync(window: &NSWindow) {
});
});
}
pub(crate) fn set_ime_position_sync(window: &WinitWindow, logical_spot: LogicalPosition<f64>) {
let window = MainThreadSafe(window);
run_on_main(move || {
// TODO(madsmtm): Remove the need for this
unsafe { Id::from_shared(window.view()) }.set_ime_position(logical_spot);
});
}

View File

@@ -50,13 +50,14 @@ impl Default for CursorState {
}
}
#[derive(Debug, Eq, PartialEq)]
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
enum ImeState {
/// The IME events are disabled, so only `ReceivedCharacter` is being sent to the user.
Disabled,
/// The IME events are enabled.
Enabled,
/// The ground state of enabled IME input. It means that both Preedit and regular keyboard
/// input could be start from it.
Ground,
/// The IME is in preedit.
Preedit,
@@ -325,7 +326,7 @@ declare_class!(
)
};
// Update marked text
// Update marked text.
*self.marked_text = marked_text;
// Notify IME is active if application still doesn't know it.
@@ -334,10 +335,11 @@ declare_class!(
self.queue_event(WindowEvent::Ime(Ime::Enabled));
}
// Don't update self.state to preedit when we've just commited a string, since the following
// preedit string will be None anyway.
if self.state.ime_state != ImeState::Commited {
if self.hasMarkedText() {
self.state.ime_state = ImeState::Preedit;
} else {
// In case the preedit was cleared, set IME into the Ground state.
self.state.ime_state = ImeState::Ground;
}
// Empty string basically means that there's no preedit, so indicate that by sending
@@ -363,7 +365,7 @@ declare_class!(
self.queue_event(WindowEvent::Ime(Ime::Preedit(String::new(), None)));
if self.is_ime_enabled() {
// Leave the Preedit self.state
self.state.ime_state = ImeState::Enabled;
self.state.ime_state = ImeState::Ground;
} else {
warn!("Expected to have IME enabled when receiving unmarkText");
}
@@ -451,8 +453,8 @@ declare_class!(
self.state.forward_key_to_app = true;
if self.hasMarkedText() && self.state.ime_state == ImeState::Preedit {
// Leave preedit so that we also report the keyup for this key
self.state.ime_state = ImeState::Enabled;
// Leave preedit so that we also report the key-up for this key.
self.state.ime_state = ImeState::Ground;
}
}
}
@@ -467,7 +469,6 @@ declare_class!(
self.state.input_source = input_source;
self.queue_event(WindowEvent::Ime(Ime::Disabled));
}
let was_in_preedit = self.state.ime_state == ImeState::Preedit;
// Get the characters from the event.
let ev_mods = event_mods(event);
@@ -480,6 +481,7 @@ declare_class!(
&& !ev_mods.logo();
let characters = get_characters(event, ignore_alt_characters);
let old_ime_state = self.state.ime_state;
self.state.forward_key_to_app = false;
// The `interpretKeyEvents` function might call
@@ -488,7 +490,6 @@ declare_class!(
// we must send the `KeyboardInput` event during IME if it triggered
// `doCommandBySelector`. (doCommandBySelector means that the keyboard input
// is not handled by IME and should be handled by the application)
let mut text_commited = false;
if self.state.ime_allowed {
let new_event = if ignore_alt_characters {
replace_event_chars(event, &characters)
@@ -503,21 +504,26 @@ declare_class!(
if self.state.ime_state == ImeState::Commited {
// Remove any marked text, so normal input can continue.
*self.marked_text = NSMutableAttributedString::new();
self.state.ime_state = ImeState::Enabled;
text_commited = true;
}
}
let now_in_preedit = self.state.ime_state == ImeState::Preedit;
let scancode = event.scancode() as u32;
let virtual_keycode = retrieve_keycode(event);
self.update_potentially_stale_modifiers(event);
let ime_related = was_in_preedit || now_in_preedit || text_commited;
let had_ime_input = match self.state.ime_state {
ImeState::Commited => {
// Allow normal input after the commit.
self.state.ime_state = ImeState::Ground;
true
}
ImeState::Preedit => true,
// `key_down` could result in preedit clear, so compare old and current state.
_ => old_ime_state != self.state.ime_state,
};
if !ime_related || self.state.forward_key_to_app || !self.state.ime_allowed {
if !had_ime_input || self.state.forward_key_to_app {
#[allow(deprecated)]
self.queue_event(WindowEvent::KeyboardInput {
device_id: DEVICE_ID,
@@ -544,8 +550,8 @@ declare_class!(
self.update_potentially_stale_modifiers(event);
// We want to send keyboard input when we are not currently in preedit
if self.state.ime_state != ImeState::Preedit {
// We want to send keyboard input when we are currently in the ground state.
if matches!(self.state.ime_state, ImeState::Ground | ImeState::Disabled) {
#[allow(deprecated)]
self.queue_event(WindowEvent::KeyboardInput {
device_id: DEVICE_ID,

View File

@@ -1165,8 +1165,7 @@ impl WinitWindow {
pub fn set_ime_position(&self, spot: Position) {
let scale_factor = self.scale_factor();
let logical_spot = spot.to_logical(scale_factor);
// TODO(madsmtm): Remove the need for this
unsafe { Id::from_shared(self.view()) }.set_ime_position(logical_spot);
util::set_ime_position_sync(self, logical_spot);
}
#[inline]