diff options
| author | Chong Yidong | 2010-01-06 09:41:59 -0700 |
|---|---|---|
| committer | Chong Yidong | 2010-01-06 09:41:59 -0700 |
| commit | 474217c83c8a8e07a996ff621ea59f4f472dc340 (patch) | |
| tree | cb712ffbb1a643d78dd7253af1bb38a2f2542860 | |
| parent | 4f6fc2522762546ef55e4769863a31afc068756c (diff) | |
| download | emacs-474217c83c8a8e07a996ff621ea59f4f472dc340.tar.gz emacs-474217c83c8a8e07a996ff621ea59f4f472dc340.zip | |
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).
| -rw-r--r-- | src/ChangeLog | 6 | ||||
| -rw-r--r-- | src/nsfns.m | 50 |
2 files changed, 33 insertions, 23 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 131abcb9f96..08a02194ae6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | 2010-01-06 David Reitter <david.reitter@gmail.com> | ||
| 2 | |||
| 3 | * nsfns.m (ns_get_screen): Rewrite, returning NULL for non-NS. | ||
| 4 | (Fns_display_usable_bounds): Rewrite, computing bounds properly | ||
| 5 | (Bug#3233). | ||
| 6 | |||
| 1 | 2010-01-06 Jan Djärv <jan.h.d@swipnet.se> | 7 | 2010-01-06 Jan Djärv <jan.h.d@swipnet.se> |
| 2 | 8 | ||
| 3 | * xterm.c (x_clear_frame): Queue draw for scroll bars. | 9 | * xterm.c (x_clear_frame): Queue draw for scroll bars. |
diff --git a/src/nsfns.m b/src/nsfns.m index 642ff794c05..08564c7216c 100644 --- a/src/nsfns.m +++ b/src/nsfns.m | |||
| @@ -206,30 +206,28 @@ ns_get_window (Lisp_Object maybeFrame) | |||
| 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) | ||
| 220 | f = dpyinfo->x_highlight_frame; | ||
| 221 | if (!f) | ||
| 222 | return 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 | } | 227 | } |
| 228 | |||
| 229 | return ((f && FRAME_NS_P (f)) ? [[FRAME_NS_VIEW (f) window] screen] | ||
| 230 | : NULL); | ||
| 233 | } | 231 | } |
| 234 | 232 | ||
| 235 | 233 | ||
| @@ -2325,15 +2323,21 @@ that stands for the selected frame's 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; |
| 2333 | |||
| 2334 | vScreen = [screen visibleFrame]; | ||
| 2334 | 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 | } |