Update of /project/eclipse/cvsroot/eclipse In directory clnet:/tmp/cvs-serv26719
Modified Files: misc.lisp widgets.lisp input.lisp Log Message: Fix: - configure-window when configuring panel window should honor size without guessing anything (misc.lisp). - map-request race condition (input.lisp & widget.lisp) Added: - application-panel-p predicate (widget.lisp)
--- /project/eclipse/cvsroot/eclipse/misc.lisp 2007/05/07 00:19:10 1.38 +++ /project/eclipse/cvsroot/eclipse/misc.lisp 2007/05/07 13:22:50 1.39 @@ -1,5 +1,5 @@ ;;; -*- Mode: Lisp; Package: ECLIPSE-INTERNALS -*- -;;; $Id: misc.lisp,v 1.38 2007/05/07 00:19:10 ihatchondo Exp $ +;;; $Id: misc.lisp,v 1.39 2007/05/07 13:22:50 ihatchondo Exp $ ;;; ;;; This file is part of Eclipse. ;;; Copyright (C) 2002 Iban HATCHONDO @@ -331,7 +331,7 @@ ;; update sizes. (when (or width height) (with-event-mask ((or parent win)) - (when application + (when (and application (not (application-panel-p application))) ;; ensure width or height are compatible with wm-size-hints. (let* ((prop (netwm:net-wm-state win)) (horz-p (member :_net_wm_state_maximized_horz prop)) --- /project/eclipse/cvsroot/eclipse/widgets.lisp 2007/05/04 08:26:14 1.47 +++ /project/eclipse/cvsroot/eclipse/widgets.lisp 2007/05/07 13:22:50 1.48 @@ -1,5 +1,5 @@ ;;; -*- Mode: Lisp; Package: ECLIPSE-INTERNALS -*- -;;; $Id: widgets.lisp,v 1.47 2007/05/04 08:26:14 ihatchondo Exp $ +;;; $Id: widgets.lisp,v 1.48 2007/05/07 13:22:50 ihatchondo Exp $ ;;; ;;; ECLIPSE. The Common Lisp Window Manager. ;;; Copyright (C) 2000, 2001, 2002 Iban HATCHONDO @@ -274,6 +274,10 @@ (setf (window-priority (if master (widget-window master) window) desk-w) (if desk-w :above :below)))))
+(defun application-panel-p (application) + "Returns t if application is a panel (e.g: _net_wm_window_type_dock)." + (member :_net_wm_window_type_dock (application-type application))) + (defun fullscreenable-p (application) (with-slots (window) application (let ((hint (ignore-errors (xlib:wm-normal-hints window)))) @@ -443,7 +447,8 @@ (if master (multiple-value-bind (x y) (xlib:translate-coordinates window 0 0 *root-window*) - (xlib:reparent-window window *root-window* x y)) + (xlib:reparent-window window *root-window* x y) + (event-process (make-event :destroy-notify) master)) (event-process (make-event :destroy-notify :window window) *root*)) (when state (setf (wm-state window) state) --- /project/eclipse/cvsroot/eclipse/input.lisp 2007/05/07 00:23:05 1.46 +++ /project/eclipse/cvsroot/eclipse/input.lisp 2007/05/07 13:22:50 1.47 @@ -1,5 +1,5 @@ ;;; -*- Mode: Lisp; Package: ECLIPSE-INTERNALS -*- -;;; $Id: input.lisp,v 1.46 2007/05/07 00:23:05 ihatchondo Exp $ +;;; $Id: input.lisp,v 1.47 2007/05/07 13:22:50 ihatchondo Exp $ ;;; ;;; ECLIPSE. The Common Lisp Window Manager. ;;; Copyright (C) 2000, 2001, 2002 Iban HATCHONDO @@ -27,6 +27,30 @@
;; Most general methods.
+(defmethod event-process ((event map-request) null-widget) + ;; When a client has requested to withdraw its top-level and wants then + ;; to map it back so quickly that we haven't got honored yet its withdrawal + ;; demand, this event is in fact send to the wrong parent and should be re + ;; directed to the real parent of the client top-level. + ;; The events schema is: + ;; 1 -> map-request => procede-decoration + ;; 2 -> unmap-notify => unmap master + ;; 3 -> synthetic unmap-notify => undecore-application + ;; 4 -> map-request + ;; What happen is that the client ask for mapping its top-level (4) after + ;; sending the synthetic unmap-notify (3), but WE have not handled it yet + ;; (otherwise said undecore-application has not been called). So Xserver + ;; generates a map-request event for the known parent: US ! But as soon + ;; as undecore-application will occurred we won't be the parent anymore + ;; and this event should rather have been sent to the real parent + ;; (aka the root window). + (with-slots (window (candidat event-window)) event + (multiple-value-bind (children parent) (xlib:query-tree window) + (declare (ignore children)) + (unless (xlib:window-equal candidat parent) + (xlib:send-event parent :map-request + '(:substructure-redirect) :window window :event-window parent))))) + (defmethod event-process ((event mapping-notify) null-widget) (declare (ignorable null-widget)) (with-slots (request start count) event @@ -217,30 +241,7 @@ ;;; Events for master (type: decoration)
(defmethod event-process ((event map-request) (master decoration)) - ;; When a client has requested to withdraw its top-level and wants then - ;; to map it back so quickly that we haven't got honored yet its withdrawal - ;; demand, this event is in fact send to the wrong parent and should be re - ;; directed to the real parent of the client top-level. - ;; The events schema is: - ;; 1 -> map-request => procede-decoration - ;; 2 -> unmap-notify => unmap master - ;; 3 -> synthetic unmap-notify => undecore-application - ;; 4 -> map-request - ;; What happen is that the client ask for mapping its top-level (4) after - ;; sending the synthetic unmap-notify (3), but WE have not handled it yet - ;; (otherwise said undecore-application has not been called). So Xserver - ;; generates a map-request event for the known parent: US ! But as soon - ;; as undecore-application will occurred we won't be the parent anymore - ;; and this event should rather have been sent to the real parent - ;; (aka the root window). - (with-slots (window (parent event-window)) event - (multiple-value-bind (children real-parent) (xlib:query-tree window) - (declare (ignore children)) - (if (xlib:window-equal parent real-parent) - (xlib:map-window (event-window event)) - (xlib:send-event real-parent :map-request - '(:substructure-redirect) - :window window :event-window real-parent))))) + (xlib:map-window (event-window event)))
(defmethod event-process ((event configure-notify) (master decoration)) (with-slots ((master-window event-window) (app-window window)) event