Why is the contentRect
of my NSWindow
ignored?
When creating an NSWindow
,
you can pass a contentRect
to set its size and position.
But for me, the size and position were being ignored.
The culprit was a call to setFrameAutosaveName
.
Here I describe what setFrameAutosaveName
does,
since it has no documentation.
Create a new macOS app in Xcode,
and it will give you some Swift like this:
var window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
}
The window it gives you can be resized and repositioned with the mouse.
But try playing around with the contentRect: NSRect(x: 0, y: 0, width: 480, height: 300)
,
and you’ll find that the values are stubbornly ignored!
There are a couple of reasons for this.
The first reason is the call to window.center()
.
This changes the position of the window to be centered on the display,
so your earlier x
and y
values are effectively ignored.
But removing window.center()
still won’t fix the issue.
The second, more interesting reason is the call to
window.setFrameAutosaveName("Main Window")
.
There are no docs for setFrameAutosaveName
,
but here’s what it does.
When the user moves or resizes a window that has an autosave name,
the size and position are saved to the user defaults under that autosave name.
Then when a window is created with an autosave name,
if a size and position have been saved to user defaults,
these preferences override the contentRect
passed in the constructor.
Here you can see the defaults after I moved and resized my "Main Window"
window:
$ defaults read baz.ContentRectTest
{
"NSWindow Frame Main Window" = "565 282 680 600 0 0 1680 1027 ";
}
The format here seems to be:
"NSWindow Frame \(autosaveName)" = "\(window.frame.x) \(window.frame.y) \(window.frame.width) \(window.frame.height) \(screen.x) \(screen.y) \(screen.width) \(screen.height - menuBar) ";
I don’t know why it also saves the details of the screen.
More by Jim
What does the dot do in JavaScript?
foo.bar
, foo.bar()
, or foo.bar = baz
- what do they mean? A deep dive into prototypical inheritance and getters/setters. 2020-11-01
Smear phishing: a new Android vulnerability
Trick Android to display an SMS as coming from any contact. Convincing phishing vuln, but still unpatched. 2020-08-06
A probabilistic pub quiz for nerds
A “true or false” quiz where you respond with your confidence level, and the optimal strategy is to report your true belief. 2020-04-26
Time is running out to catch COVID-19
Simulation shows it’s rational to deliberately infect yourself with COVID-19 early on to get treatment, but after healthcare capacity is exceeded, it’s better to avoid infection. Includes interactive parameters and visualizations. 2020-03-14
The inception bar: a new phishing method
A new phishing technique that displays a fake URL bar in Chrome for mobile. A key innovation is the “scroll jail” that traps the user in a fake browser. 2019-04-27
The hacker hype cycle
I got started with simple web development, but because enamored with increasingly esoteric programming concepts, leading to a “trough of hipster technologies” before returning to more productive work. 2019-03-23
Project C-43: the lost origins of asymmetric crypto
Bob invents asymmetric cryptography by playing loud white noise to obscure Alice’s message, which he can cancel out but an eavesdropper cannot. This idea, published in 1944 by Walter Koenig Jr., is the forgotten origin of asymmetric crypto. 2019-02-16
How Hacker News stays interesting
Hacker News buried my post on conspiracy theories in my family due to overheated discussion, not censorship. Moderation keeps the site focused on interesting technical content. 2019-01-26
My parents are Flat-Earthers
2019-01-20
The dots do matter: how to scam a Gmail user
Gmail’s “dots don’t matter” feature lets scammers create an account on, say, Netflix, with your email address but different dots. Results in convincing phishing emails. 2018-04-07
The sorry state of OpenSSL usability
OpenSSL’s inadequate documentation, confusing key formats, and deprecated interfaces make it difficult to use, despite its importance. 2017-12-02
I hate telephones
I hate telephones. Some rational reasons: lack of authentication, no spam filtering, forced synchronous communication. But also just a visceral fear. 2017-11-08
The Three Ts of Time, Thought and Typing: measuring cost on the web
Businesses often tout “free” services, but the real costs come in terms of time, thought, and typing required from users. Reducing these “Three Ts” is key to improving sign-up flows and increasing conversions. 2017-10-26
Granddad died today
Granddad died. The unspoken practice of death-by-dehydration in the NHS. The Liverpool Care Pathway. Assisted dying in the UK. The importance of planning in end-of-life care. 2017-05-19
How do I call a program in C, setting up standard pipes?
A C function to create a new process, set up its standard input/output/error pipes, and return a struct containing the process ID and pipe file descriptors. 2017-02-17
Your syntax highlighter is wrong
2014-05-11
Tagged #programming. All content copyright James Fisher 2020. This post is not associated with my employer. Found an error? Edit this page.