summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2010-01-06 20:42:27 +0100
committerJan Djärv <jan.h.d@swipnet.se>2010-01-06 20:42:27 +0100
commit32d59dc3dbdc16c25f1f78659d3167c8f9670868 (patch)
treec92352daa9417590a0c6a014d42c0f979b79f23f
parentb7f8e4f578f593257542d7d05daf7f634e0bdecb (diff)
parent474217c83c8a8e07a996ff621ea59f4f472dc340 (diff)
downloademacs-32d59dc3dbdc16c25f1f78659d3167c8f9670868.tar.gz
Merge from trunk
-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 795f72b21bd..b7ecf6b7297 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-06 David Reitter <david.reitter@gmail.com>
+
+ * 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 <jan.h.d@swipnet.se>
* font.c (font_open_entity): Enable chache and call cached_font_ok
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)
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 @@ that stands for the selected frame's display. */)
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));
}