Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I convert Cocoa co-ords from top left == origin to bottom left == origin

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.

like image 856
Steve McLeod Avatar asked May 12 '09 13:05

Steve McLeod


3 Answers

Math is quite reliable :-)

yFromBottom = screenHeight - windowHeight - yFromTop

Main screen height is

[[[NSScreen screens] objectAtIndex:0] frame].size.height
like image 172
Ilya Birman Avatar answered Nov 19 '22 00:11

Ilya Birman


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.

like image 44
Mike Caron Avatar answered Nov 18 '22 23:11

Mike Caron


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);
like image 2
Naaff Avatar answered Nov 18 '22 22:11

Naaff