From f167bc979c76edb43bc63cffebec095601446477 Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Sat, 14 Sep 2019 00:00:00 +0000 Subject: Replace `frame-geometry' * exwm-workspace.el (exwm-workspace--frame-y-offset) exwm-workspace--window-y-offset, exwm-workspace--update-offsets): New variables & function for the calculation of Emacs frame offsets, as `frame-geometry' is not available in Emacs 24. * exwm-floating.el (exwm-floating--set-floating) (exwm-floating--do-moveresize): * exwm-layout.el (exwm-layout--show): * exwm-systemtray.el (exwm-systemtray--on-workspace-switch) (exwm-systemtray--on-randr-refresh, exwm-systemtray--init): Use them. * exwm-systemtray.el (exwm-systemtray--refresh-all): Renamed from `exwm-systemtray--on-randr-refresh'. (exwm-systemtray--init, exwm-systemtray--exit): Use it. * exwm-floating.el (exwm-floating--stop-moveresize): Send a ConfigureNotify event to floating frame to update its position (seems required by Emacs 24). --- exwm-workspace.el | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'exwm-workspace.el') diff --git a/exwm-workspace.el b/exwm-workspace.el index ac4cb982dae7..41343187ed86 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -134,6 +134,11 @@ Please manually run the hook `exwm-workspace-list-change-hook' afterwards.") (defvar exwm-workspace--workareas nil "Workareas (struts excluded).") +(defvar exwm-workspace--frame-y-offset 0 + "Offset between Emacs inner & outer frame in Y.") +(defvar exwm-workspace--window-y-offset 0 + "Offset between Emacs first window & outer frame in Y.") + (defvar exwm-input--during-command) (defvar exwm-input--event-hook) (defvar exwm-layout-show-all-buffers) @@ -397,6 +402,28 @@ NIL if FRAME is not a workspace" (exwm--log "%s" exwm-workspace--workareas) (run-hooks 'exwm-workspace--update-workareas-hook)) +(defun exwm-workspace--update-offsets () + "Update `exwm-workspace--frame-y-offset'/`exwm-workspace--window-y-offset'." + (exwm--log) + (if (not (and exwm-workspace--list + (or menu-bar-mode tool-bar-mode))) + (setq exwm-workspace--frame-y-offset 0 + exwm-workspace--window-y-offset 0) + (redisplay t) + (let* ((frame (elt exwm-workspace--list 0)) + (edges (window-inside-absolute-pixel-edges (frame-first-window + frame)))) + (with-slots (y) + (xcb:+request-unchecked+reply exwm--connection + (make-instance 'xcb:GetGeometry + :drawable (frame-parameter frame 'exwm-outer-id))) + (with-slots ((y* y)) + (xcb:+request-unchecked+reply exwm--connection + (make-instance 'xcb:GetGeometry + :drawable (frame-parameter frame 'exwm-id))) + (setq exwm-workspace--frame-y-offset (- y* y) + exwm-workspace--window-y-offset (- (elt edges 1) y))))))) + (defun exwm-workspace--set-active (frame active) "Make frame FRAME active on its monitor." (exwm--log "active=%s; frame=%s" frame active) -- cgit 1.4.1