macOS: Implement Refresh (#742)

* macOS: Implement Refresh

* drawRect should take NSRect
This commit is contained in:
Francesca Plebani 2018-12-27 15:16:58 -05:00 committed by GitHub
parent 33c8aa660f
commit 5a0b4dba47
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 0 deletions

View file

@ -17,6 +17,7 @@
- On X11, `WindowBuilder::with_min_dimensions` and `WindowBuilder::with_max_dimensions` now correctly account for DPI. - On X11, `WindowBuilder::with_min_dimensions` and `WindowBuilder::with_max_dimensions` now correctly account for DPI.
- Added support for generating dummy `DeviceId`s and `WindowId`s to better support unit testing. - Added support for generating dummy `DeviceId`s and `WindowId`s to better support unit testing.
- On macOS, fixed unsoundness in drag-and-drop that could result in drops being rejected. - On macOS, fixed unsoundness in drag-and-drop that could result in drops being rejected.
- On macOS, implemented `WindowEvent::Refresh`.
# Version 0.18.0 (2018-11-07) # Version 0.18.0 (2018-11-07)

View file

@ -2,6 +2,7 @@ use cocoa::appkit::NSWindowStyleMask;
use cocoa::base::{id, nil}; use cocoa::base::{id, nil};
use cocoa::foundation::{NSRect, NSUInteger}; use cocoa::foundation::{NSRect, NSUInteger};
use core_graphics::display::CGDisplay; use core_graphics::display::CGDisplay;
use objc::runtime::{Class, Object};
use platform::platform::ffi; use platform::platform::ffi;
use platform::platform::window::IdRef; use platform::platform::window::IdRef;
@ -39,6 +40,11 @@ pub unsafe fn toggle_style_mask(window: id, view: id, mask: NSWindowStyleMask, o
window.makeFirstResponder_(view); window.makeFirstResponder_(view);
} }
pub unsafe fn superclass<'a>(this: &'a Object) -> &'a Class {
let superclass: id = msg_send![this, superclass];
&*(superclass as *const _)
}
pub unsafe fn create_input_context(view: id) -> IdRef { pub unsafe fn create_input_context(view: id) -> IdRef {
let input_context: id = msg_send![class!(NSTextInputContext), alloc]; let input_context: id = msg_send![class!(NSTextInputContext), alloc];
let input_context: id = msg_send![input_context, initWithClient:view]; let input_context: id = msg_send![input_context, initWithClient:view];

View file

@ -71,6 +71,10 @@ lazy_static! {
sel!(initWithWinit:), sel!(initWithWinit:),
init_with_winit as extern fn(&Object, Sel, *mut c_void) -> id, init_with_winit as extern fn(&Object, Sel, *mut c_void) -> id,
); );
decl.add_method(
sel!(drawRect:),
draw_rect as extern fn(&Object, Sel, NSRect),
);
decl.add_method(sel!(hasMarkedText), has_marked_text as extern fn(&Object, Sel) -> BOOL); decl.add_method(sel!(hasMarkedText), has_marked_text as extern fn(&Object, Sel) -> BOOL);
decl.add_method( decl.add_method(
sel!(markedRange), sel!(markedRange),
@ -154,6 +158,27 @@ extern fn init_with_winit(this: &Object, _sel: Sel, state: *mut c_void) -> id {
} }
} }
extern fn draw_rect(this: &Object, _sel: Sel, rect: NSRect) {
unsafe {
let state_ptr: *mut c_void = *this.get_ivar("winitState");
let state = &mut *(state_ptr as *mut ViewState);
if let Some(shared) = state.shared.upgrade() {
let window_event = Event::WindowEvent {
window_id: WindowId(get_window_id(state.window)),
event: WindowEvent::Refresh,
};
shared.pending_events
.lock()
.unwrap()
.push_back(window_event);
}
let superclass = util::superclass(this);
let () = msg_send![super(this, superclass), drawRect:rect];
}
}
extern fn has_marked_text(this: &Object, _sel: Sel) -> BOOL { extern fn has_marked_text(this: &Object, _sel: Sel) -> BOOL {
//println!("hasMarkedText"); //println!("hasMarkedText");
unsafe { unsafe {