- /* NS coordinate system is upside-down.
- Transform to screen-specific coordinates. */
- return list4 (make_number ((int) vScreen.origin.x),
- make_number ((int) [screen frame].size.height
- - vScreen.size.height - vScreen.origin.y),
- make_number ((int) vScreen.size.width),
- make_number ((int) vScreen.size.height));
+ for (i = 0; i < [screens count]; ++i)
+ {
+ NSScreen *s = [screens objectAtIndex:i];
+ struct MonitorInfo *m = &monitors[i];
+ NSRect fr = [s frame];
+ NSRect vfr = [s visibleFrame];
+ short y, vy;
+
+#ifdef NS_IMPL_COCOA
+ NSDictionary *dict = [s deviceDescription];
+ NSNumber *nid = [dict objectForKey:@"NSScreenNumber"];
+ CGDirectDisplayID did = [nid unsignedIntValue];
+#endif
+ if (i == 0)
+ {
+ primary_display_height = fr.size.height;
+ y = (short) fr.origin.y;
+ vy = (short) vfr.origin.y;
+ }
+ else
+ {
+ // Flip y coordinate as NS has y starting from the bottom.
+ y = (short) (primary_display_height - fr.size.height - fr.origin.y);
+ vy = (short) (primary_display_height -
+ vfr.size.height - vfr.origin.y);
+ }
+
+ m->geom.x = (short) fr.origin.x;
+ m->geom.y = y;
+ m->geom.width = (unsigned short) fr.size.width;
+ m->geom.height = (unsigned short) fr.size.height;
+
+ m->work.x = (short) vfr.origin.x;
+ // y is flipped on NS, so vy - y are pixels missing at the bottom,
+ // and fr.size.height - vfr.size.height are pixels missing in total.
+ // Pixels missing at top are
+ // fr.size.height - vfr.size.height - vy + y.
+ // work.y is then pixels missing at top + y.
+ m->work.y = (short) (fr.size.height - vfr.size.height) - vy + y + y;
+ m->work.width = (unsigned short) vfr.size.width;
+ m->work.height = (unsigned short) vfr.size.height;
+
+#ifdef NS_IMPL_COCOA
+ m->name = ns_screen_name (did);
+
+ {
+ CGSize mms = CGDisplayScreenSize (did);
+ m->mm_width = (int) mms.width;
+ m->mm_height = (int) mms.height;
+ }
+
+#else
+ // Assume 92 dpi as x-display-mm-height/x-display-mm-width does.
+ m->mm_width = (int) (25.4 * fr.size.width / 92.0);
+ m->mm_height = (int) (25.4 * fr.size.height / 92.0);
+#endif
+ }
+
+ // Primary monitor is always first for NS.
+ attributes_list = ns_make_monitor_attribute_list (monitors, n_monitors,
+ 0, "NS");
+
+ free_monitors (monitors, n_monitors);
+ return attributes_list;