about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChris Feng <chris.w.feng@gmail.com>2015-08-17T09·47+0800
committerChris Feng <chris.w.feng@gmail.com>2015-08-17T09·47+0800
commit7120291197fb5ceb032671ba02345d181c77399d (patch)
tree9315c2b8a78cb8e5bc687552fc9e74fa0799786d
parentd998b42b89bc9e248b6d2250c56ddd17ec4b17cf (diff)
parentd1806e91888cc2d56e252299d07cb6af05a3e9d0 (diff)
Merge branch 'pipcet-robustness'
-rw-r--r--exwm-input.el75
-rw-r--r--exwm-layout.el6
-rw-r--r--exwm-manage.el7
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