subclass windows in macos so they can be made resizable even with no decorations (#408)

* make windows without decorations resizable and movable in macos

fixes #368

The subclassing logic was copied from servo's fork of glutin:
63026a0f4c/src/api/cocoa/mod.rs (L418)

* remove `isMovableByWindowBackground` and `mouseDownCanMoveWindow`

* revert example changes

* remove resizable mask from decoration: false

* avoid duplicate class declarations

* update changelog

* fix changelog

* changelog whitespace
This commit is contained in:
Joe Moon 2018-04-02 16:12:38 -07:00 committed by Francesca Frangipane
parent 0b922ad9c0
commit be6d2ed3b9
2 changed files with 19 additions and 5 deletions

View file

@ -1,5 +1,7 @@
# Unreleased # Unreleased
- Added subclass to macos windows so they can be made resizable even with no decorations.
# Version 0.11.3 (2018-03-28) # Version 0.11.3 (2018-03-28)
- Added `set_min_dimensions` and `set_max_dimensions` methods to `Window`, and implemented on Windows, X11, Wayland, and OSX. - Added `set_min_dimensions` and `set_max_dimensions` methods to `Window`, and implemented on Windows, X11, Wayland, and OSX.

View file

@ -414,10 +414,7 @@ impl Window2 {
NSWindowStyleMask::NSTitledWindowMask NSWindowStyleMask::NSTitledWindowMask
} else if !attrs.decorations { } else if !attrs.decorations {
// Window2 without a titlebar // Window2 without a titlebar
NSWindowStyleMask::NSClosableWindowMask | NSWindowStyleMask::NSBorderlessWindowMask
NSWindowStyleMask::NSMiniaturizableWindowMask |
NSWindowStyleMask::NSResizableWindowMask |
NSWindowStyleMask::NSFullSizeContentViewWindowMask
} else if pl_attrs.titlebar_hidden { } else if pl_attrs.titlebar_hidden {
NSWindowStyleMask::NSBorderlessWindowMask | NSWindowStyleMask::NSBorderlessWindowMask |
NSWindowStyleMask::NSResizableWindowMask NSWindowStyleMask::NSResizableWindowMask
@ -442,7 +439,18 @@ impl Window2 {
NSWindowStyleMask::NSTitledWindowMask NSWindowStyleMask::NSTitledWindowMask
}; };
let window = IdRef::new(NSWindow::alloc(nil).initWithContentRect_styleMask_backing_defer_( let winit_window = Class::get("WinitWindow").unwrap_or_else(|| {
let window_superclass = Class::get("NSWindow").unwrap();
let mut decl = ClassDecl::new("WinitWindow", window_superclass).unwrap();
decl.add_method(sel!(canBecomeMainWindow), yes as extern fn(&Object, Sel) -> BOOL);
decl.add_method(sel!(canBecomeKeyWindow), yes as extern fn(&Object, Sel) -> BOOL);
decl.register();
Class::get("WinitWindow").unwrap()
});
let window: id = msg_send![winit_window, alloc];
let window = IdRef::new(window.initWithContentRect_styleMask_backing_defer_(
frame, frame,
masks, masks,
appkit::NSBackingStoreBuffered, appkit::NSBackingStoreBuffered,
@ -796,3 +804,7 @@ impl Clone for IdRef {
IdRef(self.0) IdRef(self.0)
} }
} }
extern fn yes(_: &Object, _: Sel) -> BOOL {
YES
}