-
Notifications
You must be signed in to change notification settings - Fork 33
Stop using NSFullSizeContentViewWindowMask
to get borderless windows,
#68
Conversation
This is way outside any of my limited Cocoa experience, sadly. @mstange do you have any feedback on this? |
Let me see if I can actually fix the full screen issue since it's bugging me. |
because that disables the swap interval. This hack is very simple but a little evil. We get the superview of the content view, which is the `NSThemeFrame`, and install an OpenGL context into it. `NSThemeFrame` is a private class, but we never speak its name, we get to it with public APIs, and we only call public `NSView` APIs on it, so this seems OK in terms of being supported by Apple going forward. Additionally, we remove the standard window buttons so that they disappear and the user can't click them. This can also be done using public APIs. The reason for using this hack as opposed to `NSFullSizeContentViewWindowMask` is that the latter forces the window to be Core Animation-backed, which results in us rendering to an off screen surface. Not only does this inject another compositor into the system, but it also results in us rendering to an off-screen surface, disabling the swap interval. This depends on a `cocoa-rs` upgrade to add a binding to the `-[NSView superview]` method. Note that the top edge of the window is not rounded, although the shadow is. Applications that wish to use this mode will need to round the top edge themselves if they wish. (This is how Cocoa internally works: rounding is done by the app, not the window manager.) This should fix servo/servo#9431.
7278f83
to
5731ad2
Compare
OK, seems to be fixed now. r? @mstange |
How? Using border-radius doesn't appear to work.
How did you manage to go fullscreen? |
I'm not surprised that border radius doesn't work, though it should. I think it's straightforwardly fixable in WR. As for full screen, that was an older version of the patch. We should be able to go full screen by calling the Cocoa API to do so, which we can expose to content JS. |
I'll file followup issues once this lands. |
Nice and simple! I like it. |
@bors-servo: r+ (assuming mstange is a qualified reviewer here—if someone else wants to drop in feel free) |
📌 Commit 5731ad2 has been approved by |
Stop using `NSFullSizeContentViewWindowMask` to get borderless windows, because that disables the swap interval. This hack is very simple but a little evil. We get the superview of the content view, which is the `NSThemeFrame`, and install an OpenGL context into it. `NSThemeFrame` is a private class, but we only call public `NSView` APIs on it here, so this seems OK in terms of being supported by Apple going forward. The reason for using this hack as opposed to `NSFullSizeContentViewWindowMask` is that the latter forces the window to be Core Animation-backed, which results in us rendering to an off screen surface. Not only does this inject another compositor into the system, but it also results in us rendering to an off-screen surface, disabling the swap interval. This depends on a `cocoa-rs` upgrade to add a binding to the `-[NSView superview]` method. Known issues: * The traffic light buttons are not drawn but still function if you click on them. This can be worked around in browser.html. * The top border is not rounded, although the shadow properly displays. This should be able to be worked around in browser.html. * The title bar reappears if you go to full screen and then go back. This is the most serious issue, but I suspect it'll be fixable and it's better than what we have right now. This should fix servo/servo#9431. r? @jdm <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.svg" height="40" alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/glutin/68) <!-- Reviewable:end -->
☀️ Test successful - travis |
because that disables the swap interval.
This hack is very simple but a little evil. We get the superview of the
content view, which is the
NSThemeFrame
, and install an OpenGL contextinto it.
NSThemeFrame
is a private class, but we only call publicNSView
APIs on it here, so this seems OK in terms of being supportedby Apple going forward.
The reason for using this hack as opposed to
NSFullSizeContentViewWindowMask
is that the latter forces the windowto be Core Animation-backed, which results in us rendering to an off
screen surface. Not only does this inject another compositor into the
system, but it also results in us rendering to an off-screen surface,
disabling the swap interval.
This depends on a
cocoa-rs
upgrade to add a binding to the-[NSView superview]
method.Known issues:
click on them. This can be worked around in browser.html.
This should be able to be worked around in browser.html.
This is the most serious issue, but I suspect it'll be fixable and
it's better than what we have right now.
This should fix servo/servo#9431.
r? @jdm