[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/exwm 8d15a39 01/12: Print log output to an EXWM-specifi
From: |
Chris Feng |
Subject: |
[elpa] externals/exwm 8d15a39 01/12: Print log output to an EXWM-specific messages buffer |
Date: |
Sun, 19 Aug 2018 12:45:59 -0400 (EDT) |
branch: externals/exwm
commit 8d15a39c4d4928d9bc38bed63e2bb85e4536af45
Author: Adrián Medraño Calvo <address@hidden>
Commit: Adrián Medraño Calvo <address@hidden>
Print log output to an EXWM-specific messages buffer
Using `message' to log debugging information is cumbersome, as the output
appears constantly in the minibuffer, obscuring prompts and other
information.
In the case of long messages, it might resize the minibuffer, which causes
EXWM
to perform additional actions due to the log output.
This change reimplements EXWM debug logging using a separate
buffer (*EXWM-DEBUG*). Basic functionality, like scrolling when point is
at the
end of the buffer is maintained.
* exwm-core.el (exwm--log): Use `exwm-debug--message' instead of
`message'. Prefix all messages with the name of the function.
Make FORMAT-STRING argument optional.
* exwm-debug.el: New file.
(exwm-debug-buffer): New variable holding the buffer where debug
messages are output to.
(exwm-debug--message): New function printing a message to
`exwm-debug-buffer'.
(exwm-debug--backtrace): New function printing a backtrace.
---
exwm-core.el | 15 +++++++--
exwm-debug.el | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+), 3 deletions(-)
diff --git a/exwm-core.el b/exwm-core.el
index ab5159c..66b7917 100644
--- a/exwm-core.el
+++ b/exwm-core.el
@@ -31,6 +31,7 @@
(require 'xcb)
(require 'xcb-icccm)
(require 'xcb-ewmh)
+(require 'exwm-debug)
(eval-and-compile
(defvar exwm-debug-on nil "Non-nil to turn on debug for EXWM."))
@@ -70,10 +71,18 @@
(declare-function exwm-workspace-move-window "exwm-workspace.el"
(frame-or-index &optional id))
-(defmacro exwm--log (format-string &rest args)
- "Print debug message."
+(defmacro exwm--log (&optional format-string &rest objects)
+ "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
- `(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)
(when exwm-debug-on `(progn ,@forms)))
diff --git a/exwm-debug.el b/exwm-debug.el
new file mode 100644
index 0000000..89421da
--- /dev/null
+++ b/exwm-debug.el
@@ -0,0 +1,104 @@
+;;; exwm-debug.el --- Debugging helpers for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2016 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <address@hidden>
+;; Adrián Medraño Calvo <address@hidden>
+
+;; 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
+ (when exwm-debug-on
+ (let ((buffer (get-buffer-create "*EXWM-DEBUG*")))
+ (buffer-disable-undo buffer)
+ buffer))
+ "Buffer to write debug messages to.")
+
+(defun exwm-debug--call-stack ()
+ "Return the current call stack frames."
+ (let (frames frame
+ ;; No need to acount for our setq, while, let, ...
+ (index 5))
+ (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 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))
+
+
+
+(provide 'exwm-debug)
+
+;;; exwm-debug.el ends here
- [elpa] externals/exwm updated (4d43e31 -> 2b1ed2c), Chris Feng, 2018/08/19
- [elpa] externals/exwm ac600f0 02/12: Commands for interacting with the log buffer remotely, Chris Feng, 2018/08/19
- [elpa] externals/exwm 5c1aa4d 04/12: Consider windows of the frame being refreshed, not the selected one at the time exwm-layout--refresh runs, Chris Feng, 2018/08/19
- [elpa] externals/exwm 633065a 06/12: Don't assume order of `get-buffer-window-list' results, Chris Feng, 2018/08/19
- [elpa] externals/exwm 8d15a39 01/12: Print log output to an EXWM-specific messages buffer,
Chris Feng <=
- [elpa] externals/exwm b6a3b7b 08/12: ; Unimportant tweaks, Chris Feng, 2018/08/19
- [elpa] externals/exwm 11fecb5 05/12: Use more explicit argument for excluding minibuffers, Chris Feng, 2018/08/19
- [elpa] externals/exwm d4a772f 10/12: ; Comment layout algorithm., Chris Feng, 2018/08/19
- [elpa] externals/exwm 2b1ed2c 12/12: Merge branch 'medranocalvo/fix-x-window-vanish' into externals/exwm, Chris Feng, 2018/08/19
- [elpa] externals/exwm 33dec8d 03/12: Trace more functions, Chris Feng, 2018/08/19
- [elpa] externals/exwm f820217 07/12: Split exwm-layout--refresh into three functions, Chris Feng, 2018/08/19
- [elpa] externals/exwm 29f2289 09/12: Consistently name helper windows, Chris Feng, 2018/08/19
- [elpa] externals/exwm be10e26 11/12: Merge branch 'medranocalvo/exwm-log-buffer' into externals/exwm, Chris Feng, 2018/08/19