changeset 8595:dee5d60257e4

Use Carbon framework to determine ScreenSize on Mac.
author Thomas Treichl <Thomas.Treichl@gmx.net>
date Mon, 26 Jan 2009 23:07:09 -0500
parents 756b0ba61350
children 8833c0b18eb2
files ChangeLog aclocal.m4 configure.in src/ChangeLog src/display.cc
diffstat 5 files changed, 54 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Jan 26 22:43:29 2009 -0500
+++ b/ChangeLog	Mon Jan 26 23:07:09 2009 -0500
@@ -1,7 +1,12 @@
+2009-01-26  Thomas Treichl  <Thomas.Treichl@gmx.net>
+
+	* aclocal.m4 (OCTAVE_HAVE_FRAMEWORK): New macro.
+	* configure.in: Use it.
+
 2009-01-22  John W. Eaton  <jwe@octave.org>
 
 	* configure.in (AH_BOTTOM): Define OCTAVE_USE_OS_X_API if
-	__APPLE__ and __MACK__ are defined.
+	__APPLE__ and __MACH__ are defined.
 
 2009-01-22  Jaroslav Hajek  <highegg@gmail.com>
 
--- a/aclocal.m4	Mon Jan 26 22:43:29 2009 -0500
+++ b/aclocal.m4	Mon Jan 26 23:07:09 2009 -0500
@@ -1270,4 +1270,29 @@
  AC_DEFINE(HAVE_FAST_INT_OPS,1,[Define if signed integers use two's complement])],
 [AC_MSG_RESULT([no])])
 AC_LANG_POP(C++)])
-
+dnl
+dnl Check to see if the compiler and the linker can handle the flags
+dnl "-framework $1" for the given prologue $2 and the given body $3
+dnl of a source file.  Arguments 2 and 3 optionally can also be empty.
+dnl If this test is dnl successful then perform $4, otherwise do $5.
+dnl
+dnl OCTAVE_HAVE_FRAMEWORK
+AC_DEFUN(OCTAVE_HAVE_FRAMEWORK, [
+  ac_safe=`echo "$1" | sed 'y%./+-:=%__p___%'`
+  AC_MSG_CHECKING(whether ${LD-ld} accepts -framework $1)
+  AC_CACHE_VAL(octave_cv_framework_$ac_safe, [
+    XLDFLAGS="$LDFLAGS"
+    LDFLAGS="$LDFLAGS -framework $1"
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], [$3])],
+      eval "octave_cv_framework_$ac_safe=yes",
+      eval "octave_cv_framework_$ac_safe=no")
+    LDFLAGS="$XLDFLAGS"
+  ])
+  if eval "test \"`echo '$octave_cv_framework_'$ac_safe`\" = yes"; then
+    AC_MSG_RESULT(yes)
+    [$4]
+  else
+    AC_MSG_RESULT(no)
+    [$5]
+  fi
+])
--- a/configure.in	Mon Jan 26 22:43:29 2009 -0500
+++ b/configure.in	Mon Jan 26 23:07:09 2009 -0500
@@ -270,6 +270,15 @@
   AC_SUBST(X11_LIBS)
 fi
 
+### On MacOSX system the Carbon framework is used to determine ScreenSize
+OCTAVE_HAVE_FRAMEWORK(Carbon, [#include <Carbon/Carbon.h>], [CGMainDisplayID ()],
+  [have_carbon="yes"], [have_carbon="no"])
+if test $have_carbon = "yes"; then
+  AC_DEFINE(HAVE_FRAMEWORK_CARBON, 1, [Define if framework CARBON is available.])
+  LDFLAGS="$LDFLAGS -Wl,-framework -Wl,Carbon"
+  AC_MSG_NOTICE([adding -Wl,-framework -Wl,Carbon to LDFLAGS])
+fi
+
 ### On Intel systems with gcc, we may need to compile with -mieee-fp
 ### and -ffloat-store to get full support for IEEE floating point.
 ###
--- a/src/ChangeLog	Mon Jan 26 22:43:29 2009 -0500
+++ b/src/ChangeLog	Mon Jan 26 23:07:09 2009 -0500
@@ -1,3 +1,8 @@
+2009-01-26  Thomas Treichl  <Thomas.Treichl@gmx.net>
+
+	* display.cc (display_info::init): Use double instead of CGFloat.
+	Use HAVE_FRAMEWORK_CARBON instead of OCTAVE_USE_OS_X_API.
+
 2009-01-26  John W. Eaton  <jwe@octave.org>
 
 	* load-path.cc (load_path::do_find_fcn): Handle @foo/bar.
--- a/src/display.cc	Mon Jan 26 22:43:29 2009 -0500
+++ b/src/display.cc	Mon Jan 26 23:07:09 2009 -0500
@@ -28,15 +28,12 @@
 
 #if defined (OCTAVE_USE_WINDOWS_API)
 #include <Windows.h>
-#elif defined (OCTAVE_USE_OS_X_API)
-#include <CGDirectDisplay.h>
-#include <CGDisplayConfiguration.h>
+#elif defined (HAVE_FRAMEWORK_CARBON)
+#include <Carbon/Carbon.h>
 #elif defined (HAVE_X_WINDOWS)
 #include <X11/Xlib.h>
 #endif
 
-
-
 #include "display.h"
 #include "error.h"
 
@@ -65,7 +62,7 @@
   else
     warning ("no graphical display found");
 
-#elif defined (OCTAVE_USE_OS_X_API)
+#elif defined (HAVE_FRAMEWORK_CARBON)
 
   CGDirectDisplayID display = CGMainDisplayID ();
 
@@ -78,8 +75,11 @@
 
       CGSize sz_mm = CGDisplayScreenSize (display);
 
-      CGFloat ht_mm = sz_mm.height;
-      CGFloat wd_mm = sz_mm.width;
+      // On modern Mac systems (>= 10.5) CGSize is a struct keeping 2
+      // CGFloat values, but the CGFloat typedef is not present on
+      // older systems, so use double instead.
+      double ht_mm = sz_mm.height;
+      double wd_mm = sz_mm.width;
 
       rx = wd * 25.4 / wd_mm;
       ry = ht * 25.4 / ht_mm;