aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChong Yidong2010-01-06 09:41:59 -0700
committerChong Yidong2010-01-06 09:41:59 -0700
commit474217c83c8a8e07a996ff621ea59f4f472dc340 (patch)
treecb712ffbb1a643d78dd7253af1bb38a2f2542860
parent4f6fc2522762546ef55e4769863a31afc068756c (diff)
downloademacs-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/ChangeLog6
-rw-r--r--src/nsfns.m50
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 @@
12010-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
12010-01-06 Jan Djärv <jan.h.d@swipnet.se> 72010-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)
206static NSScreen * 206static NSScreen *
207ns_get_screen (Lisp_Object screen) 207ns_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}