comparison src/nsfns.m @ 108393:c80b29e796ea

Merge from mainline.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Fri, 08 Jan 2010 14:59:17 +0000
parents 16b52378e95a
children 1d1d5d9bd884
comparison
equal deleted inserted replaced
106747:47e4680680fe 108393:c80b29e796ea
204 204
205 205
206 static NSScreen * 206 static NSScreen *
207 ns_get_screen (Lisp_Object screen) 207 ns_get_screen (Lisp_Object screen)
208 { 208 {
209 struct terminal *terminal = get_terminal (screen, 1); 209 struct frame *f;
210 struct terminal *terminal;
211
212 if (EQ (Qt, screen)) /* not documented */
213 return [NSScreen mainScreen];
214
215 terminal = get_terminal (screen, 1);
210 if (terminal->type != output_ns) 216 if (terminal->type != output_ns)
211 // Not sure if this special case for nil is needed. It does seem to be 217 return NULL;
212 // important in xfns.c for the make-frame call in frame-initialize, 218
213 // so let's keep it here for now. 219 if (NILP (screen))
214 return (NILP (screen) ? [NSScreen mainScreen] : NULL); 220 f = SELECTED_FRAME ();
221 else if (FRAMEP (screen))
222 f = XFRAME (screen);
215 else 223 else
216 { 224 {
217 struct ns_display_info *dpyinfo = terminal->display_info.ns; 225 struct ns_display_info *dpyinfo = terminal->display_info.ns;
218 struct frame *f = dpyinfo->x_focus_frame; 226 f = (dpyinfo->x_focus_frame || dpyinfo->x_highlight_frame);
219 if (!f) 227 }
220 f = dpyinfo->x_highlight_frame; 228
221 if (!f) 229 return ((f && FRAME_NS_P (f)) ? [[FRAME_NS_VIEW (f) window] screen]
222 return NULL; 230 : NULL);
223 else
224 {
225 id window = nil;
226 Lisp_Object frame;
227 eassert (FRAME_NS_P (f));
228 XSETFRAME (frame, f);
229 window = ns_get_window (frame);
230 return window ? [window screen] : NULL;
231 }
232 }
233 } 231 }
234 232
235 233
236 /* Return the X display structure for the display named NAME. 234 /* Return the X display structure for the display named NAME.
237 Open a new connection if necessary. */ 235 Open a new connection if necessary. */
2323 that stands for the selected frame's display. */) 2321 that stands for the selected frame's display. */)
2324 (display) 2322 (display)
2325 Lisp_Object display; 2323 Lisp_Object display;
2326 { 2324 {
2327 int top; 2325 int top;
2326 NSScreen *screen;
2328 NSRect vScreen; 2327 NSRect vScreen;
2329 2328
2330 check_ns (); 2329 check_ns ();
2331 vScreen = [ns_get_screen (display) visibleFrame]; 2330 screen = ns_get_screen (display);
2332 top = vScreen.origin.y == 0.0 ? 2331 if (!screen)
2333 (int) [ns_get_screen (display) frame].size.height - vScreen.size.height : 0; 2332 return Qnil;
2334 2333
2334 vScreen = [screen visibleFrame];
2335
2336 /* NS coordinate system is upside-down.
2337 Transform to screen-specific coordinates. */
2335 return list4 (make_number ((int) vScreen.origin.x), 2338 return list4 (make_number ((int) vScreen.origin.x),
2336 make_number (top), 2339 make_number ((int) [screen frame].size.height
2340 - vScreen.size.height - vScreen.origin.y),
2337 make_number ((int) vScreen.size.width), 2341 make_number ((int) vScreen.size.width),
2338 make_number ((int) vScreen.size.height)); 2342 make_number ((int) vScreen.size.height));
2339 } 2343 }
2340 2344
2341 2345