And implemented borderless windows on OS X.

This commit is contained in:
Pietro Gagliardi 2016-06-16 11:46:58 -04:00
parent 256a452fbd
commit dd2ee50710
2 changed files with 32 additions and 1 deletions

View File

@ -21,6 +21,7 @@ This README is being written.<br>
* **16 June 2016**
* Added `uiWindowContentSize()`, `uiWindowSetContentSize()`, and `uiWindowOnContentSizeChanged()` methods for manipulating uiWindow content sizes. Note the use of "content size"; the size you work with does NOT include window decorations (titlebars, menus, etc.).
* Added `uiWindowFullscreen()` and `uiWindowSetFullscreen()` to allow making fullscreen uiWindows, taking advantage of OS facilities for fullscreen and without changing the screen resolution (!).
* Added `uiWindowBorderless()` and `uiWindowSetBorderless()` for allowing borderless uiWindows.
* **15 June 2016**
* Added `uiFormDelete()`; thanks to @emersion.

View File

@ -1,6 +1,8 @@
// 15 august 2015
#import "uipriv_darwin.h"
#define defaultStyleMask (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)
struct uiWindow {
uiDarwinControl c;
NSWindow *window;
@ -16,6 +18,7 @@ struct uiWindow {
void *onContentSizeChangedData;
BOOL suppressSizeChanged;
int fullscreen;
int borderless;
};
@interface windowDelegateClass : NSObject<NSWindowDelegate> {
@ -323,9 +326,13 @@ void uiWindowSetFullscreen(uiWindow *w, int fullscreen)
if (!w->fullscreen && !fullscreen)
return;
w->fullscreen = fullscreen;
if (w->fullscreen && w->borderless) // borderless doesn't play nice with fullscreen; don't toggle while borderless
return;
w->suppressSizeChanged = YES;
[w->window toggleFullScreen:w->window];
w->suppressSizeChanged = NO;
if (!w->fullscreen && w->borderless) // borderless doesn't play nice with fullscreen; restore borderless after removing
[w->window setStyleMask:NSBorderlessWindowMask];
}
void uiWindowOnContentSizeChanged(uiWindow *w, void (*f)(uiWindow *, void *), void *data)
@ -340,6 +347,29 @@ void uiWindowOnClosing(uiWindow *w, int (*f)(uiWindow *, void *), void *data)
w->onClosingData = data;
}
int uiWindowBorderless(uiWindow *w)
{
return w->borderless;
}
void uiWindowSetBorderless(uiWindow *w, int borderless)
{
w->borderless = borderless;
if (w->borderless) {
// borderless doesn't play nice with fullscreen; wait for later
if (!w->fullscreen)
[w->window setStyleMask:NSBorderlessWindowMask];
} else {
[w->window setStyleMask:defaultStyleMask];
// borderless doesn't play nice with fullscreen; restore state
if (w->fullscreen) {
w->suppressSizeChanged = YES;
[w->window toggleFullScreen:w->window];
w->suppressSizeChanged = NO;
}
}
}
void uiWindowSetChild(uiWindow *w, uiControl *child)
{
NSView *childView;
@ -389,7 +419,7 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
uiDarwinNewControl(uiWindow, w);
w->window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, (CGFloat) width, (CGFloat) height)
styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)
styleMask:defaultStyleMask
backing:NSBackingStoreBuffered
defer:YES];
[w->window setTitle:toNSString(title)];