views:

426

answers:

4

I use CGWindowListCopyWindowInfo to get a list of all windows. It gives me the co-ordinates of each window based upon the origin being the top-left of the screen.

If I use NSWindow's setFrame method, the co-ordinates on based upon the origin being the bottom-left of the screen.

What's a clean, reliable way to convert from one to the other?

Added: By clean and reliable, I mean, something sure to work regardless whether the user has multiple screens or is using Spaces. I figure there must be a known idiom using library APIs.

A: 

Can you just do some math?

Adjx = Width - x

Adjy = Height- y

Ian Jacobs
How does he get the screen dimensions? What if there are more screens?
zoul
+3  A: 

Math is quite reliable :-)

yFromBottom = screenHeight - windowHeight - yFromTop

Main screen height is

[[[NSScreen screens] objectAtIndex:0] frame].size.height
Ilya Birman
Note: It seems that window coordinates are always relative to the main screen (not to your window's screen property)
Daniel Furrer
+2  A: 

Try something like this (from here):

NSRect boundsInWindow = [myView convertRect:[myView bounds] toView:nil];
NSRect visibleRectInWindow = [myView convertRect:[myView visibleRect] toView:nil];

// Flip Y to convert NSWindow coordinates to top-left-based window coordinates.
float borderViewHeight = [[myView window] frame].size.height;
boundsInWindow.origin.y = borderViewHeight - NSMaxY(boundsInWindow);
visibleRectInWindow.origin.y = borderViewHeight - NSMaxY(visibleRectInWindow);
Naaff
+3  A: 

I would suggest using an NSAffineTransform. If you draw with respect to the default origin and then apply a transform to the view, you can essentially flip things around in one fell swoop.

Mike Caron