[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: x-display-pixel-width/height inconsistency
From: |
YAMAMOTO Mitsuharu |
Subject: |
Re: x-display-pixel-width/height inconsistency |
Date: |
Fri, 22 Mar 2013 08:29:55 +0900 |
User-agent: |
Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.8 (Shijō) APEL/10.6 Emacs/22.3 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI) |
>>>>> On Thu, 21 Mar 2013 10:44:29 +0900, YAMAMOTO Mitsuharu <address@hidden>
>>>>> said:
>> Then use
>> w = GetSystemMetrics(SM_CXVIRTUALSCREEN);
>> h = GetSystemMetrics(SM_CYVIRTUALSCREEN);
> Thanks. I tried making a patch using them. Do you happen to know an
> appropriate way to exclude Windows 95 and NT 4 where
> SM_CXVIRTUALSCREEN and SM_CYVIRTUALSCREEN are not available?
Patch updated. I used the condition (w32_major_version == 4 &&
w32_minor_version == 0) to distinguish Windows 95 and NT 4 from the
other versions. Also, changes for the NS port are included.
I'll install it in a few days if no problems found.
YAMAMOTO Mitsuharu
address@hidden
=== modified file 'src/nsfns.m'
*** src/nsfns.m 2013-03-20 09:56:19 +0000
--- src/nsfns.m 2013-03-21 23:16:54 +0000
***************
*** 144,187 ****
}
! /* Let the user specify an Nextstep display with a frame.
! nil stands for the selected frame--or, if that is not an Nextstep frame,
the first Nextstep display on the list. */
static struct ns_display_info *
! check_ns_display_info (Lisp_Object frame)
{
! if (NILP (frame))
{
! struct frame *f = SELECTED_FRAME ();
! if (FRAME_NS_P (f) && FRAME_LIVE_P (f) )
! return FRAME_NS_DISPLAY_INFO (f);
else if (x_display_list != 0)
! return x_display_list;
else
error ("Nextstep windows are not in use or not initialized");
}
! else if (INTEGERP (frame))
{
! struct terminal *t = get_terminal (frame, 1);
if (t->type != output_ns)
! error ("Terminal %"pI"d is not a Nextstep display", XINT (frame));
! return t->display_info.ns;
}
! else if (STRINGP (frame))
! return ns_display_info_for_name (frame);
else
{
! FRAME_PTR f;
!
! CHECK_LIVE_FRAME (frame);
! f = XFRAME (frame);
! if (! FRAME_NS_P (f))
! error ("non-Nextstep frame used");
! return FRAME_NS_DISPLAY_INFO (f);
}
! return NULL; /* shut compiler up */
}
--- 144,188 ----
}
! /* Let the user specify a Nextstep display with a Lisp object.
! OBJECT may be nil, a frame or a terminal object.
! nil stands for the selected frame--or, if that is not a Nextstep frame,
the first Nextstep display on the list. */
+
static struct ns_display_info *
! check_ns_display_info (Lisp_Object object)
{
! struct ns_display_info *dpyinfo = NULL;
!
! if (NILP (object))
{
! struct frame *sf = XFRAME (selected_frame);
!
! if (FRAME_NS_P (sf) && FRAME_LIVE_P (sf))
! dpyinfo = FRAME_NS_DISPLAY_INFO (sf);
else if (x_display_list != 0)
! dpyinfo = x_display_list;
else
error ("Nextstep windows are not in use or not initialized");
}
! else if (TERMINALP (object))
{
! struct terminal *t = get_terminal (object, 1);
if (t->type != output_ns)
! error ("Terminal %"pI"d is not a Nextstep display", XINT (object));
! dpyinfo = t->display_info.ns;
}
! else if (STRINGP (object))
! dpyinfo = ns_display_info_for_name (object);
else
{
! FRAME_PTR f = check_ns_frame (object);
! dpyinfo = FRAME_NS_DISPLAY_INFO (f);
}
!
! return dpyinfo;
}
***************
*** 1699,1727 ****
}
! DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height,
! 0, 1, 0,
! doc: /* Return the height of Nextstep display server DISPLAY, in
millimeters.
! DISPLAY should be a frame, the display name as a string, or a terminal ID.
! If omitted or nil, the selected frame's display is used. */)
! (Lisp_Object display)
{
! check_ns ();
! return make_number ((int)
! ([ns_get_screen (display)
frame].size.height/(92.0/25.4)));
}
! DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width,
! 0, 1, 0,
! doc: /* Return the width of Nextstep display server DISPLAY, in
millimeters.
! DISPLAY should be a frame, the display name as a string, or a terminal ID.
! If omitted or nil, the selected frame's display is used. */)
! (Lisp_Object display)
{
! check_ns ();
! return make_number ((int)
! ([ns_get_screen (display)
frame].size.width/(92.0/25.4)));
}
--- 1700,1728 ----
}
! DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0,
1, 0,
! doc: /* Return the height in millimeters of the Nextstep display
TERMINAL.
! The optional argument TERMINAL specifies which display to ask about.
! TERMINAL should be a terminal object, a frame or a display name (a string).
! If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object terminal)
{
! struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
!
! return make_number ((int) (x_display_pixel_height (dpyinfo) / (92.0/25.4)));
}
! DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1,
0,
! doc: /* Return the width in millimeters of the Nextstep display
TERMINAL.
! The optional argument TERMINAL specifies which display to ask about.
! TERMINAL should be a terminal object, a frame or a display name (a string).
! If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object terminal)
{
! struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
!
! return make_number ((int) (x_display_pixel_width (dpyinfo) / (92.0/25.4)));
}
***************
*** 1751,1766 ****
DEFUN ("x-display-visual-class", Fx_display_visual_class,
Sx_display_visual_class, 0, 1, 0,
! doc: /* Return the visual class of the Nextstep display server DISPLAY.
The value is one of the symbols `static-gray', `gray-scale',
`static-color', `pseudo-color', `true-color', or `direct-color'.
! DISPLAY should be a frame, the display name as a string, or a terminal ID.
! If omitted or nil, the selected frame's display is used. */)
! (Lisp_Object display)
{
! NSWindowDepth depth;
! check_ns ();
! depth = [ns_get_screen (display) depth];
if ( depth == NSBestDepth (NSCalibratedWhiteColorSpace, 2, 2, YES, NULL))
return intern ("static-gray");
--- 1752,1768 ----
DEFUN ("x-display-visual-class", Fx_display_visual_class,
Sx_display_visual_class, 0, 1, 0,
! doc: /* Return the visual class of the Nextstep display TERMINAL.
The value is one of the symbols `static-gray', `gray-scale',
`static-color', `pseudo-color', `true-color', or `direct-color'.
!
! The optional argument TERMINAL specifies which display to ask about.
! TERMINAL should a terminal object, a frame or a display name (a string).
! If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object terminal)
{
! struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
! NSWindowDepth depth = [[[NSScreen screens] objectAtIndex:0] depth];
if ( depth == NSBestDepth (NSCalibratedWhiteColorSpace, 2, 2, YES, NULL))
return intern ("static-gray");
***************
*** 2332,2344 ****
DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1,
0,
doc: /* Internal function called by `display-color-p', which see. */)
! (Lisp_Object display)
{
! NSWindowDepth depth;
! NSString *colorSpace;
! check_ns ();
! depth = [ns_get_screen (display) depth];
! colorSpace = NSColorSpaceFromDepth (depth);
return [colorSpace isEqualToString: NSDeviceWhiteColorSpace]
|| [colorSpace isEqualToString: NSCalibratedWhiteColorSpace]
--- 2334,2344 ----
DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1,
0,
doc: /* Internal function called by `display-color-p', which see. */)
! (Lisp_Object terminal)
{
! struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
! NSWindowDepth depth = [[[NSScreen screens] objectAtIndex:0] depth];
! NSString *colorSpace = NSColorSpaceFromDepth (depth);
return [colorSpace isEqualToString: NSDeviceWhiteColorSpace]
|| [colorSpace isEqualToString: NSCalibratedWhiteColorSpace]
***************
*** 2346,2363 ****
}
! DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p,
! Sx_display_grayscale_p, 0, 1, 0,
doc: /* Return t if the Nextstep display supports shades of gray.
Note that color displays do support shades of gray.
! The optional argument DISPLAY specifies which display to ask about.
! DISPLAY should be either a frame, a display name (a string), or terminal ID.
! If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object display)
{
! NSWindowDepth depth;
! check_ns ();
! depth = [ns_get_screen (display) depth];
return NSBitsPerPixelFromDepth (depth) > 1 ? Qt : Qnil;
}
--- 2346,2362 ----
}
! DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p,
Sx_display_grayscale_p,
! 0, 1, 0,
doc: /* Return t if the Nextstep display supports shades of gray.
Note that color displays do support shades of gray.
! The optional argument TERMINAL specifies which display to ask about.
! TERMINAL should be a terminal object, a frame or a display name (a string).
! If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object terminal)
{
! struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
! NSWindowDepth depth = [[[NSScreen screens] objectAtIndex:0] depth];
return NSBitsPerPixelFromDepth (depth) > 1 ? Qt : Qnil;
}
***************
*** 2365,2391 ****
DEFUN ("x-display-pixel-width", Fx_display_pixel_width,
Sx_display_pixel_width,
0, 1, 0,
! doc: /* Return the width in pixels of the Nextstep display DISPLAY.
! The optional argument DISPLAY specifies which display to ask about.
! DISPLAY should be either a frame, a display name (a string), or terminal ID.
If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object display)
{
! check_ns ();
! return make_number ((int) [ns_get_screen (display) frame].size.width);
}
DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
Sx_display_pixel_height, 0, 1, 0,
! doc: /* Return the height in pixels of the Nextstep display DISPLAY.
! The optional argument DISPLAY specifies which display to ask about.
! DISPLAY should be either a frame, a display name (a string), or terminal ID.
If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object display)
{
! check_ns ();
! return make_number ((int) [ns_get_screen (display) frame].size.height);
}
--- 2364,2392 ----
DEFUN ("x-display-pixel-width", Fx_display_pixel_width,
Sx_display_pixel_width,
0, 1, 0,
! doc: /* Return the width in pixels of the Nextstep display TERMINAL.
! The optional argument TERMINAL specifies which display to ask about.
! TERMINAL should be a terminal object, a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object terminal)
{
! struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
!
! return make_number (x_display_pixel_width (dpyinfo));
}
DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
Sx_display_pixel_height, 0, 1, 0,
! doc: /* Return the height in pixels of the Nextstep display TERMINAL.
! The optional argument TERMINAL specifies which display to ask about.
! TERMINAL should be a terminal object, a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object terminal)
{
! struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
!
! return make_number (x_display_pixel_height (dpyinfo));
}
***************
*** 2422,2436 ****
DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
0, 1, 0,
! doc: /* Return the number of bitplanes of the Nextstep display DISPLAY.
! The optional argument DISPLAY specifies which display to ask about.
! DISPLAY should be either a frame, a display name (a string), or terminal ID.
If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object display)
{
! check_ns ();
return make_number
! (NSBitsPerPixelFromDepth ([ns_get_screen (display) depth]));
}
--- 2423,2438 ----
DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
0, 1, 0,
! doc: /* Return the number of bitplanes of the Nextstep display
TERMINAL.
! The optional argument TERMINAL specifies which display to ask about.
! TERMINAL should be a terminal object, a frame or a display name (a string).
If omitted or nil, that stands for the selected frame's display. */)
! (Lisp_Object terminal)
{
! struct ns_display_info *dpyinfo = check_ns_display_info (terminal);
!
return make_number
! (NSBitsPerPixelFromDepth ([[[NSScreen screens] objectAtIndex:0] depth]));
}
=== modified file 'src/nsterm.m'
*** src/nsterm.m 2013-03-16 14:22:37 +0000
--- src/nsterm.m 2013-03-21 22:55:46 +0000
***************
*** 3813,3827 ****
int
x_display_pixel_height (struct ns_display_info *dpyinfo)
{
! NSScreen *screen = [NSScreen mainScreen];
! return [screen frame].size.height;
}
int
x_display_pixel_width (struct ns_display_info *dpyinfo)
{
! NSScreen *screen = [NSScreen mainScreen];
! return [screen frame].size.width;
}
--- 3813,3843 ----
int
x_display_pixel_height (struct ns_display_info *dpyinfo)
{
! NSArray *screens = [NSScreen screens];
! NSEnumerator *enumerator = [screens objectEnumerator];
! NSScreen *screen;
! NSRect frame;
!
! frame = NSZeroRect;
! while ((screen = [enumerator nextObject]) != nil)
! frame = NSUnionRect (frame, [screen frame]);
!
! return NSHeight (frame);
}
int
x_display_pixel_width (struct ns_display_info *dpyinfo)
{
! NSArray *screens = [NSScreen screens];
! NSEnumerator *enumerator = [screens objectEnumerator];
! NSScreen *screen;
! NSRect frame;
!
! frame = NSZeroRect;
! while ((screen = [enumerator nextObject]) != nil)
! frame = NSUnionRect (frame, [screen frame]);
!
! return NSWidth (frame);
}
=== modified file 'src/w32fns.c'
*** src/w32fns.c 2013-03-20 11:29:37 +0000
--- src/w32fns.c 2013-03-21 05:20:04 +0000
***************
*** 4731,4745 ****
{
struct w32_display_info *dpyinfo = check_x_display_info (display);
HDC hdc;
! int cap;
! hdc = GetDC (dpyinfo->root_window);
! cap = GetDeviceCaps (hdc, VERTSIZE);
!
! ReleaseDC (dpyinfo->root_window, hdc);
!
! return make_number (cap);
}
DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1,
0,
--- 4731,4745 ----
{
struct w32_display_info *dpyinfo = check_x_display_info (display);
HDC hdc;
! float mm_per_pixel;
! hdc = GetDC (NULL);
! mm_per_pixel = ((float) GetDeviceCaps (hdc, VERTSIZE)
! / GetDeviceCaps (hdc, VERTRES));
! ReleaseDC (NULL, hdc);
! return make_number ((int) (x_display_pixel_height (dpyinfo) * mm_per_pixel
! + 0.5f));
}
DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1,
0,
***************
*** 4750,4766 ****
(Lisp_Object display)
{
struct w32_display_info *dpyinfo = check_x_display_info (display);
-
HDC hdc;
! int cap;
!
! hdc = GetDC (dpyinfo->root_window);
!
! cap = GetDeviceCaps (hdc, HORZSIZE);
! ReleaseDC (dpyinfo->root_window, hdc);
! return make_number (cap);
}
DEFUN ("x-display-backing-store", Fx_display_backing_store,
--- 4750,4765 ----
(Lisp_Object display)
{
struct w32_display_info *dpyinfo = check_x_display_info (display);
HDC hdc;
! float mm_per_pixel;
! hdc = GetDC (NULL);
! mm_per_pixel = ((float) GetDeviceCaps (hdc, HORZSIZE)
! / GetDeviceCaps (hdc, HORZRES));
! ReleaseDC (NULL, hdc);
! return make_number ((int) (x_display_pixel_width (dpyinfo) * mm_per_pixel
! + 0.5f));
}
DEFUN ("x-display-backing-store", Fx_display_backing_store,
=== modified file 'src/w32term.c'
*** src/w32term.c 2013-03-15 10:07:29 +0000
--- src/w32term.c 2013-03-21 05:08:16 +0000
***************
*** 142,147 ****
--- 142,156 ----
#define WS_EX_LAYERED 0x80000
#endif
+ /* SM_CXVIRTUALSCREEN and SM_CYVIRTUALSCREEN are not defined on 95 and
+ NT4. */
+ #ifndef SM_CXVIRTUALSCREEN
+ #define SM_CXVIRTUALSCREEN 78
+ #endif
+ #ifndef SM_CYVIRTUALSCREEN
+ #define SM_CXVIRTUALSCREEN 79
+ #endif
+
/* This is a frame waiting to be autoraised, within w32_read_socket. */
struct frame *pending_autoraise_frame;
***************
*** 515,533 ****
int
x_display_pixel_height (struct w32_display_info *dpyinfo)
{
! HDC dc = GetDC (NULL);
! int pixels = GetDeviceCaps (dc, VERTRES);
! ReleaseDC (NULL, dc);
! return pixels;
}
int
x_display_pixel_width (struct w32_display_info *dpyinfo)
{
! HDC dc = GetDC (NULL);
! int pixels = GetDeviceCaps (dc, HORZRES);
! ReleaseDC (NULL, dc);
! return pixels;
}
--- 524,554 ----
int
x_display_pixel_height (struct w32_display_info *dpyinfo)
{
! if (!(w32_major_version == 4 && w32_minor_version == 0))
! return GetSystemMetrics (SM_CYVIRTUALSCREEN);
! else
! {
! /* Windows 95 or NT 4.0 */
! HDC dc = GetDC (NULL);
! int pixels = GetDeviceCaps (dc, VERTRES);
! ReleaseDC (NULL, dc);
! return pixels;
! }
}
int
x_display_pixel_width (struct w32_display_info *dpyinfo)
{
! if (!(w32_major_version == 4 && w32_minor_version == 0))
! return GetSystemMetrics (SM_CXVIRTUALSCREEN);
! else
! {
! /* Windows 95 or NT 4.0 */
! HDC dc = GetDC (NULL);
! int pixels = GetDeviceCaps (dc, HORZRES);
! ReleaseDC (NULL, dc);
! return pixels;
! }
}
- Re: x-display-pixel-width/height inconsistency, (continued)
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/20
- Re: x-display-pixel-width/height inconsistency, Dmitry Gutov, 2013/03/20
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/20
- Re: x-display-pixel-width/height inconsistency, Dmitry Gutov, 2013/03/20
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/20
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/21
Re: x-display-pixel-width/height inconsistency, grischka, 2013/03/20
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/20
- Re: x-display-pixel-width/height inconsistency, grischka, 2013/03/20
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/20
- Re: x-display-pixel-width/height inconsistency,
YAMAMOTO Mitsuharu <=
- Re: x-display-pixel-width/height inconsistency, Eli Zaretskii, 2013/03/22
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/22
- Re: x-display-pixel-width/height inconsistency, Eli Zaretskii, 2013/03/23
- Re: x-display-pixel-width/height inconsistency, Jan Djärv, 2013/03/23
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/23
- Re: x-display-pixel-width/height inconsistency, Eli Zaretskii, 2013/03/23
- Re: x-display-pixel-width/height inconsistency, YAMAMOTO Mitsuharu, 2013/03/24
- Re: x-display-pixel-width/height inconsistency, Eli Zaretskii, 2013/03/24