From d1806e91888cc2d56e252299d07cb6af05a3e9d0 Mon Sep 17 00:00:00 2001 From: Philip Date: Sun, 16 Aug 2015 18:53:04 +0000 Subject: Improve code robustness. * exwm-layout.el (exwm-layout-unset-fullscreen) (exwm-layout-set-fullscreen): Use `user-error' rather than `cl-assert'. * exwm-input.el (exwm-input--set-focus): Silently accept unknown ids. (exwm-input--grab-keyboard) (exwm-input--release-keyboard): Silently ignore calls for windows that have no buffer. * exwm-manage.el (exwm-manage--kill-client): Don't throw error when trying to kill a vanished window. --- exwm-input.el | 75 +++++++++++++++++++++++++++++----------------------------- exwm-layout.el | 6 +++-- exwm-manage.el | 7 +++--- 3 files changed, 45 insertions(+), 43 deletions(-) diff --git a/exwm-input.el b/exwm-input.el index 6b41fff5c709..760e5c96dc8b 100644 --- a/exwm-input.el +++ b/exwm-input.el @@ -56,26 +56,27 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (defun exwm-input--set-focus (id) "Set input focus to window ID in a proper way." - (with-current-buffer (exwm--id->buffer id) - (if (and (not exwm--hints-input) - (memq xcb:Atom:WM_TAKE_FOCUS exwm--protocols)) - (progn - (exwm--log "Focus on #x%x with WM_TAKE_FOCUS" id) - (xcb:+request exwm--connection - (make-instance 'xcb:icccm:SendEvent - :destination id - :event (xcb:marshal - (make-instance 'xcb:icccm:WM_TAKE_FOCUS - :window id - :time - exwm-input--timestamp) - exwm--connection)))) - (exwm--log "Focus on #x%x with SetInputFocus" id) - (xcb:+request exwm--connection - (make-instance 'xcb:SetInputFocus - :revert-to xcb:InputFocus:Parent :focus id - :time xcb:Time:CurrentTime))) - (xcb:flush exwm--connection))) + (when (exwm--id->buffer id) + (with-current-buffer (exwm--id->buffer id) + (if (and (not exwm--hints-input) + (memq xcb:Atom:WM_TAKE_FOCUS exwm--protocols)) + (progn + (exwm--log "Focus on #x%x with WM_TAKE_FOCUS" id) + (xcb:+request exwm--connection + (make-instance 'xcb:icccm:SendEvent + :destination id + :event (xcb:marshal + (make-instance 'xcb:icccm:WM_TAKE_FOCUS + :window id + :time + exwm-input--timestamp) + exwm--connection)))) + (exwm--log "Focus on #x%x with SetInputFocus" id) + (xcb:+request exwm--connection + (make-instance 'xcb:SetInputFocus + :revert-to xcb:InputFocus:Parent :focus id + :time xcb:Time:CurrentTime))) + (xcb:flush exwm--connection)))) (defvar exwm-input--focus-window nil "The (Emacs) window to be focused.") (defvar exwm-input--redirected nil @@ -311,27 +312,27 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") (defun exwm-input--grab-keyboard (&optional id) "Grab all key events on window ID." (unless id (setq id (exwm--buffer->id (window-buffer)))) - (cl-assert id) - (when (xcb:+request-checked+request-check exwm--connection - (make-instance 'xcb:GrabKey - :owner-events 0 :grab-window id - :modifiers xcb:ModMask:Any - :key xcb:Grab:Any - :pointer-mode xcb:GrabMode:Async - :keyboard-mode xcb:GrabMode:Async)) - (exwm--log "Failed to grab keyboard for #x%x" id)) - (setq exwm--on-KeyPress 'exwm-input--on-KeyPress-line-mode)) + (when id + (when (xcb:+request-checked+request-check exwm--connection + (make-instance 'xcb:GrabKey + :owner-events 0 :grab-window id + :modifiers xcb:ModMask:Any + :key xcb:Grab:Any + :pointer-mode xcb:GrabMode:Async + :keyboard-mode xcb:GrabMode:Async)) + (exwm--log "Failed to grab keyboard for #x%x" id)) + (setq exwm--on-KeyPress 'exwm-input--on-KeyPress-line-mode))) (defun exwm-input--release-keyboard (&optional id) "Ungrab all key events on window ID." (unless id (setq id (exwm--buffer->id (window-buffer)))) - (cl-assert id) - (when (xcb:+request-checked+request-check exwm--connection - (make-instance 'xcb:UngrabKey - :key xcb:Grab:Any :grab-window id - :modifiers xcb:ModMask:Any)) - (exwm--log "Failed to release keyboard for #x%x" id)) - (setq exwm--on-KeyPress 'exwm-input--on-KeyPress-char-mode)) + (when id + (when (xcb:+request-checked+request-check exwm--connection + (make-instance 'xcb:UngrabKey + :key xcb:Grab:Any :grab-window id + :modifiers xcb:ModMask:Any)) + (exwm--log "Failed to release keyboard for #x%x" id)) + (setq exwm--on-KeyPress 'exwm-input--on-KeyPress-char-mode))) (defun exwm-input-grab-keyboard (&optional id) "Switch to line-mode." diff --git a/exwm-layout.el b/exwm-layout.el index a6b450f7daf5..1ffb3b93fce0 100644 --- a/exwm-layout.el +++ b/exwm-layout.el @@ -93,6 +93,8 @@ "Make window ID fullscreen." (interactive) (with-current-buffer (if id (exwm--id->buffer id) (window-buffer)) + (when exwm--fullscreen + (user-error "Already in full-screen mode.")) ;; Set the floating frame fullscreen first when the client is floating (when exwm--floating-frame (let* ((outer-id (frame-parameter exwm--floating-frame 'exwm-outer-id)) @@ -130,7 +132,6 @@ :window exwm--id :data (vector xcb:Atom:_NET_WM_STATE_FULLSCREEN))) (xcb:flush exwm--connection) - (cl-assert (not exwm--fullscreen)) (setq exwm--fullscreen t) (exwm-input-release-keyboard))) @@ -138,6 +139,8 @@ "Restore window from fullscreen state." (interactive) (with-current-buffer (if id (exwm--id->buffer id) (window-buffer)) + (unless exwm--fullscreen + (user-error "Not in full-screen mode.")) ;; Restore the floating frame if the client is floating (when exwm--floating-frame (xcb:+request exwm--connection @@ -156,7 +159,6 @@ (xcb:+request exwm--connection (make-instance 'xcb:ewmh:set-_NET_WM_STATE :window exwm--id :data [])) (xcb:flush exwm--connection) - (cl-assert exwm--fullscreen) (setq exwm--fullscreen nil) (exwm-input-grab-keyboard))) diff --git a/exwm-manage.el b/exwm-manage.el index ffe21e23e7ad..3274d65c177a 100644 --- a/exwm-manage.el +++ b/exwm-manage.el @@ -260,10 +260,9 @@ corresponding buffer.") "Kill an X client." (interactive) (unless id (setq id (exwm--buffer->id (current-buffer)))) - (let ((pid (slot-value - (xcb:+request-unchecked+reply exwm--connection - (make-instance 'xcb:ewmh:get-_NET_WM_PID :window id)) - 'value))) + (let* ((response (xcb:+request-unchecked+reply exwm--connection + (make-instance 'xcb:ewmh:get-_NET_WM_PID :window id))) + (pid (and response (slot-value response 'value)))) (if pid (signal-process pid 'SIGKILL) (xcb:+request exwm--connection -- cgit 1.4.1