mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Auto merge of #6016 - zmike:embedding-windowing, r=larsbergstrom
Depends on glutin PR #21 @glennw @larsbergstrom <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6016) <!-- Reviewable:end -->
This commit is contained in:
commit
a97f81b83d
7 changed files with 59 additions and 15 deletions
2
components/servo/Cargo.lock
generated
2
components/servo/Cargo.lock
generated
|
@ -623,7 +623,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "layers"
|
name = "layers"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/rust-layers#018259e838c3842032010829feeaba316e577376"
|
source = "git+https://github.com/servo/rust-layers#ff65707d621498949ed428077da7e42a9f9d2745"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
|
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
|
||||||
"cgl 0.0.1 (git+https://github.com/servo/rust-cgl)",
|
"cgl 0.0.1 (git+https://github.com/servo/rust-cgl)",
|
||||||
|
|
2
ports/cef/Cargo.lock
generated
2
ports/cef/Cargo.lock
generated
|
@ -625,7 +625,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "layers"
|
name = "layers"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/rust-layers#018259e838c3842032010829feeaba316e577376"
|
source = "git+https://github.com/servo/rust-layers#ff65707d621498949ed428077da7e42a9f9d2745"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
|
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
|
||||||
"cgl 0.0.1 (git+https://github.com/servo/rust-cgl)",
|
"cgl 0.0.1 (git+https://github.com/servo/rust-cgl)",
|
||||||
|
|
|
@ -9,14 +9,16 @@ use interfaces::{CefBrowser, CefBrowserHost, CefClient, CefFrame, CefRequestCont
|
||||||
use interfaces::{cef_browser_t, cef_browser_host_t, cef_client_t, cef_frame_t};
|
use interfaces::{cef_browser_t, cef_browser_host_t, cef_client_t, cef_frame_t};
|
||||||
use interfaces::{cef_request_context_t};
|
use interfaces::{cef_request_context_t};
|
||||||
use servo::Browser;
|
use servo::Browser;
|
||||||
use types::{cef_browser_settings_t, cef_string_t, cef_window_info_t};
|
use types::{cef_browser_settings_t, cef_string_t, cef_window_info_t, cef_window_handle_t};
|
||||||
use window;
|
use window;
|
||||||
|
use wrappers::CefWrap;
|
||||||
|
|
||||||
use compositing::windowing::{WindowNavigateMsg, WindowEvent};
|
use compositing::windowing::{WindowNavigateMsg, WindowEvent};
|
||||||
use glutin_app;
|
use glutin_app;
|
||||||
use libc::c_int;
|
use libc::c_int;
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::cell::{Cell, RefCell, BorrowState};
|
use std::cell::{Cell, RefCell, BorrowState};
|
||||||
|
use std::ptr;
|
||||||
use std::sync::atomic::{AtomicIsize, Ordering};
|
use std::sync::atomic::{AtomicIsize, Ordering};
|
||||||
|
|
||||||
thread_local!(pub static ID_COUNTER: AtomicIsize = AtomicIsize::new(0));
|
thread_local!(pub static ID_COUNTER: AtomicIsize = AtomicIsize::new(0));
|
||||||
|
@ -72,6 +74,10 @@ cef_class_impl! {
|
||||||
fn get_main_frame(&this,) -> *mut cef_frame_t {{
|
fn get_main_frame(&this,) -> *mut cef_frame_t {{
|
||||||
this.downcast().frame.clone()
|
this.downcast().frame.clone()
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
fn get_identifier(&this,) -> c_int {{
|
||||||
|
this.downcast().id as c_int
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +90,8 @@ pub struct ServoCefBrowser {
|
||||||
pub client: CefClient,
|
pub client: CefClient,
|
||||||
/// Whether the on-created callback has fired yet.
|
/// Whether the on-created callback has fired yet.
|
||||||
pub callback_executed: Cell<bool>,
|
pub callback_executed: Cell<bool>,
|
||||||
|
/// the display system window handle: only to be used with host.get_window_handle()
|
||||||
|
window_handle: cef_window_handle_t,
|
||||||
|
|
||||||
id: isize,
|
id: isize,
|
||||||
servo_browser: RefCell<ServoBrowser>,
|
servo_browser: RefCell<ServoBrowser>,
|
||||||
|
@ -94,10 +102,12 @@ impl ServoCefBrowser {
|
||||||
pub fn new(window_info: &cef_window_info_t, client: CefClient) -> ServoCefBrowser {
|
pub fn new(window_info: &cef_window_info_t, client: CefClient) -> ServoCefBrowser {
|
||||||
let frame = ServoCefFrame::new().as_cef_interface();
|
let frame = ServoCefFrame::new().as_cef_interface();
|
||||||
let host = ServoCefBrowserHost::new(client.clone()).as_cef_interface();
|
let host = ServoCefBrowserHost::new(client.clone()).as_cef_interface();
|
||||||
|
let mut window_handle: cef_window_handle_t = get_null_window_handle();
|
||||||
|
|
||||||
let servo_browser = if window_info.windowless_rendering_enabled == 0 {
|
let servo_browser = if window_info.windowless_rendering_enabled == 0 {
|
||||||
let glutin_window = glutin_app::create_window(window_info.parent_window as glutin_app::WindowID);
|
let glutin_window = glutin_app::create_window(window_info.parent_window as glutin_app::WindowID);
|
||||||
let servo_browser = Browser::new(Some(glutin_window.clone()));
|
let servo_browser = Browser::new(Some(glutin_window.clone()));
|
||||||
|
window_handle = glutin_window.platform_window() as cef_window_handle_t;
|
||||||
ServoBrowser::OnScreen(servo_browser)
|
ServoBrowser::OnScreen(servo_browser)
|
||||||
} else {
|
} else {
|
||||||
ServoBrowser::Invalid
|
ServoBrowser::Invalid
|
||||||
|
@ -115,6 +125,7 @@ impl ServoCefBrowser {
|
||||||
servo_browser: RefCell::new(servo_browser),
|
servo_browser: RefCell::new(servo_browser),
|
||||||
message_queue: RefCell::new(vec!()),
|
message_queue: RefCell::new(vec!()),
|
||||||
id: id,
|
id: id,
|
||||||
|
window_handle: window_handle,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,6 +148,9 @@ impl ServoCefBrowserExtensions for CefBrowser {
|
||||||
|
|
||||||
self.downcast().host.set_browser((*self).clone());
|
self.downcast().host.set_browser((*self).clone());
|
||||||
self.downcast().frame.set_browser((*self).clone());
|
self.downcast().frame.set_browser((*self).clone());
|
||||||
|
if window_info.windowless_rendering_enabled == 0 {
|
||||||
|
self.downcast().host.initialize_compositing();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_window_event(&self, event: WindowEvent) {
|
fn send_window_event(&self, event: WindowEvent) {
|
||||||
|
@ -170,9 +184,21 @@ impl ServoCefBrowserExtensions for CefBrowser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os="macos")]
|
||||||
|
pub fn get_null_window_handle() -> cef_window_handle_t {
|
||||||
|
ptr::null_mut()
|
||||||
|
}
|
||||||
|
#[cfg(target_os="linux")]
|
||||||
|
pub fn get_null_window_handle() -> cef_window_handle_t {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
pub fn update() {
|
pub fn update() {
|
||||||
BROWSERS.with(|browsers| {
|
BROWSERS.with(|browsers| {
|
||||||
for browser in browsers.borrow().iter() {
|
for browser in browsers.borrow().iter() {
|
||||||
|
if browser.downcast().callback_executed.get() == false {
|
||||||
|
browser_callback_after_created(browser.clone());
|
||||||
|
}
|
||||||
browser.send_window_event(WindowEvent::Idle);
|
browser.send_window_event(WindowEvent::Idle);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -187,6 +213,10 @@ pub fn close(browser: CefBrowser) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_window(browser: &CefBrowser) -> cef_window_handle_t {
|
||||||
|
browser.downcast().window_handle
|
||||||
|
}
|
||||||
|
|
||||||
pub fn browser_callback_after_created(browser: CefBrowser) {
|
pub fn browser_callback_after_created(browser: CefBrowser) {
|
||||||
if browser.downcast().client.is_null_cef_object() {
|
if browser.downcast().client.is_null_cef_object() {
|
||||||
return
|
return
|
||||||
|
@ -201,6 +231,7 @@ pub fn browser_callback_after_created(browser: CefBrowser) {
|
||||||
|
|
||||||
fn browser_host_create(window_info: &cef_window_info_t,
|
fn browser_host_create(window_info: &cef_window_info_t,
|
||||||
client: CefClient,
|
client: CefClient,
|
||||||
|
url: *const cef_string_t,
|
||||||
callback_executed: bool)
|
callback_executed: bool)
|
||||||
-> CefBrowser {
|
-> CefBrowser {
|
||||||
let browser = ServoCefBrowser::new(window_info, client).as_cef_interface();
|
let browser = ServoCefBrowser::new(window_info, client).as_cef_interface();
|
||||||
|
@ -208,6 +239,9 @@ fn browser_host_create(window_info: &cef_window_info_t,
|
||||||
if callback_executed {
|
if callback_executed {
|
||||||
browser_callback_after_created(browser.clone());
|
browser_callback_after_created(browser.clone());
|
||||||
}
|
}
|
||||||
|
if url != ptr::null() {
|
||||||
|
unsafe { browser.downcast().frame.load_url(CefWrap::to_rust(url)); }
|
||||||
|
}
|
||||||
BROWSERS.with(|browsers| {
|
BROWSERS.with(|browsers| {
|
||||||
browsers.borrow_mut().push(browser.clone());
|
browsers.borrow_mut().push(browser.clone());
|
||||||
});
|
});
|
||||||
|
@ -217,27 +251,25 @@ fn browser_host_create(window_info: &cef_window_info_t,
|
||||||
cef_static_method_impls! {
|
cef_static_method_impls! {
|
||||||
fn cef_browser_host_create_browser(window_info: *const cef_window_info_t,
|
fn cef_browser_host_create_browser(window_info: *const cef_window_info_t,
|
||||||
client: *mut cef_client_t,
|
client: *mut cef_client_t,
|
||||||
_url: *const cef_string_t,
|
url: *const cef_string_t,
|
||||||
_browser_settings: *const cef_browser_settings_t,
|
_browser_settings: *const cef_browser_settings_t,
|
||||||
_request_context: *mut cef_request_context_t)
|
_request_context: *mut cef_request_context_t)
|
||||||
-> c_int {{
|
-> c_int {{
|
||||||
let client: CefClient = client;
|
let client: CefClient = client;
|
||||||
let _url: &[u16] = _url;
|
|
||||||
let _browser_settings: &cef_browser_settings_t = _browser_settings;
|
let _browser_settings: &cef_browser_settings_t = _browser_settings;
|
||||||
let _request_context: CefRequestContext = _request_context;
|
let _request_context: CefRequestContext = _request_context;
|
||||||
browser_host_create(window_info, client, false);
|
browser_host_create(window_info, client, url, false);
|
||||||
1i32
|
1i32
|
||||||
}}
|
}}
|
||||||
fn cef_browser_host_create_browser_sync(window_info: *const cef_window_info_t,
|
fn cef_browser_host_create_browser_sync(window_info: *const cef_window_info_t,
|
||||||
client: *mut cef_client_t,
|
client: *mut cef_client_t,
|
||||||
_url: *const cef_string_t,
|
url: *const cef_string_t,
|
||||||
_browser_settings: *const cef_browser_settings_t,
|
_browser_settings: *const cef_browser_settings_t,
|
||||||
_request_context: *mut cef_request_context_t)
|
_request_context: *mut cef_request_context_t)
|
||||||
-> *mut cef_browser_t {{
|
-> *mut cef_browser_t {{
|
||||||
let client: CefClient = client;
|
let client: CefClient = client;
|
||||||
let _url: &[u16] = _url;
|
|
||||||
let _browser_settings: &cef_browser_settings_t = _browser_settings;
|
let _browser_settings: &cef_browser_settings_t = _browser_settings;
|
||||||
let _request_context: CefRequestContext = _request_context;
|
let _request_context: CefRequestContext = _request_context;
|
||||||
browser_host_create(window_info, client, true)
|
browser_host_create(window_info, client, url, true)
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use eutil::Downcast;
|
use eutil::Downcast;
|
||||||
use interfaces::{CefBrowser, CefBrowserHost, CefClient, cef_browser_host_t, cef_client_t};
|
use interfaces::{CefBrowser, CefBrowserHost, CefClient, cef_browser_t, cef_browser_host_t, cef_client_t};
|
||||||
use types::{cef_mouse_button_type_t, cef_mouse_event, cef_rect_t, cef_key_event};
|
use types::{cef_mouse_button_type_t, cef_mouse_event, cef_rect_t, cef_key_event, cef_window_handle_t};
|
||||||
use types::cef_key_event_type_t::{KEYEVENT_CHAR, KEYEVENT_KEYDOWN, KEYEVENT_KEYUP, KEYEVENT_RAWKEYDOWN};
|
use types::cef_key_event_type_t::{KEYEVENT_CHAR, KEYEVENT_KEYDOWN, KEYEVENT_KEYUP, KEYEVENT_RAWKEYDOWN};
|
||||||
use browser::{self, ServoCefBrowserExtensions};
|
use browser::{self, ServoCefBrowserExtensions};
|
||||||
|
|
||||||
|
@ -28,6 +28,10 @@ full_cef_class_impl! {
|
||||||
fn get_client(&this,) -> *mut cef_client_t {{
|
fn get_client(&this,) -> *mut cef_client_t {{
|
||||||
this.downcast().client.clone()
|
this.downcast().client.clone()
|
||||||
}}
|
}}
|
||||||
|
fn get_browser(&this,) -> *mut cef_browser_t {{
|
||||||
|
let browser = this.downcast().browser.borrow_mut();
|
||||||
|
browser.clone().unwrap()
|
||||||
|
}}
|
||||||
|
|
||||||
fn was_resized(&this,) -> () {{
|
fn was_resized(&this,) -> () {{
|
||||||
let mut rect = cef_rect_t::zero();
|
let mut rect = cef_rect_t::zero();
|
||||||
|
@ -160,6 +164,12 @@ full_cef_class_impl! {
|
||||||
fn initialize_compositing(&this,) -> () {{
|
fn initialize_compositing(&this,) -> () {{
|
||||||
this.downcast().send_window_event(WindowEvent::InitializeCompositing);
|
this.downcast().send_window_event(WindowEvent::InitializeCompositing);
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
fn get_window_handle(&this,) -> cef_window_handle_t {{
|
||||||
|
let t = this.downcast();
|
||||||
|
let browser = t.browser.borrow();
|
||||||
|
browser::get_window(&browser.as_ref().unwrap()) as cef_window_handle_t
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,7 @@ use std_url::Url;
|
||||||
|
|
||||||
const MAX_RENDERING_THREADS: usize = 128;
|
const MAX_RENDERING_THREADS: usize = 128;
|
||||||
|
|
||||||
// TODO(pcwalton): Get the home page via the CEF API.
|
//static HOME_URL: &'static str = "http://s27.postimg.org/vqbtrolyr/servo.jpg";
|
||||||
static HOME_URL: &'static str = "http://s27.postimg.org/vqbtrolyr/servo.jpg";
|
|
||||||
|
|
||||||
static CEF_API_HASH_UNIVERSAL: &'static [u8] = b"8efd129f4afc344bd04b2feb7f73a149b6c4e27f\0";
|
static CEF_API_HASH_UNIVERSAL: &'static [u8] = b"8efd129f4afc344bd04b2feb7f73a149b6c4e27f\0";
|
||||||
#[cfg(target_os="windows")]
|
#[cfg(target_os="windows")]
|
||||||
|
@ -62,7 +61,6 @@ pub extern "C" fn cef_initialize(args: *const cef_main_args_t,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut temp_opts = opts::default_opts();
|
let mut temp_opts = opts::default_opts();
|
||||||
temp_opts.url = Url::parse(HOME_URL).unwrap();
|
|
||||||
temp_opts.paint_threads = rendering_threads;
|
temp_opts.paint_threads = rendering_threads;
|
||||||
temp_opts.layout_threads = rendering_threads;
|
temp_opts.layout_threads = rendering_threads;
|
||||||
temp_opts.headless = false;
|
temp_opts.headless = false;
|
||||||
|
|
|
@ -101,6 +101,10 @@ impl Window {
|
||||||
Rc::new(window)
|
Rc::new(window)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn platform_window(&self) -> glutin::WindowID {
|
||||||
|
unsafe { self.window.platform_window() }
|
||||||
|
}
|
||||||
|
|
||||||
fn nested_window_resize(width: u32, height: u32) {
|
fn nested_window_resize(width: u32, height: u32) {
|
||||||
unsafe {
|
unsafe {
|
||||||
match g_nested_event_loop_listener {
|
match g_nested_event_loop_listener {
|
||||||
|
|
2
ports/gonk/Cargo.lock
generated
2
ports/gonk/Cargo.lock
generated
|
@ -523,7 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "layers"
|
name = "layers"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/rust-layers#018259e838c3842032010829feeaba316e577376"
|
source = "git+https://github.com/servo/rust-layers#ff65707d621498949ed428077da7e42a9f9d2745"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
|
"azure 0.1.0 (git+https://github.com/servo/rust-azure)",
|
||||||
"cgl 0.0.1 (git+https://github.com/servo/rust-cgl)",
|
"cgl 0.0.1 (git+https://github.com/servo/rust-cgl)",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue