# HG changeset patch # User Chong Yidong # Date 1262796119 25200 # Node ID 16b52378e95a2b93171820a12d99e6375bdace44 # Parent 06b47f5710866f1133a7d999a81e7c8b353beb84 NS fixes for Bug#3233. * nsfns.m (ns_get_screen): Rewrite, returning NULL for non-NS. (Fns_display_usable_bounds): Rewrite, computing bounds properly (Bug#3233). diff -r 06b47f571086 -r 16b52378e95a src/ChangeLog --- a/src/ChangeLog Wed Jan 06 16:57:43 2010 +0100 +++ b/src/ChangeLog Wed Jan 06 09:41:59 2010 -0700 @@ -1,3 +1,9 @@ +2010-01-06 David Reitter + + * nsfns.m (ns_get_screen): Rewrite, returning NULL for non-NS. + (Fns_display_usable_bounds): Rewrite, computing bounds properly + (Bug#3233). + 2010-01-06 Jan Djärv * xterm.c (x_clear_frame): Queue draw for scroll bars. diff -r 06b47f571086 -r 16b52378e95a src/nsfns.m --- a/src/nsfns.m Wed Jan 06 16:57:43 2010 +0100 +++ b/src/nsfns.m Wed Jan 06 09:41:59 2010 -0700 @@ -206,30 +206,28 @@ static NSScreen * ns_get_screen (Lisp_Object screen) { - struct terminal *terminal = get_terminal (screen, 1); + struct frame *f; + struct terminal *terminal; + + if (EQ (Qt, screen)) /* not documented */ + return [NSScreen mainScreen]; + + terminal = get_terminal (screen, 1); if (terminal->type != output_ns) - // Not sure if this special case for nil is needed. It does seem to be - // important in xfns.c for the make-frame call in frame-initialize, - // so let's keep it here for now. - return (NILP (screen) ? [NSScreen mainScreen] : NULL); + return NULL; + + if (NILP (screen)) + f = SELECTED_FRAME (); + else if (FRAMEP (screen)) + f = XFRAME (screen); else { struct ns_display_info *dpyinfo = terminal->display_info.ns; - struct frame *f = dpyinfo->x_focus_frame; - if (!f) - f = dpyinfo->x_highlight_frame; - if (!f) - return NULL; - else - { - id window = nil; - Lisp_Object frame; - eassert (FRAME_NS_P (f)); - XSETFRAME (frame, f); - window = ns_get_window (frame); - return window ? [window screen] : NULL; - } + f = (dpyinfo->x_focus_frame || dpyinfo->x_highlight_frame); } + + return ((f && FRAME_NS_P (f)) ? [[FRAME_NS_VIEW (f) window] screen] + : NULL); } @@ -2325,15 +2323,21 @@ Lisp_Object display; { int top; + NSScreen *screen; NSRect vScreen; check_ns (); - vScreen = [ns_get_screen (display) visibleFrame]; - top = vScreen.origin.y == 0.0 ? - (int) [ns_get_screen (display) frame].size.height - vScreen.size.height : 0; - + screen = ns_get_screen (display); + if (!screen) + return Qnil; + + vScreen = [screen visibleFrame]; + + /* NS coordinate system is upside-down. + Transform to screen-specific coordinates. */ return list4 (make_number ((int) vScreen.origin.x), - make_number (top), + 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)); }