11

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.

Steve McLeod
  • 51,737
  • 47
  • 128
  • 184

3 Answers3

14

Math is quite reliable :-)

yFromBottom = screenHeight - windowHeight - yFromTop

Main screen height is

[[[NSScreen screens] objectAtIndex:0] frame].size.height
Ilya Birman
  • 9,834
  • 4
  • 27
  • 31
3

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
  • 5,674
  • 4
  • 48
  • 71
2

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
  • 9,213
  • 3
  • 38
  • 43