mirror of
https://github.com/wez/wezterm.git
synced 2024-11-23 15:04:36 +03:00
fixup wgpu example
This commit is contained in:
parent
1bb2f50eb7
commit
5c4fb92b87
@ -132,10 +132,12 @@ impl MyWindow {
|
||||
);
|
||||
|
||||
self.gpu.replace(gpu);
|
||||
self.paint(win)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn paint(&mut self) -> anyhow::Result<()> {
|
||||
fn paint(&mut self, win: &Window) -> anyhow::Result<()> {
|
||||
self.fix_transparency(win);
|
||||
if let Some(gpu) = self.gpu.as_mut() {
|
||||
let frame = match gpu.swap_chain.get_current_frame() {
|
||||
Ok(frame) => frame,
|
||||
@ -179,6 +181,19 @@ impl MyWindow {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn fix_transparency(&mut self, win: &Window) {
|
||||
#[cfg(target_os = "macos")]
|
||||
if let RawWindowHandle::MacOS(h) = win.raw_window_handle() {
|
||||
use cocoa::base::{id, NO};
|
||||
use objc::*;
|
||||
unsafe {
|
||||
// Allow transparency, as the default for Metal is opaque
|
||||
let layer: id = msg_send![h.ns_view as id, layer];
|
||||
let () = msg_send![layer, setOpaque: NO];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn resize(&mut self, dims: Dimensions) {
|
||||
if self.dims == dims {
|
||||
// May just be a move event
|
||||
@ -211,17 +226,7 @@ impl MyWindow {
|
||||
} => {
|
||||
self.resize(dimensions);
|
||||
#[cfg(target_os = "macos")]
|
||||
if let RawWindowHandle::MacOS(h) = win.raw_window_handle() {
|
||||
use cocoa::base::{id, NO};
|
||||
use objc::*;
|
||||
unsafe {
|
||||
// Allow transparency, as the default for Metal is opaque
|
||||
let layer: id = msg_send![h.ns_view as id, layer];
|
||||
let () = msg_send![layer, setOpaque: NO];
|
||||
}
|
||||
|
||||
self.paint().unwrap();
|
||||
}
|
||||
self.paint(win).unwrap();
|
||||
}
|
||||
WindowEvent::MouseEvent(event) => {
|
||||
self.cursor_pos = event.coords;
|
||||
@ -238,7 +243,7 @@ impl MyWindow {
|
||||
win.default_key_processing(key);
|
||||
}
|
||||
WindowEvent::NeedRepaint => {
|
||||
self.paint().unwrap();
|
||||
self.paint(win).unwrap();
|
||||
}
|
||||
WindowEvent::Notification(_) | WindowEvent::FocusChanged(_) => {}
|
||||
}
|
||||
|
@ -358,7 +358,14 @@ fn function_key_to_keycode(function_key: char) -> KeyCode {
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Window(usize);
|
||||
pub struct Window {
|
||||
id: usize,
|
||||
ns_window: *mut Object,
|
||||
ns_view: *mut Object,
|
||||
}
|
||||
|
||||
unsafe impl Send for Window {}
|
||||
unsafe impl Sync for Window {}
|
||||
|
||||
impl Window {
|
||||
pub async fn new_window<F>(
|
||||
@ -388,9 +395,7 @@ impl Window {
|
||||
let conn = Connection::get().expect("Connection::init has not been called");
|
||||
|
||||
let window_id = conn.next_window_id();
|
||||
let window_handle = Window(window_id);
|
||||
let mut events = WindowEventSender::new(event_handler);
|
||||
events.assign_window(window_handle.clone());
|
||||
let events = WindowEventSender::new(event_handler);
|
||||
|
||||
let inner = Rc::new(RefCell::new(Inner {
|
||||
events,
|
||||
@ -470,6 +475,11 @@ impl Window {
|
||||
let height = backing_frame.size.height;
|
||||
|
||||
let weak_window = window.weak();
|
||||
let window_handle = Window {
|
||||
id: window_id,
|
||||
ns_window: *window,
|
||||
ns_view: *view,
|
||||
};
|
||||
let window_inner = Rc::new(RefCell::new(WindowInner {
|
||||
window,
|
||||
view,
|
||||
@ -480,6 +490,11 @@ impl Window {
|
||||
.borrow_mut()
|
||||
.insert(window_id, Rc::clone(&window_inner));
|
||||
|
||||
inner
|
||||
.borrow_mut()
|
||||
.events
|
||||
.assign_window(window_handle.clone());
|
||||
|
||||
window_handle.config_did_change(&config);
|
||||
|
||||
// Synthesize a resize event immediately; this allows
|
||||
@ -502,21 +517,18 @@ impl Window {
|
||||
|
||||
unsafe impl HasRawWindowHandle for Window {
|
||||
fn raw_window_handle(&self) -> RawWindowHandle {
|
||||
let conn = Connection::get().expect("raw_window_handle only callable on main thread");
|
||||
let handle = conn.window_by_id(self.0).expect("window handle invalid!?");
|
||||
|
||||
let inner = handle.borrow();
|
||||
let window_view =
|
||||
WindowView::get_this(unsafe { &**inner.view }).expect("window view invalid!?");
|
||||
|
||||
window_view.inner.borrow().raw_window_handle()
|
||||
RawWindowHandle::MacOS(MacOSHandle {
|
||||
ns_window: self.ns_window as *mut _,
|
||||
ns_view: self.ns_view as *mut _,
|
||||
..MacOSHandle::empty()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait(?Send)]
|
||||
impl WindowOps for Window {
|
||||
async fn enable_opengl(&self) -> anyhow::Result<Rc<glium::backend::Context>> {
|
||||
let window_id = self.0;
|
||||
let window_id = self.id;
|
||||
promise::spawn::spawn(async move {
|
||||
if let Some(handle) = Connection::get().unwrap().window_by_id(window_id) {
|
||||
let mut inner = handle.borrow_mut();
|
||||
@ -532,7 +544,7 @@ impl WindowOps for Window {
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
Connection::with_window_inner(self.0, move |inner| {
|
||||
Connection::with_window_inner(self.id, move |inner| {
|
||||
if let Some(window_view) = WindowView::get_this(unsafe { &**inner.view }) {
|
||||
window_view
|
||||
.inner
|
||||
@ -545,35 +557,35 @@ impl WindowOps for Window {
|
||||
}
|
||||
|
||||
fn close(&self) {
|
||||
Connection::with_window_inner(self.0, |inner| {
|
||||
Connection::with_window_inner(self.id, |inner| {
|
||||
inner.close();
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
fn hide(&self) {
|
||||
Connection::with_window_inner(self.0, |inner| {
|
||||
Connection::with_window_inner(self.id, |inner| {
|
||||
inner.hide();
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
fn show(&self) {
|
||||
Connection::with_window_inner(self.0, |inner| {
|
||||
Connection::with_window_inner(self.id, |inner| {
|
||||
inner.show();
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
fn set_cursor(&self, cursor: Option<MouseCursor>) {
|
||||
Connection::with_window_inner(self.0, move |inner| {
|
||||
Connection::with_window_inner(self.id, move |inner| {
|
||||
let _ = inner.set_cursor(cursor);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
fn invalidate(&self) {
|
||||
Connection::with_window_inner(self.0, |inner| {
|
||||
Connection::with_window_inner(self.id, |inner| {
|
||||
inner.invalidate();
|
||||
Ok(())
|
||||
});
|
||||
@ -581,25 +593,28 @@ impl WindowOps for Window {
|
||||
|
||||
fn set_title(&self, title: &str) {
|
||||
let title = title.to_owned();
|
||||
Connection::with_window_inner(self.0, move |inner| {
|
||||
Connection::with_window_inner(self.id, move |inner| {
|
||||
inner.set_title(&title);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
fn set_inner_size(&self, width: usize, height: usize) {
|
||||
Connection::with_window_inner(self.0, move |inner| Ok(inner.set_inner_size(width, height)));
|
||||
Connection::with_window_inner(
|
||||
self.id,
|
||||
move |inner| Ok(inner.set_inner_size(width, height)),
|
||||
);
|
||||
}
|
||||
|
||||
fn set_window_position(&self, coords: ScreenPoint) {
|
||||
Connection::with_window_inner(self.0, move |inner| {
|
||||
Connection::with_window_inner(self.id, move |inner| {
|
||||
inner.set_window_position(coords);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
fn set_text_cursor_position(&self, cursor: Rect) {
|
||||
Connection::with_window_inner(self.0, move |inner| {
|
||||
Connection::with_window_inner(self.id, move |inner| {
|
||||
inner.set_text_cursor_position(cursor);
|
||||
Ok(())
|
||||
});
|
||||
@ -622,7 +637,7 @@ impl WindowOps for Window {
|
||||
}
|
||||
|
||||
fn toggle_fullscreen(&self) {
|
||||
Connection::with_window_inner(self.0, move |inner| {
|
||||
Connection::with_window_inner(self.id, move |inner| {
|
||||
inner.toggle_fullscreen();
|
||||
Ok(())
|
||||
});
|
||||
@ -630,7 +645,7 @@ impl WindowOps for Window {
|
||||
|
||||
fn config_did_change(&self, config: &ConfigHandle) {
|
||||
let config = config.clone();
|
||||
Connection::with_window_inner(self.0, move |inner| {
|
||||
Connection::with_window_inner(self.id, move |inner| {
|
||||
inner.config_did_change(&config);
|
||||
Ok(())
|
||||
});
|
||||
@ -987,18 +1002,6 @@ struct Inner {
|
||||
config: ConfigHandle,
|
||||
}
|
||||
|
||||
unsafe impl HasRawWindowHandle for Inner {
|
||||
fn raw_window_handle(&self) -> RawWindowHandle {
|
||||
let ns_window = self.window.as_ref().unwrap().load();
|
||||
let ns_view = self.view_id.as_ref().unwrap().load();
|
||||
RawWindowHandle::MacOS(MacOSHandle {
|
||||
ns_window: *ns_window as *mut _,
|
||||
ns_view: *ns_view as *mut _,
|
||||
..MacOSHandle::empty()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct __InputSource {
|
||||
_dummy: i32,
|
||||
|
Loading…
Reference in New Issue
Block a user