diff options
Diffstat (limited to 'ports')
-rw-r--r-- | ports/servoshell/Cargo.toml | 4 | ||||
-rw-r--r-- | ports/servoshell/egl/app_state.rs | 16 | ||||
-rw-r--r-- | ports/servoshell/egl/ohos.rs | 35 | ||||
-rw-r--r-- | ports/servoshell/egl/ohos/simpleservo.rs | 5 | ||||
-rw-r--r-- | ports/servoshell/prefs.rs | 6 |
5 files changed, 56 insertions, 10 deletions
diff --git a/ports/servoshell/Cargo.toml b/ports/servoshell/Cargo.toml index e000900e4ea..a77bd885549 100644 --- a/ports/servoshell/Cargo.toml +++ b/ports/servoshell/Cargo.toml @@ -131,13 +131,13 @@ libservo = { path = "../../components/servo", features = ["no-wgl"] } windows-sys = { workspace = true, features = ["Win32_Graphics_Gdi"] } [target.'cfg(target_os = "macos")'.dependencies] -objc2-app-kit = { version = "0.2.2", default-features = false, features = [ +objc2-app-kit = { version = "0.3.1", default-features = false, features = [ "std", "NSColorSpace", "NSResponder", "NSView", "NSWindow", ] } -objc2-foundation = { version = "0.2.2", default-features = false, features = [ +objc2-foundation = { version = "0.3.1", default-features = false, features = [ "std", ] } diff --git a/ports/servoshell/egl/app_state.rs b/ports/servoshell/egl/app_state.rs index a65ed7424f4..737a2f23b7d 100644 --- a/ports/servoshell/egl/app_state.rs +++ b/ports/servoshell/egl/app_state.rs @@ -38,6 +38,14 @@ impl Coordinates { viewport: Rect::new(Point2D::new(x, y), Size2D::new(width, height)), } } + + pub fn origin(&self) -> Point2D<i32, DevicePixel> { + self.viewport.origin + } + + pub fn size(&self) -> Size2D<i32, DevicePixel> { + self.viewport.size + } } pub(super) struct ServoWindowCallbacks { @@ -115,11 +123,13 @@ impl ServoDelegate for ServoShellServoDelegate { impl WebViewDelegate for RunningAppState { fn screen_geometry(&self, _webview: WebView) -> Option<ScreenGeometry> { let coord = self.callbacks.coordinates.borrow(); - let screen_size = DeviceIntSize::new(coord.viewport.size.width, coord.viewport.size.height); + let offset = coord.origin(); + let available_size = coord.size(); + let screen_size = coord.size(); Some(ScreenGeometry { size: screen_size, - available_size: screen_size, - offset: Point2D::zero(), + available_size, + offset, }) } diff --git a/ports/servoshell/egl/ohos.rs b/ports/servoshell/egl/ohos.rs index 236f1d842da..79172d368ab 100644 --- a/ports/servoshell/egl/ohos.rs +++ b/ports/servoshell/egl/ohos.rs @@ -28,8 +28,9 @@ use servo::{ use xcomponent_sys::{ OH_NativeXComponent, OH_NativeXComponent_Callback, OH_NativeXComponent_GetKeyEvent, OH_NativeXComponent_GetKeyEventAction, OH_NativeXComponent_GetKeyEventCode, - OH_NativeXComponent_GetTouchEvent, OH_NativeXComponent_GetXComponentSize, - OH_NativeXComponent_KeyAction, OH_NativeXComponent_KeyCode, OH_NativeXComponent_KeyEvent, + OH_NativeXComponent_GetTouchEvent, OH_NativeXComponent_GetXComponentOffset, + OH_NativeXComponent_GetXComponentSize, OH_NativeXComponent_KeyAction, + OH_NativeXComponent_KeyCode, OH_NativeXComponent_KeyEvent, OH_NativeXComponent_RegisterCallback, OH_NativeXComponent_RegisterKeyEventCallback, OH_NativeXComponent_TouchEvent, OH_NativeXComponent_TouchEventType, }; @@ -267,6 +268,33 @@ extern "C" fn on_surface_created_cb(xcomponent: *mut OH_NativeXComponent, window info!("Returning from on_surface_created_cb"); } +/// Returns the offset of the surface relative to its parent's top left corner +/// +/// # Safety +/// +/// `xcomponent` and `native_window` must be valid, non-null and aligned pointers to a +/// live xcomponent and associated native window surface. +unsafe fn get_xcomponent_offset( + xcomponent: *mut OH_NativeXComponent, + native_window: *mut c_void, +) -> Result<(i32, i32), i32> { + let mut x: f64 = 0.0; + let mut y: f64 = 0.0; + + let result = unsafe { + OH_NativeXComponent_GetXComponentOffset(xcomponent, native_window, &raw mut x, &raw mut y) + }; + if result != 0 { + error!("OH_NativeXComponent_GetXComponentOffset failed with {result}"); + return Err(result); + } + + Ok(( + (x.round() as i64).try_into().expect("X offset too large"), + (y.round() as i64).try_into().expect("Y offset too large"), + )) +} + /// Returns the size of the surface /// /// # Safety @@ -387,6 +415,7 @@ extern "C" fn on_dispatch_key_event(xc: *mut OH_NativeXComponent, _window: *mut static LOGGER: LazyLock<hilog::Logger> = LazyLock::new(|| { let mut builder = hilog::Builder::new(); + builder.set_domain(hilog::LogDomain::new(0xE0C3)); let filters = [ "fonts", "servo", @@ -678,7 +707,7 @@ impl EventLoopWaker for WakeupCallback { } fn wake(&self) { - info!("wake called!"); + log::trace!("wake called!"); self.chan.send(ServoAction::WakeUp).unwrap_or_else(|e| { error!("Failed to send wake message with: {e}"); }); diff --git a/ports/servoshell/egl/ohos/simpleservo.rs b/ports/servoshell/egl/ohos/simpleservo.rs index 9815c0fe4fd..c867c7a5330 100644 --- a/ports/servoshell/egl/ohos/simpleservo.rs +++ b/ports/servoshell/egl/ohos/simpleservo.rs @@ -97,7 +97,10 @@ pub fn init( let Ok(window_size) = (unsafe { super::get_xcomponent_size(xcomponent, native_window) }) else { return Err("Failed to get xcomponent size"); }; - let coordinates = Coordinates::new(0, 0, window_size.width, window_size.height); + let Ok((x, y)) = (unsafe { super::get_xcomponent_offset(xcomponent, native_window) }) else { + return Err("Failed to get xcomponent offset"); + }; + let coordinates = Coordinates::new(x, y, window_size.width, window_size.height); let display_handle = RawDisplayHandle::Ohos(OhosDisplayHandle::new()); let display_handle = unsafe { DisplayHandle::borrow_raw(display_handle) }; diff --git a/ports/servoshell/prefs.rs b/ports/servoshell/prefs.rs index a2efe3bab3b..a3ebda231d0 100644 --- a/ports/servoshell/prefs.rs +++ b/ports/servoshell/prefs.rs @@ -428,7 +428,11 @@ pub(crate) fn parse_command_line_arguments(args: Vec<String>) -> ArgumentParsing #[cfg(target_env = "ohos")] let log_filter = { let filters = opt_match.opt_strs("log-filter").join(","); - (!filters.is_empty()).then_some(filters) + let log_filter = (!filters.is_empty()).then_some(filters).or_else(|| { + (!preferences.log_filter.is_empty()).then_some(preferences.log_filter.clone()) + }); + log::debug!("Set log_filter to: {:?}", log_filter); + log_filter }; let mut debug_options = DebugOptions::default(); |