Merge branch 'medranocalvo/exwm-log-buffer' into externals/exwm

This commit is contained in:
Chris Feng 2018-08-19 00:00:00 +00:00
commit be10e261cc
7 changed files with 202 additions and 7 deletions

View file

@ -31,9 +31,7 @@
(require 'xcb) (require 'xcb)
(require 'xcb-icccm) (require 'xcb-icccm)
(require 'xcb-ewmh) (require 'xcb-ewmh)
(require 'exwm-debug)
(eval-and-compile
(defvar exwm-debug-on nil "Non-nil to turn on debug for EXWM."))
(defvar exwm--connection nil "X connection.") (defvar exwm--connection nil "X connection.")
@ -70,10 +68,18 @@
(declare-function exwm-workspace-move-window "exwm-workspace.el" (declare-function exwm-workspace-move-window "exwm-workspace.el"
(frame-or-index &optional id)) (frame-or-index &optional id))
(defmacro exwm--log (format-string &rest args) (defmacro exwm--log (&optional format-string &rest objects)
"Print debug message." "Emit a message prepending the name of the function being executed.
FORMAT-STRING is a string specifying the message to output, as in
`format'. The OBJECTS arguments specify the substitutions."
(when exwm-debug-on (when exwm-debug-on
`(message (concat "[EXWM] " ,format-string) ,@args))) (unless format-string (setq format-string ""))
`(progn
(exwm-debug--message (concat "%s:\t" ,format-string "\n")
(exwm-debug--compile-time-function-name)
,@objects)
nil)))
(defmacro exwm--debug (&rest forms) (defmacro exwm--debug (&rest forms)
(when exwm-debug-on `(progn ,@forms))) (when exwm-debug-on `(progn ,@forms)))
@ -88,6 +94,7 @@
(defun exwm--lock (&rest _args) (defun exwm--lock (&rest _args)
"Lock (disable all events)." "Lock (disable all events)."
(exwm--log)
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:ChangeWindowAttributes (make-instance 'xcb:ChangeWindowAttributes
:window exwm--root :window exwm--root
@ -97,6 +104,7 @@
(defun exwm--unlock (&rest _args) (defun exwm--unlock (&rest _args)
"Unlock (enable all events)." "Unlock (enable all events)."
(exwm--log)
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:ChangeWindowAttributes (make-instance 'xcb:ChangeWindowAttributes
:window exwm--root :window exwm--root
@ -281,6 +289,11 @@ least SECS seconds later."
(/= ,i exwm-workspace-current-index)]) (/= ,i exwm-workspace-current-index)])
(number-sequence 0 (1- (exwm-workspace--count)))))))) (number-sequence 0 (1- (exwm-workspace--count))))))))
(exwm--debug
(let ((map exwm-mode-map))
(define-key map "\C-c\C-l" #'exwm-debug-clear)
(define-key map "\C-c\C-m" #'exwm-debug-mark)))
(define-derived-mode exwm-mode nil "EXWM" (define-derived-mode exwm-mode nil "EXWM"
"Major mode for managing X windows. "Major mode for managing X windows.

113
exwm-debug.el Normal file
View file

@ -0,0 +1,113 @@
;;; exwm-debug.el --- Debugging helpers for EXWM -*- lexical-binding: t -*-
;; Copyright (C) 2018 Free Software Foundation, Inc.
;; Author: Adrián Medraño Calvo <adrian@medranocalvo.com>
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This module collects functions that help in debugging EXWM.
;;; Code:
(eval-and-compile
(defvar exwm-debug-on nil "Non-nil to turn on debug for EXWM."))
(defvar exwm-debug-buffer "*EXWM-DEBUG*" "Buffer to write debug messages to.")
(defvar exwm-debug-backtrace-start-frame 5
"From which frame to start collecting backtraces.")
(defun exwm-debug--call-stack ()
"Return the current call stack frames."
(let (frames frame
;; No need to acount for our setq, while, let, ...
(index exwm-debug-backtrace-start-frame))
(while (setq frame (backtrace-frame index))
(push frame frames)
(cl-incf index))
(cl-remove-if-not 'car frames)))
(defmacro exwm-debug--compile-time-function-name ()
"Get the name of outermost definition at expansion time."
(let* ((frame (cl-find-if
(lambda (frame)
(ignore-errors
(let ((clause (car (cl-third frame))))
(or (equal clause 'defalias)
(equal clause 'cl-defmethod)))))
(reverse (exwm-debug--call-stack))))
(defn (cl-third frame))
(deftype (car defn)))
(cl-case deftype
((defalias) (symbol-name (cl-cadadr defn)))
((cl-defmethod) (symbol-name (cadr defn)))
(t "<unknown function>"))))
(defmacro exwm-debug--with-debug-buffer (&rest forms)
"Evaluate FORMS making sure `exwm-debug-buffer' is correctly updated."
`(with-current-buffer (get-buffer-create exwm-debug-buffer)
(let (windows-eob)
;; Note windows whose point is at EOB.
(dolist (w (get-buffer-window-list exwm-debug-buffer t t))
(when (= (window-point w) (point-max))
(push w windows-eob)))
(save-excursion
(goto-char (point-max))
,@forms)
;; Restore point.
(dolist (w windows-eob)
(set-window-point w (point-max))))))
(defun exwm-debug--message (format-string &rest objects)
"Print a message to `exwm-debug-buffer'.
The FORMAT-STRING argument follows the speficies how to print each of
the passed OBJECTS. See `format' for details."
(exwm-debug--with-debug-buffer
(insert (apply #'format format-string objects))))
(defmacro exwm-debug--backtrace ()
"Print a backtrace to the `exwm-debug-buffer'."
'(exwm-debug--with-debug-buffer
(let ((standard-output exwm-debug-buffer))
(backtrace))))
(defmacro exwm-debug--backtrace-on-error (&rest forms)
"Evaluate FORMS. Printing a backtrace if an error is signaled."
`(let ((debug-on-error t)
(debugger (lambda (&rest _) (exwm-debug--backtrace))))
,@forms))
(defun exwm-debug-clear ()
"Clear the debug buffer."
(interactive)
(exwm-debug--with-debug-buffer
(erase-buffer)))
(defun exwm-debug-mark ()
"Insert a mark in the debug buffer."
(interactive)
(exwm-debug--with-debug-buffer
(insert " \n")))
(provide 'exwm-debug)
;;; exwm-debug.el ends here

View file

@ -157,6 +157,7 @@ This value should always be overwritten.")
(defun exwm-input--set-focus (id) (defun exwm-input--set-focus (id)
"Set input focus to window ID in a proper way." "Set input focus to window ID in a proper way."
(when (exwm--id->buffer id) (when (exwm--id->buffer id)
(exwm--log "id=#x%x" id)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(exwm-input--update-timestamp (exwm-input--update-timestamp
(lambda (timestamp id send-input-focus wm-take-focus) (lambda (timestamp id send-input-focus wm-take-focus)
@ -187,6 +188,7 @@ This value should always be overwritten.")
ARGS are additional arguments to CALLBACK." ARGS are additional arguments to CALLBACK."
(setq exwm-input--timestamp-callback (cons callback args)) (setq exwm-input--timestamp-callback (cons callback args))
(exwm--log)
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:ChangeProperty (make-instance 'xcb:ChangeProperty
:mode xcb:PropMode:Replace :mode xcb:PropMode:Replace
@ -200,6 +202,7 @@ ARGS are additional arguments to CALLBACK."
(defun exwm-input--on-PropertyNotify (data _synthetic) (defun exwm-input--on-PropertyNotify (data _synthetic)
"Handle PropertyNotify events." "Handle PropertyNotify events."
(exwm--log)
(when exwm-input--timestamp-callback (when exwm-input--timestamp-callback
(let ((obj (make-instance 'xcb:PropertyNotify))) (let ((obj (make-instance 'xcb:PropertyNotify)))
(xcb:unmarshal obj data) (xcb:unmarshal obj data)
@ -218,6 +221,7 @@ ARGS are additional arguments to CALLBACK."
(with-slots (time root event root-x root-y event-x event-y state) evt (with-slots (time root event root-x root-y event-x event-y state) evt
(setq buffer (exwm--id->buffer event) (setq buffer (exwm--id->buffer event)
window (get-buffer-window buffer t)) window (get-buffer-window buffer t))
(exwm--log "EnterNotify: buffer=%s; window=%s" buffer window)
(when (and buffer window (not (eq window (selected-window)))) (when (and buffer window (not (eq window (selected-window))))
(setq frame (window-frame window) (setq frame (window-frame window)
frame-xid (frame-parameter frame 'exwm-id)) frame-xid (frame-parameter frame 'exwm-id))
@ -265,6 +269,8 @@ ARGS are additional arguments to CALLBACK."
(eq (current-buffer) (window-buffer)) (eq (current-buffer) (window-buffer))
(not (string-prefix-p " *temp*" (not (string-prefix-p " *temp*"
(buffer-name (car (last (buffer-list))))))) (buffer-name (car (last (buffer-list)))))))
(exwm--log "current-buffer=%S selected-window=%S"
(current-buffer) (selected-window))
(redirect-frame-focus (selected-frame) nil) (redirect-frame-focus (selected-frame) nil)
(setq exwm-input--update-focus-window (selected-window)) (setq exwm-input--update-focus-window (selected-window))
(exwm-input--update-focus-defer))) (exwm-input--update-focus-defer)))
@ -296,6 +302,7 @@ ARGS are additional arguments to CALLBACK."
(defun exwm-input--update-focus (window) (defun exwm-input--update-focus (window)
"Update input focus." "Update input focus."
(when (window-live-p window) (when (window-live-p window)
(exwm--log "focus-window=%s focus-buffer=%s" window (window-buffer window))
(with-current-buffer (window-buffer window) (with-current-buffer (window-buffer window)
(if (derived-mode-p 'exwm-mode) (if (derived-mode-p 'exwm-mode)
(if (not (eq exwm--frame exwm-workspace--current)) (if (not (eq exwm--frame exwm-workspace--current))
@ -331,6 +338,10 @@ ARGS are additional arguments to CALLBACK."
;; The focus is on another workspace (e.g. it got clicked) ;; The focus is on another workspace (e.g. it got clicked)
;; so switch to it. ;; so switch to it.
(progn (progn
(exwm--log "Switching to %s's workspace %s (%s)"
window
(window-frame window)
(selected-frame))
(set-frame-parameter (selected-frame) 'exwm-selected-window (set-frame-parameter (selected-frame) 'exwm-selected-window
window) window)
(exwm--defer 0 #'exwm-workspace-switch (selected-frame))) (exwm--defer 0 #'exwm-workspace-switch (selected-frame)))
@ -346,12 +357,14 @@ ARGS are additional arguments to CALLBACK."
(defun exwm-input--on-minibuffer-setup () (defun exwm-input--on-minibuffer-setup ()
"Run in `minibuffer-setup-hook' to set input focus." "Run in `minibuffer-setup-hook' to set input focus."
(exwm--log)
(unless (exwm-workspace--client-p) (unless (exwm-workspace--client-p)
;; Set input focus on the Emacs frame ;; Set input focus on the Emacs frame
(x-focus-frame (window-frame (minibuffer-selected-window))))) (x-focus-frame (window-frame (minibuffer-selected-window)))))
(defun exwm-input--set-active-window (&optional id) (defun exwm-input--set-active-window (&optional id)
"Set _NET_ACTIVE_WINDOW." "Set _NET_ACTIVE_WINDOW."
(exwm--log)
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:ewmh:set-_NET_ACTIVE_WINDOW (make-instance 'xcb:ewmh:set-_NET_ACTIVE_WINDOW
:window exwm--root :window exwm--root
@ -363,6 +376,8 @@ ARGS are additional arguments to CALLBACK."
(mode xcb:Allow:SyncPointer) (mode xcb:Allow:SyncPointer)
button-event window buffer frame) button-event window buffer frame)
(xcb:unmarshal obj data) (xcb:unmarshal obj data)
(exwm--log "major-mode=%s buffer=%s"
major-mode (buffer-name (current-buffer)))
(with-slots (detail time event state) obj (with-slots (detail time event state) obj
(setq button-event (xcb:keysyms:keysym->event exwm--connection (setq button-event (xcb:keysyms:keysym->event exwm--connection
detail state) detail state)
@ -412,12 +427,15 @@ ARGS are additional arguments to CALLBACK."
"Handle KeyPress event." "Handle KeyPress event."
(let ((obj (make-instance 'xcb:KeyPress))) (let ((obj (make-instance 'xcb:KeyPress)))
(xcb:unmarshal obj data) (xcb:unmarshal obj data)
(exwm--log "major-mode=%s buffer=%s"
major-mode (buffer-name (current-buffer)))
(if (derived-mode-p 'exwm-mode) (if (derived-mode-p 'exwm-mode)
(funcall exwm--on-KeyPress obj data) (funcall exwm--on-KeyPress obj data)
(exwm-input--on-KeyPress-char-mode obj)))) (exwm-input--on-KeyPress-char-mode obj))))
(defun exwm-input--on-CreateNotify (data _synthetic) (defun exwm-input--on-CreateNotify (data _synthetic)
"Handle CreateNotify events." "Handle CreateNotify events."
(exwm--log)
(let ((evt (make-instance 'xcb:CreateNotify))) (let ((evt (make-instance 'xcb:CreateNotify)))
(xcb:unmarshal evt data) (xcb:unmarshal evt data)
(with-slots (window) evt (with-slots (window) evt
@ -425,6 +443,7 @@ ARGS are additional arguments to CALLBACK."
(defun exwm-input--update-global-prefix-keys () (defun exwm-input--update-global-prefix-keys ()
"Update `exwm-input--global-prefix-keys'." "Update `exwm-input--global-prefix-keys'."
(exwm--log)
(when exwm--connection (when exwm--connection
(let ((original exwm-input--global-prefix-keys)) (let ((original exwm-input--global-prefix-keys))
(setq exwm-input--global-prefix-keys nil) (setq exwm-input--global-prefix-keys nil)
@ -438,6 +457,7 @@ ARGS are additional arguments to CALLBACK."
'children)))))) 'children))))))
(defun exwm-input--grab-global-prefix-keys (&rest xwins) (defun exwm-input--grab-global-prefix-keys (&rest xwins)
(exwm--log)
(let ((req (make-instance 'xcb:GrabKey (let ((req (make-instance 'xcb:GrabKey
:owner-events 0 :owner-events 0
:grab-window nil :grab-window nil
@ -450,6 +470,8 @@ ARGS are additional arguments to CALLBACK."
(setq keysym (xcb:keysyms:event->keysym exwm--connection k) (setq keysym (xcb:keysyms:event->keysym exwm--connection k)
keycode (xcb:keysyms:keysym->keycode exwm--connection keycode (xcb:keysyms:keysym->keycode exwm--connection
(car keysym))) (car keysym)))
(exwm--log "Grabbing key=%s (keysym=%s keycode=%s)"
(single-key-description k) keysym keycode)
(setf (slot-value req 'modifiers) (cdr keysym) (setf (slot-value req 'modifiers) (cdr keysym)
(slot-value req 'key) keycode) (slot-value req 'key) keycode)
(dolist (xwin xwins) (dolist (xwin xwins)
@ -498,6 +520,7 @@ specifically saved in the Customize interface for `exwm-input-global-keys'.
In configuration you should customize or set `exwm-input-global-keys' In configuration you should customize or set `exwm-input-global-keys'
instead." instead."
(interactive "KSet key globally: \nCSet key %s to command: ") (interactive "KSet key globally: \nCSet key %s to command: ")
(exwm--log)
(setq exwm-input-global-keys (append exwm-input-global-keys (setq exwm-input-global-keys (append exwm-input-global-keys
(list (cons key command)))) (list (cons key command))))
(exwm-input--set-key key command) (exwm-input--set-key key command)
@ -517,6 +540,7 @@ instead."
(defun exwm-input--mimic-read-event (event) (defun exwm-input--mimic-read-event (event)
"Process EVENT as if it were returned by `read-event'." "Process EVENT as if it were returned by `read-event'."
(exwm--log)
(unless (eq 0 extra-keyboard-modifiers) (unless (eq 0 extra-keyboard-modifiers)
(setq event (event-convert-list (append (event-modifiers (setq event (event-convert-list (append (event-modifiers
extra-keyboard-modifiers) extra-keyboard-modifiers)
@ -559,6 +583,7 @@ instead."
(with-slots (detail state) key-press (with-slots (detail state) key-press
(let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail state)) (let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail state))
event raw-event mode) event raw-event mode)
(exwm--log "%s" keysym)
(when (and (/= 0 (car keysym)) (when (and (/= 0 (car keysym))
(setq raw-event (xcb:keysyms:keysym->event (setq raw-event (xcb:keysyms:keysym->event
exwm--connection (car keysym) exwm--connection (car keysym)
@ -610,6 +635,7 @@ instead."
(with-slots (detail state) key-press (with-slots (detail state) key-press
(let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail state)) (let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail state))
event raw-event) event raw-event)
(exwm--log "%s" keysym)
(when (and (/= 0 (car keysym)) (when (and (/= 0 (car keysym))
(setq raw-event (xcb:keysyms:keysym->event (setq raw-event (xcb:keysyms:keysym->event
exwm--connection (car keysym) exwm--connection (car keysym)
@ -660,6 +686,7 @@ instead."
"Grab all key events on window ID." "Grab all key events on window ID."
(unless id (setq id (exwm--buffer->id (window-buffer)))) (unless id (setq id (exwm--buffer->id (window-buffer))))
(when id (when id
(exwm--log "id=#x%x" id)
(when (xcb:+request-checked+request-check exwm--connection (when (xcb:+request-checked+request-check exwm--connection
(make-instance 'xcb:GrabKey (make-instance 'xcb:GrabKey
:owner-events 0 :owner-events 0
@ -676,6 +703,7 @@ instead."
"Ungrab all key events on window ID." "Ungrab all key events on window ID."
(unless id (setq id (exwm--buffer->id (window-buffer)))) (unless id (setq id (exwm--buffer->id (window-buffer))))
(when id (when id
(exwm--log "id=#x%x" id)
(when (xcb:+request-checked+request-check exwm--connection (when (xcb:+request-checked+request-check exwm--connection
(make-instance 'xcb:UngrabKey (make-instance 'xcb:UngrabKey
:key xcb:Grab:Any :key xcb:Grab:Any
@ -692,6 +720,7 @@ instead."
(interactive (list (when (derived-mode-p 'exwm-mode) (interactive (list (when (derived-mode-p 'exwm-mode)
(exwm--buffer->id (window-buffer))))) (exwm--buffer->id (window-buffer)))))
(when id (when id
(exwm--log "id=#x%x" id)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(exwm-input--grab-keyboard id) (exwm-input--grab-keyboard id)
(setq exwm--keyboard-grabbed t) (setq exwm--keyboard-grabbed t)
@ -704,6 +733,7 @@ instead."
(interactive (list (when (derived-mode-p 'exwm-mode) (interactive (list (when (derived-mode-p 'exwm-mode)
(exwm--buffer->id (window-buffer))))) (exwm--buffer->id (window-buffer)))))
(when id (when id
(exwm--log "id=#x%x" id)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(exwm-input--release-keyboard id) (exwm-input--release-keyboard id)
(setq exwm--keyboard-grabbed nil) (setq exwm--keyboard-grabbed nil)
@ -716,6 +746,7 @@ instead."
(interactive (list (when (derived-mode-p 'exwm-mode) (interactive (list (when (derived-mode-p 'exwm-mode)
(exwm--buffer->id (window-buffer))))) (exwm--buffer->id (window-buffer)))))
(when id (when id
(exwm--log "id=#x%x" id)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(if exwm--keyboard-grabbed (if exwm--keyboard-grabbed
(exwm-input-release-keyboard id) (exwm-input-release-keyboard id)
@ -731,6 +762,7 @@ instead."
(car keysym))) (car keysym)))
(when (/= 0 keycode) (when (/= 0 keycode)
(setq id (exwm--buffer->id (window-buffer (selected-window)))) (setq id (exwm--buffer->id (window-buffer (selected-window))))
(exwm--log "id=#x%x event=%s keycode" id event keycode)
(dolist (class '(xcb:KeyPress xcb:KeyRelease)) (dolist (class '(xcb:KeyPress xcb:KeyRelease))
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:SendEvent (make-instance 'xcb:SendEvent

View file

@ -59,6 +59,7 @@
(defun exwm-layout--set-state (id state) (defun exwm-layout--set-state (id state)
"Set WM_STATE." "Set WM_STATE."
(exwm--log "id=#x%x" id)
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:icccm:set-WM_STATE (make-instance 'xcb:icccm:set-WM_STATE
:window id :state state :icon xcb:Window:None)) :window id :state state :icon xcb:Window:None))
@ -146,6 +147,7 @@
(cl-defun exwm-layout-set-fullscreen (&optional id) (cl-defun exwm-layout-set-fullscreen (&optional id)
"Make window ID fullscreen." "Make window ID fullscreen."
(interactive) (interactive)
(exwm--log "id=#x%x" (or id 0))
(unless (and (or id (derived-mode-p 'exwm-mode)) (unless (and (or id (derived-mode-p 'exwm-mode))
(not (exwm-layout--fullscreen-p))) (not (exwm-layout--fullscreen-p)))
(cl-return-from exwm-layout-set-fullscreen)) (cl-return-from exwm-layout-set-fullscreen))
@ -174,6 +176,7 @@
(cl-defun exwm-layout-unset-fullscreen (&optional id) (cl-defun exwm-layout-unset-fullscreen (&optional id)
"Restore window from fullscreen state." "Restore window from fullscreen state."
(interactive) (interactive)
(exwm--log "id=#x%x" (or id 0))
(unless (and (or id (derived-mode-p 'exwm-mode)) (unless (and (or id (derived-mode-p 'exwm-mode))
(exwm-layout--fullscreen-p)) (exwm-layout--fullscreen-p))
(cl-return-from exwm-layout-unset-fullscreen)) (cl-return-from exwm-layout-unset-fullscreen))
@ -203,6 +206,7 @@
(cl-defun exwm-layout-toggle-fullscreen (&optional id) (cl-defun exwm-layout-toggle-fullscreen (&optional id)
"Toggle fullscreen mode." "Toggle fullscreen mode."
(interactive (list (exwm--buffer->id (window-buffer)))) (interactive (list (exwm--buffer->id (window-buffer))))
(exwm--log "id=#x%x" (or id 0))
(unless (or id (derived-mode-p 'exwm-mode)) (unless (or id (derived-mode-p 'exwm-mode))
(cl-return-from exwm-layout-toggle-fullscreen)) (cl-return-from exwm-layout-toggle-fullscreen))
(when id (when id
@ -234,6 +238,7 @@ selected by `other-buffer'."
(defun exwm-layout--set-client-list-stacking () (defun exwm-layout--set-client-list-stacking ()
"Set _NET_CLIENT_LIST_STACKING." "Set _NET_CLIENT_LIST_STACKING."
(exwm--log)
(let (id clients-floating clients clients-iconic clients-other) (let (id clients-floating clients clients-iconic clients-other)
(dolist (pair exwm--id-buffer-alist) (dolist (pair exwm--id-buffer-alist)
(setq id (car pair)) (setq id (car pair))
@ -261,6 +266,7 @@ selected by `other-buffer'."
;; `window-configuration-change-hook' makes the frame selected. ;; `window-configuration-change-hook' makes the frame selected.
(unless frame (unless frame
(setq frame (selected-frame))) (setq frame (selected-frame)))
(exwm--log "frame=%s" frame)
(let (covered-buffers ;EXWM-buffers covered by a new X window. (let (covered-buffers ;EXWM-buffers covered by a new X window.
vacated-windows ;Windows previously displaying EXWM-buffers. vacated-windows ;Windows previously displaying EXWM-buffers.
windows) windows)
@ -333,6 +339,7 @@ selected by `other-buffer'."
(defun exwm-layout--on-minibuffer-setup () (defun exwm-layout--on-minibuffer-setup ()
"Refresh layout when minibuffer grows." "Refresh layout when minibuffer grows."
(exwm--log)
(unless (exwm-workspace--client-p) (unless (exwm-workspace--client-p)
(exwm--defer 0 (lambda () (exwm--defer 0 (lambda ()
(when (< 1 (window-height (minibuffer-window))) (when (< 1 (window-height (minibuffer-window)))
@ -345,6 +352,7 @@ selected by `other-buffer'."
(or (cl-position ?\n (current-message)) (or (cl-position ?\n (current-message))
(> (length (current-message)) (> (length (current-message))
(frame-width exwm-workspace--current)))) (frame-width exwm-workspace--current))))
(exwm--log)
(if dirty (if dirty
(exwm-layout--refresh) (exwm-layout--refresh)
(exwm--defer 0 #'exwm-layout--refresh)))) (exwm--defer 0 #'exwm-layout--refresh))))
@ -361,6 +369,7 @@ Normal hints are checked and regarded if the selected window is displaying an
`exwm-mode' buffer. However, this may violate the normal hints set on other X `exwm-mode' buffer. However, this may violate the normal hints set on other X
windows." windows."
(interactive "p") (interactive "p")
(exwm--log)
(cond (cond
((zerop delta)) ;no operation ((zerop delta)) ;no operation
((window-minibuffer-p)) ;avoid resize minibuffer-window ((window-minibuffer-p)) ;avoid resize minibuffer-window
@ -466,6 +475,7 @@ See also `exwm-layout-enlarge-window'."
(defun exwm-layout-hide-mode-line () (defun exwm-layout-hide-mode-line ()
"Hide mode-line." "Hide mode-line."
(interactive) (interactive)
(exwm--log)
(when (and (derived-mode-p 'exwm-mode) mode-line-format) (when (and (derived-mode-p 'exwm-mode) mode-line-format)
(let (mode-line-height) (let (mode-line-height)
(when exwm--floating-frame (when exwm--floating-frame
@ -484,6 +494,7 @@ See also `exwm-layout-enlarge-window'."
(defun exwm-layout-show-mode-line () (defun exwm-layout-show-mode-line ()
"Show mode-line." "Show mode-line."
(interactive) (interactive)
(exwm--log)
(when (and (derived-mode-p 'exwm-mode) (not mode-line-format)) (when (and (derived-mode-p 'exwm-mode) (not mode-line-format))
(setq mode-line-format exwm--mode-line-format (setq mode-line-format exwm--mode-line-format
exwm--mode-line-format nil) exwm--mode-line-format nil)
@ -501,6 +512,7 @@ See also `exwm-layout-enlarge-window'."
(defun exwm-layout-toggle-mode-line () (defun exwm-layout-toggle-mode-line ()
"Toggle the display of mode-line." "Toggle the display of mode-line."
(interactive) (interactive)
(exwm--log)
(when (derived-mode-p 'exwm-mode) (when (derived-mode-p 'exwm-mode)
(if mode-line-format (if mode-line-format
(exwm-layout-hide-mode-line) (exwm-layout-hide-mode-line)
@ -509,6 +521,7 @@ See also `exwm-layout-enlarge-window'."
(defun exwm-layout--init () (defun exwm-layout--init ()
"Initialize layout module." "Initialize layout module."
;; Auto refresh layout ;; Auto refresh layout
(exwm--log)
(add-hook 'window-configuration-change-hook #'exwm-layout--refresh) (add-hook 'window-configuration-change-hook #'exwm-layout--refresh)
;; The behavior of `window-configuration-change-hook' will be changed. ;; The behavior of `window-configuration-change-hook' will be changed.
(when (fboundp 'window-pixel-width-before-size-change) (when (fboundp 'window-pixel-width-before-size-change)
@ -522,6 +535,7 @@ See also `exwm-layout-enlarge-window'."
(defun exwm-layout--exit () (defun exwm-layout--exit ()
"Exit the layout module." "Exit the layout module."
(exwm--log)
(remove-hook 'window-configuration-change-hook #'exwm-layout--refresh) (remove-hook 'window-configuration-change-hook #'exwm-layout--refresh)
(when (fboundp 'window-pixel-width-before-size-change) (when (fboundp 'window-pixel-width-before-size-change)
(remove-hook 'window-size-change-functions #'exwm-layout--refresh)) (remove-hook 'window-size-change-functions #'exwm-layout--refresh))

View file

@ -119,6 +119,7 @@ You can still make the X windows floating afterwards."
(defun exwm-manage--update-geometry (id &optional force) (defun exwm-manage--update-geometry (id &optional force)
"Update window geometry." "Update window geometry."
(exwm--log "id=#x%x" id)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(unless (and exwm--geometry (not force)) (unless (and exwm--geometry (not force))
(let ((reply (xcb:+request-unchecked+reply exwm--connection (let ((reply (xcb:+request-unchecked+reply exwm--connection
@ -134,6 +135,7 @@ You can still make the X windows floating afterwards."
(defun exwm-manage--update-ewmh-state (id) (defun exwm-manage--update-ewmh-state (id)
"Update _NET_WM_STATE." "Update _NET_WM_STATE."
(exwm--log "id=#x%x" id)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(unless exwm--ewmh-state (unless exwm--ewmh-state
(let ((reply (xcb:+request-unchecked+reply exwm--connection (let ((reply (xcb:+request-unchecked+reply exwm--connection
@ -144,6 +146,7 @@ You can still make the X windows floating afterwards."
(defun exwm-manage--update-mwm-hints (id &optional force) (defun exwm-manage--update-mwm-hints (id &optional force)
"Update _MOTIF_WM_HINTS." "Update _MOTIF_WM_HINTS."
(exwm--log "id=#x%x" id)
(with-current-buffer (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id)
(unless (and (not exwm--mwm-hints-decorations) (not force)) (unless (and (not exwm--mwm-hints-decorations) (not force))
(let ((reply (xcb:+request-unchecked+reply exwm--connection (let ((reply (xcb:+request-unchecked+reply exwm--connection
@ -167,6 +170,7 @@ You can still make the X windows floating afterwards."
(defun exwm-manage--set-client-list () (defun exwm-manage--set-client-list ()
"Set _NET_CLIENT_LIST." "Set _NET_CLIENT_LIST."
(exwm--log)
(xcb:+request exwm--connection (xcb:+request exwm--connection
(make-instance 'xcb:ewmh:set-_NET_CLIENT_LIST (make-instance 'xcb:ewmh:set-_NET_CLIENT_LIST
:window exwm--root :window exwm--root
@ -174,6 +178,7 @@ You can still make the X windows floating afterwards."
(cl-defun exwm-manage--get-configurations () (cl-defun exwm-manage--get-configurations ()
"Retrieve configurations for this buffer." "Retrieve configurations for this buffer."
(exwm--log)
(when (derived-mode-p 'exwm-mode) (when (derived-mode-p 'exwm-mode)
(dolist (i exwm-manage-configurations) (dolist (i exwm-manage-configurations)
(save-current-buffer (save-current-buffer
@ -412,6 +417,7 @@ manager is shutting down."
(defun exwm-manage--scan () (defun exwm-manage--scan ()
"Search for existing windows and try to manage them." "Search for existing windows and try to manage them."
(exwm--log)
(let* ((tree (xcb:+request-unchecked+reply exwm--connection (let* ((tree (xcb:+request-unchecked+reply exwm--connection
(make-instance 'xcb:QueryTree (make-instance 'xcb:QueryTree
:window exwm--root))) :window exwm--root)))
@ -433,6 +439,7 @@ manager is shutting down."
(defun exwm-manage--kill-buffer-query-function () (defun exwm-manage--kill-buffer-query-function ()
"Run in `kill-buffer-query-functions'." "Run in `kill-buffer-query-functions'."
(exwm--log "id=#x%x; buffer=%s" exwm--id (current-buffer))
(catch 'return (catch 'return
(when (or (not exwm--id) (when (or (not exwm--id)
(xcb:+request-checked+request-check exwm--connection (xcb:+request-checked+request-check exwm--connection
@ -510,6 +517,7 @@ Would you like to kill it? "
(defun exwm-manage--kill-client (&optional id) (defun exwm-manage--kill-client (&optional id)
"Kill an X client." "Kill an X client."
(unless id (setq id (exwm--buffer->id (current-buffer)))) (unless id (setq id (exwm--buffer->id (current-buffer))))
(exwm--log "id=#x%x" id)
(let* ((response (xcb:+request-unchecked+reply exwm--connection (let* ((response (xcb:+request-unchecked+reply exwm--connection
(make-instance 'xcb:ewmh:get-_NET_WM_PID :window id))) (make-instance 'xcb:ewmh:get-_NET_WM_PID :window id)))
(pid (and response (slot-value response 'value))) (pid (and response (slot-value response 'value)))
@ -526,12 +534,14 @@ Would you like to kill it? "
(defun exwm-manage--add-frame (frame) (defun exwm-manage--add-frame (frame)
"Run in `after-make-frame-functions'." "Run in `after-make-frame-functions'."
(exwm--log "frame=%s" frame)
(when (display-graphic-p frame) (when (display-graphic-p frame)
(push (string-to-number (frame-parameter frame 'outer-window-id)) (push (string-to-number (frame-parameter frame 'outer-window-id))
exwm-manage--frame-outer-id-list))) exwm-manage--frame-outer-id-list)))
(defun exwm-manage--remove-frame (frame) (defun exwm-manage--remove-frame (frame)
"Run in `delete-frame-functions'." "Run in `delete-frame-functions'."
(exwm--log "frame=%s" frame)
(when (display-graphic-p frame) (when (display-graphic-p frame)
(setq exwm-manage--frame-outer-id-list (setq exwm-manage--frame-outer-id-list
(delq (string-to-number (frame-parameter frame 'outer-window-id)) (delq (string-to-number (frame-parameter frame 'outer-window-id))
@ -539,6 +549,7 @@ Would you like to kill it? "
(defun exwm-manage--on-ConfigureRequest (data _synthetic) (defun exwm-manage--on-ConfigureRequest (data _synthetic)
"Handle ConfigureRequest event." "Handle ConfigureRequest event."
(exwm--log)
(let ((obj (make-instance 'xcb:ConfigureRequest)) (let ((obj (make-instance 'xcb:ConfigureRequest))
buffer edges width-delta height-delta) buffer edges width-delta height-delta)
(xcb:unmarshal obj data) (xcb:unmarshal obj data)
@ -631,6 +642,7 @@ border-width: %d; sibling: #x%x; stack-mode: %d"
(let ((obj (make-instance 'xcb:MapRequest))) (let ((obj (make-instance 'xcb:MapRequest)))
(xcb:unmarshal obj data) (xcb:unmarshal obj data)
(with-slots (parent window) obj (with-slots (parent window) obj
(exwm--log "id=#x%x parent=#x%x" window parent)
(if (assoc window exwm--id-buffer-alist) (if (assoc window exwm--id-buffer-alist)
(with-current-buffer (exwm--id->buffer window) (with-current-buffer (exwm--id->buffer window)
(if (exwm-layout--iconic-state-p) (if (exwm-layout--iconic-state-p)
@ -650,12 +662,13 @@ border-width: %d; sibling: #x%x; stack-mode: %d"
(let ((obj (make-instance 'xcb:UnmapNotify))) (let ((obj (make-instance 'xcb:UnmapNotify)))
(xcb:unmarshal obj data) (xcb:unmarshal obj data)
(with-slots (window) obj (with-slots (window) obj
(exwm--log "UnmapNotify from #x%x" window) (exwm--log "id=#x%x" window)
(exwm-manage--unmanage-window window t)))) (exwm-manage--unmanage-window window t))))
(defun exwm-manage--on-DestroyNotify (data synthetic) (defun exwm-manage--on-DestroyNotify (data synthetic)
"Handle DestroyNotify event." "Handle DestroyNotify event."
(unless synthetic (unless synthetic
(exwm--log)
(let ((obj (make-instance 'xcb:DestroyNotify))) (let ((obj (make-instance 'xcb:DestroyNotify)))
(xcb:unmarshal obj data) (xcb:unmarshal obj data)
(exwm--log "DestroyNotify from #x%x" (slot-value obj 'window)) (exwm--log "DestroyNotify from #x%x" (slot-value obj 'window))
@ -664,6 +677,7 @@ border-width: %d; sibling: #x%x; stack-mode: %d"
(defun exwm-manage--init () (defun exwm-manage--init ()
"Initialize manage module." "Initialize manage module."
;; Intern _MOTIF_WM_HINTS ;; Intern _MOTIF_WM_HINTS
(exwm--log)
(let ((atom-name "_MOTIF_WM_HINTS")) (let ((atom-name "_MOTIF_WM_HINTS"))
(setq exwm-manage--_MOTIF_WM_HINTS (setq exwm-manage--_MOTIF_WM_HINTS
(slot-value (xcb:+request-unchecked+reply exwm--connection (slot-value (xcb:+request-unchecked+reply exwm--connection

View file

@ -375,6 +375,7 @@ NIL if FRAME is not a workspace"
(defun exwm-workspace--set-active (frame active) (defun exwm-workspace--set-active (frame active)
"Make frame FRAME active on its output." "Make frame FRAME active on its output."
(exwm--log "active=%s; frame=%s" frame active)
(set-frame-parameter frame 'exwm-active active) (set-frame-parameter frame 'exwm-active active)
(if active (if active
(exwm-workspace--set-fullscreen frame) (exwm-workspace--set-fullscreen frame)
@ -387,6 +388,7 @@ NIL if FRAME is not a workspace"
(defun exwm-workspace--set-fullscreen (frame) (defun exwm-workspace--set-fullscreen (frame)
"Make frame FRAME fullscreen according to `exwm-workspace--workareas'." "Make frame FRAME fullscreen according to `exwm-workspace--workareas'."
(exwm--log "frame=%s" frame)
(let ((workarea (elt exwm-workspace--workareas (let ((workarea (elt exwm-workspace--workareas
(exwm-workspace--position frame))) (exwm-workspace--position frame)))
(id (frame-parameter frame 'exwm-outer-id)) (id (frame-parameter frame 'exwm-outer-id))
@ -396,6 +398,7 @@ NIL if FRAME is not a workspace"
y (aref workarea 1) y (aref workarea 1)
width (aref workarea 2) width (aref workarea 2)
height (aref workarea 3)) height (aref workarea 3))
(exwm--log "x=%s; y=%s; w=%s; h=%s" x y width height)
(when (and (eq frame exwm-workspace--current) (when (and (eq frame exwm-workspace--current)
(exwm-workspace--minibuffer-own-frame-p)) (exwm-workspace--minibuffer-own-frame-p))
(exwm-workspace--resize-minibuffer-frame)) (exwm-workspace--resize-minibuffer-frame))
@ -516,6 +519,7 @@ for internal use only."
(<= 0 current-prefix-arg (exwm-workspace--count))) (<= 0 current-prefix-arg (exwm-workspace--count)))
current-prefix-arg) current-prefix-arg)
(t 0)))) (t 0))))
(exwm--log)
(let* ((frame (exwm-workspace--workspace-from-frame-or-index frame-or-index)) (let* ((frame (exwm-workspace--workspace-from-frame-or-index frame-or-index))
(old-frame exwm-workspace--current) (old-frame exwm-workspace--current)
(index (exwm-workspace--position frame)) (index (exwm-workspace--position frame))
@ -665,6 +669,7 @@ Passing a workspace frame as the first option is for internal use only."
(format "Swap workspace %d with: " (format "Swap workspace %d with: "
(exwm-workspace--position w1)))) (exwm-workspace--position w1))))
(list w1 w2)))) (list w1 w2))))
(exwm--log)
(let ((pos1 (exwm-workspace--position workspace1)) (let ((pos1 (exwm-workspace--position workspace1))
(pos2 (exwm-workspace--position workspace2))) (pos2 (exwm-workspace--position workspace2)))
(if (or (not pos1) (not pos2) (= pos1 pos2)) (if (or (not pos1) (not pos2) (= pos1 pos2))
@ -703,6 +708,7 @@ before it."
(<= 0 current-prefix-arg (exwm-workspace--count))) (<= 0 current-prefix-arg (exwm-workspace--count)))
(list exwm-workspace--current current-prefix-arg)) (list exwm-workspace--current current-prefix-arg))
(t (list exwm-workspace--current 0)))) (t (list exwm-workspace--current 0))))
(exwm--log)
(let ((pos (exwm-workspace--position workspace)) (let ((pos (exwm-workspace--position workspace))
flag start end index) flag start end index)
(if (= nth pos) (if (= nth pos)
@ -928,6 +934,7 @@ INDEX must not exceed the current number of workspaces."
(remq #'exwm-input--on-buffer-list-update (remq #'exwm-input--on-buffer-list-update
buffer-list-update-hook))) buffer-list-update-hook)))
(rename-buffer (concat " " (buffer-name))))))))))) (rename-buffer (concat " " (buffer-name)))))))))))
(exwm--log)
(when buffer-or-name (when buffer-or-name
(with-current-buffer buffer-or-name (with-current-buffer buffer-or-name
(if (derived-mode-p 'exwm-mode) (if (derived-mode-p 'exwm-mode)

View file

@ -360,6 +360,7 @@
(xcb:unmarshal obj data) (xcb:unmarshal obj data)
(setq id (slot-value obj 'window) (setq id (slot-value obj 'window)
atom (slot-value obj 'atom)) atom (slot-value obj 'atom))
(exwm--log "atom=%s(%s)" (x-get-atom-name atom exwm-workspace--current) atom)
(setq buffer (exwm--id->buffer id)) (setq buffer (exwm--id->buffer id))
(if (not (buffer-live-p buffer)) (if (not (buffer-live-p buffer))
;; Properties of unmanaged X windows. ;; Properties of unmanaged X windows.
@ -397,6 +398,7 @@
(setq type (slot-value obj 'type) (setq type (slot-value obj 'type)
id (slot-value obj 'window) id (slot-value obj 'window)
data (slot-value (slot-value obj 'data) 'data32)) data (slot-value (slot-value obj 'data) 'data32))
(exwm--log "atom=%s(%s)" (x-get-atom-name type exwm-workspace--current) type)
(cond (cond
;; _NET_NUMBER_OF_DESKTOPS. ;; _NET_NUMBER_OF_DESKTOPS.
((= type xcb:Atom:_NET_NUMBER_OF_DESKTOPS) ((= type xcb:Atom:_NET_NUMBER_OF_DESKTOPS)