From df9b29eda0ba1ec7f751dfd538eefbfe56b2c043 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Fri, 21 Aug 2015 11:00:59 +0200 Subject: [PATCH] Sanitize frame geometry related functions * src/nsfns.m (Fx_frame_geometry): Rename to Fns_frame_geometry. (Fx_frame_edges): Rename to Fns_frame_edges. * src/w32fns.c (Fx_frame_geometry): Rename to Fw32_frame_geometry. (Fx_frame_edges): Rename to Fw32_frame_edges. (Fx_mouse_absolute_pixel_position): Rename to Fw32_mouse_absolute_pixel_position. (Fx_set_mouse_absolute_pixel_position): Rename to Fw32_set_mouse_absolute_pixel_position. * lisp/frame.el (x-frame-geometry, w32-frame-geometry) (ns-frame-geometry, x-frame-edges, w32-frame-edges) (ns-frame-edges, w32-mouse-absolute-pixel-position) (x-mouse-absolute-pixel-position) (w32-set-mouse-absolute-pixel-position) (x-set-mouse-absolute-pixel-position): Declare. (frame-geometry, mouse-absolute-pixel-position) (set-mouse-absolute-pixel-position): New functions. (frame-edges): Rewrite in terms of x-/w32-/ns-frame-edges. --- lisp/frame.el | 120 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/nsfns.m | 8 ++-- src/w32fns.c | 20 ++++----- 3 files changed, 130 insertions(+), 18 deletions(-) diff --git a/lisp/frame.el b/lisp/frame.el index 391f23922f8..3abb72cb859 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -1312,6 +1312,80 @@ live frame and defaults to the selected one." (setq vertical default-frame-scroll-bars)) (cons vertical (and horizontal 'bottom)))) +(declare-function x-frame-geometry "xfns.c" (&optional frame)) +(declare-function w32-frame-geometry "w32fns.c" (&optional frame)) +(declare-function ns-frame-geometry "nsfns.m" (&optional frame)) + +(defun frame-geometry (&optional frame) + "Return geometric attributes of FRAME. +FRAME must be a live frame and defaults to the selected one. The return +value is an association list of the attributes listed below. All height +and width values are in pixels. + +`outer-position' is a cons of the outer left and top edges of FRAME + relative to the origin - the position (0, 0) - of FRAME's display. + +`outer-size' is a cons of the outer width and height of FRAME. The + outer size includes the title bar and the external borders as well as + any menu and/or tool bar of frame. + +`external-border-size' is a cons of the horizontal and vertical width of + FRAME's external borders as supplied by the window manager. + +`title-bar-size' is a cons of the width and height of the title bar of + FRAME as supplied by the window manager. If both of them are zero, + FRAME has no title bar. If only the width is zero, Emacs was not + able to retrieve the width information. + +`menu-bar-external', if non-nil, means the menu bar is external (never + included in the inner edges of FRAME). + +`menu-bar-size' is a cons of the width and height of the menu bar of + FRAME. + +`tool-bar-external', if non-nil, means the tool bar is external (never + included in the inner edges of FRAME). + +`tool-bar-position' tells on which side the tool bar on FRAME is and can + be one of `left', `top', `right' or `bottom'. If this is nil, FRAME + has no tool bar. + +`tool-bar-size' is a cons of the width and height of the tool bar of + FRAME. + +`internal-border-width' is the width of the internal border of + FRAME." + (let* ((frame (window-normalize-frame frame)) + (frame-type (framep-on-display frame))) + (cond + ((eq frame-type 'x) + (x-frame-geometry frame)) + ((eq frame-type 'w32) + (w32-frame-geometry frame)) + ((eq frame-type 'ns) + (ns-frame-geometry frame)) + (t + (list + '(outer-position 0 . 0) + (cons 'outer-size (cons (frame-width frame) (frame-height frame))) + '(external-border-size 0 . 0) + '(title-bar-size 0 . 0) + '(menu-bar-external . nil) + (let ((menu-bar-lines (frame-parameter frame 'menu-bar-lines))) + (cons 'menu-bar-size + (if menu-bar-lines + (cons (frame-width frame) 1) + 1 0))) + '(tool-bar-external . nil) + '(tool-bar-position . nil) + '(tool-bar-size 0 . 0) + (cons 'internal-border-width + (frame-parameter frame 'internal-border-width))))))) + +(declare-function x-frame-edges "xfns.c" (&optional frame type)) +(declare-function w32-frame-edges "w32fns.c" (&optional frame type)) +(declare-function ns-frame-edges "nsfns.m" (&optional frame type)) + (defun frame-edges (&optional frame type) "Return coordinates of FRAME's edges. FRAME must be a live frame and defaults to the selected one. The @@ -1325,10 +1399,48 @@ Optional argument TYPE specifies the type of the edges. TYPE `native-edges' (or nil) means to return the native edges of FRAME. TYPE `inner-edges' means to return the inner edges of FRAME." - (let ((frame (window-normalize-frame frame))) - (if (display-graphic-p (frame-parameter nil 'display)) - (x-frame-edges frame (or type 'native-edges)) - (list 0 0 (frame-width frame) (frame-height frame))))) + (let* ((frame (window-normalize-frame frame)) + (frame-type (framep-on-display frame))) + (cond + ((eq frame-type 'x) + (x-frame-edges frame type)) + ((eq frame-type 'w32) + (w32-frame-edges frame type)) + ((eq frame-type 'ns) + (ns-frame-edges frame type)) + (t + (list 0 0 (frame-width frame) (frame-height frame)))))) + +(declare-function w32-mouse-absolute-pixel-position "w32fns.c") +(declare-function x-mouse-absolute-pixel-position "xfns.c") + +(defun mouse-absolute-pixel-position () + "Return absolute position of mouse cursor in pixels. +The position is returned as a cons cell (X . Y) of the +coordinates of the mouse cursor position in pixels relative to a +position (0, 0) of the selected frame's terminal." + (let ((frame-type (framep-on-display))) + (cond + ((eq frame-type 'x) + (x-mouse-absolute-pixel-position)) + ((eq frame-type 'w32) + (w32-mouse-absolute-pixel-position)) + (t + (cons 0 0))))) + +(declare-function w32-set-mouse-absolute-pixel-position "w32fns.c" (x y)) +(declare-function x-set-mouse-absolute-pixel-position "xfns.c" (x y)) + +(defun set-mouse-absolute-pixel-position (x y) + "Move mouse pointer to absolute pixel position (X, Y). +The coordinates X and Y are interpreted in pixels relative to a +position (0, 0) of the selected frame's terminal." + (let ((frame-type (framep-on-display))) + (cond + ((eq frame-type 'x) + (x-set-mouse-absolute-pixel-position x y)) + ((eq frame-type 'w32) + (w32-set-mouse-absolute-pixel-position x y))))) (defun frame-monitor-attributes (&optional frame) "Return the attributes of the physical monitor dominating FRAME. diff --git a/src/nsfns.m b/src/nsfns.m index e9453604592..d317d48608c 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -2906,7 +2906,7 @@ frame_geometry (Lisp_Object frame, Lisp_Object attribute) make_number (internal_border_width))); } -DEFUN ("x-frame-geometry", Fx_frame_geometry, Sx_frame_geometry, 0, 1, 0, +DEFUN ("ns-frame-geometry", Fns_frame_geometry, Sns_frame_geometry, 0, 1, 0, doc: /* Return geometric attributes of FRAME. FRAME must be a live frame and defaults to the selected one. The return value is an association list of the attributes listed below. All height @@ -2950,7 +2950,7 @@ and width values are in pixels. return frame_geometry (frame, Qnil); } -DEFUN ("x-frame-edges", Fx_frame_edges, Sx_frame_edges, 0, 2, 0, +DEFUN ("ns-frame-edges", Fns_frame_edges, Sns_frame_edges, 0, 2, 0, doc: /* Return edge coordinates of FRAME. FRAME must be a live frame and defaults to the selected one. The return value is a list of the form (LEFT, TOP, RIGHT, BOTTOM). All values are @@ -3156,8 +3156,8 @@ be used as the image of the icon representing the frame. */); defsubr (&Sx_display_pixel_width); defsubr (&Sx_display_pixel_height); defsubr (&Sns_display_monitor_attributes_list); - defsubr (&Sx_frame_geometry); - defsubr (&Sx_frame_edges); + defsubr (&Sns_frame_geometry); + defsubr (&Sns_frame_edges); defsubr (&Sx_display_mm_width); defsubr (&Sx_display_mm_height); defsubr (&Sx_display_screens); diff --git a/src/w32fns.c b/src/w32fns.c index a47f3f9a8dc..f16bf762127 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -8002,7 +8002,7 @@ This is a direct interface to the Windows API FindWindow function. */) return Qt; } -DEFUN ("x-frame-geometry", Fx_frame_geometry, Sx_frame_geometry, 0, 1, 0, +DEFUN ("w32-frame-geometry", Fw32_frame_geometry, Sw32_frame_geometry, 0, 1, 0, doc: /* Return geometric attributes of FRAME. FRAME must be a live frame and defaults to the selected one. The return value is an association list of the attributes listed below. All height @@ -8138,7 +8138,7 @@ and width values are in pixels. make_number (internal_border_width))); } -DEFUN ("x-frame-edges", Fx_frame_edges, Sx_frame_edges, 0, 2, 0, +DEFUN ("w32-frame-edges", Fw32_frame_edges, Sw32_frame_edges, 0, 2, 0, doc: /* Return edge coordinates of FRAME. FRAME must be a live frame and defaults to the selected one. The return value is a list of the form (LEFT, TOP, RIGHT, BOTTOM). All values are @@ -8213,8 +8213,8 @@ menu bar or tool bar of FRAME. */) } } -DEFUN ("x-mouse-absolute-pixel-position", Fx_mouse_absolute_pixel_position, - Sx_mouse_absolute_pixel_position, 0, 0, 0, +DEFUN ("w32-mouse-absolute-pixel-position", Fw32_mouse_absolute_pixel_position, + Sw32_mouse_absolute_pixel_position, 0, 0, 0, doc: /* Return absolute position of mouse cursor in pixels. The position is returned as a cons cell (X . Y) of the coordinates of the mouse cursor position in pixels relative to a position (0, 0) of the @@ -8230,8 +8230,8 @@ selected frame's display. */) return Fcons (make_number (pt.x), make_number (pt.y)); } -DEFUN ("x-set-mouse-absolute-pixel-position", Fx_set_mouse_absolute_pixel_position, - Sx_set_mouse_absolute_pixel_position, 2, 2, 0, +DEFUN ("w32-set-mouse-absolute-pixel-position", Fw32_set_mouse_absolute_pixel_position, + Sw32_set_mouse_absolute_pixel_position, 2, 2, 0, doc: /* Move mouse pointer to absolute pixel position (X, Y). The coordinates X and Y are interpreted in pixels relative to a position (0, 0) of the selected frame's display. */) @@ -9280,10 +9280,10 @@ This variable has effect only on Windows Vista and later. */); defsubr (&Sx_open_connection); defsubr (&Sx_close_connection); defsubr (&Sx_display_list); - defsubr (&Sx_frame_geometry); - defsubr (&Sx_frame_edges); - defsubr (&Sx_mouse_absolute_pixel_position); - defsubr (&Sx_set_mouse_absolute_pixel_position); + defsubr (&Sw32_frame_geometry); + defsubr (&Sw32_frame_edges); + defsubr (&Sw32_mouse_absolute_pixel_position); + defsubr (&Sw32_set_mouse_absolute_pixel_position); defsubr (&Sx_synchronize); /* W32 specific functions */ -- 2.39.2