GNU Octave  4.0.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
cdisplay.c
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 2009-2014 John W. Eaton
4 
5 This file is part of Octave.
6 
7 Octave is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <http://www.gnu.org/licenses/>.
20 
21 */
22 
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26 
27 #include <stdlib.h>
28 
29 #if defined (OCTAVE_USE_WINDOWS_API)
30 #include <windows.h>
31 #elif defined (HAVE_FRAMEWORK_CARBON)
32 #include <Carbon/Carbon.h>
33 #elif defined (HAVE_X_WINDOWS)
34 #include <X11/Xlib.h>
35 #endif
36 
37 #include "cdisplay.h"
38 
39 const char *
40 octave_get_display_info (int *ht, int *wd, int *dp, double *rx, double *ry,
41  int *dpy_avail)
42 {
43  const char *msg = 0;
44 
45  *dpy_avail = 0;
46 
47 #if defined (OCTAVE_USE_WINDOWS_API)
48 
49  HDC hdc = GetDC (0);
50 
51  if (hdc)
52  {
53  *dp = GetDeviceCaps (hdc, BITSPIXEL);
54 
55  *ht = GetDeviceCaps (hdc, VERTRES);
56  *wd = GetDeviceCaps (hdc, HORZRES);
57 
58  double ht_mm = GetDeviceCaps (hdc, VERTSIZE);
59  double wd_mm = GetDeviceCaps (hdc, HORZSIZE);
60 
61  *rx = *wd * 25.4 / wd_mm;
62  *ry = *ht * 25.4 / ht_mm;
63 
64  *dpy_avail = 1;
65  }
66  else
67  msg = "no graphical display found";
68 
69 #elif defined (HAVE_FRAMEWORK_CARBON)
70 
71  CGDirectDisplayID display = CGMainDisplayID ();
72 
73  if (display)
74  {
75 #if defined (HAVE_CARBON_CGDISPLAYBITSPERPIXEL)
76 
77  *dp = CGDisplayBitsPerPixel (display);
78 
79 #else
80 
81  /* FIXME: This will only work for MacOS > 10.5. For earlier versions
82  this code is not needed (use CGDisplayBitsPerPixel instead). */
83 
84  CGDisplayModeRef mode = CGDisplayCopyDisplayMode (display);
85  CFStringRef pixelEncoding = CGDisplayModeCopyPixelEncoding (mode);
86 
87  if (CFStringCompare (pixelEncoding, CFSTR (IO32BitDirectPixels), 0) == 0)
88  *dp = 32;
89  else if (CFStringCompare (pixelEncoding,
90  CFSTR (IO16BitDirectPixels), 0) == 0)
91  *dp = 16;
92  else
93  *dp = 8;
94 
95 #endif
96 
97  *ht = CGDisplayPixelsHigh (display);
98  *wd = CGDisplayPixelsWide (display);
99 
100  CGSize sz_mm = CGDisplayScreenSize (display);
101 
102  /* For MacOS >= 10.6, CGSize is a struct keeping 2 CGFloat
103  values, but the CGFloat typedef is not present on older
104  systems, so use double instead. */
105 
106  double ht_mm = sz_mm.height;
107  double wd_mm = sz_mm.width;
108 
109  *rx = *wd * 25.4 / wd_mm;
110  *ry = *ht * 25.4 / ht_mm;
111 
112  *dpy_avail = 1;
113  }
114  else
115  msg = "no graphical display found";
116 
117 #elif defined (HAVE_X_WINDOWS)
118 
119  const char *display_name = getenv ("DISPLAY");
120 
121  if (display_name && *display_name)
122  {
123  Display *display = XOpenDisplay (display_name);
124 
125  if (display)
126  {
127  Screen *screen = DefaultScreenOfDisplay (display);
128 
129  if (screen)
130  {
131  *dp = DefaultDepthOfScreen (screen);
132 
133  *ht = HeightOfScreen (screen);
134  *wd = WidthOfScreen (screen);
135 
136  int screen_number = XScreenNumberOfScreen (screen);
137 
138  double ht_mm = DisplayHeightMM (display, screen_number);
139  double wd_mm = DisplayWidthMM (display, screen_number);
140 
141  *rx = *wd * 25.4 / wd_mm;
142  *ry = *ht * 25.4 / ht_mm;
143  }
144  else
145  msg = "X11 display has no default screen";
146 
147  XCloseDisplay (display);
148 
149  *dpy_avail = 1;
150  }
151  else
152  msg = "unable to open X11 DISPLAY";
153  }
154  else
155  msg = "X11 DISPLAY environment variable not set";
156 
157 #else
158 
159  msg = "no graphical display found";
160 
161 #endif
162 
163  return msg;
164 }
An image of characters with associated attributes.
Definition: Screen.h:75
const char * octave_get_display_info(int *ht, int *wd, int *dp, double *rx, double *ry, int *dpy_avail)
Definition: cdisplay.c:40