Update of /project/eclipse/cvsroot/eclipse
In directory common-lisp.net:/tmp/cvs-serv6546
Modified Files:
gestures.lisp input.lisp misc.lisp package.lisp widgets.lisp
wm.lisp
Log Message:
add support for icon as described in the exwm spec.
- decode-netwm-icon-pixmap (misc.lisp)
- small impacts in gestures.lisp & widgets.lisp.
add a new callback on the application list root menu:
when no window on a desktop then releasing the mouse button on such an entry
will put you on that desktop. (wm.lisp)
package.lisp updated.
Date: Fri Nov 28 05:13:48 2003
Author: ihatchondo
Index: eclipse/gestures.lisp
diff -u eclipse/gestures.lisp:1.11 eclipse/gestures.lisp:1.12
--- eclipse/gestures.lisp:1.11 Wed Nov 19 05:29:08 2003
+++ eclipse/gestures.lisp Fri Nov 28 05:13:47 2003
@@ -1,5 +1,5 @@
;;; -*- Mode: Lisp; Package: ECLIPSE-INTERNALS -*-
-;;; $Id: gestures.lisp,v 1.11 2003/11/19 10:29:08 ihatchondo Exp $
+;;; $Id: gestures.lisp,v 1.12 2003/11/28 10:13:47 ihatchondo Exp $
;;;
;;; ECLIPSE. The Common Lisp Window Manager.
;;; Copyright (C) 2002 Iban HATCHONDO
@@ -255,7 +255,7 @@
(default-modifiers-p t)
(modifiers :any)
fun)
-" modifiers can be:
+ " modifiers can be:
- composition of modifiers as '(:and :ALT-LEFT :CONTROL-RIGHT)
- a simple modifier as :ALT-LEFT or 18 (a modifier mask)
- a list of possible modifiers as '(:ALT-LEFT :CONTOL-RIGHT)"
@@ -276,7 +276,7 @@
(default-modifiers-p t)
(modifiers :any)
fun)
-" modifiers can be:
+ " modifiers can be:
- composition of modifiers as '(:and :ALT-LEFT :CONTROL-RIGHT)
- a simple modifier as :ALT-LEFT or 18 (a modifier mask)
- a list of possible modifiers as '(:ALT-LEFT :CONTOL-RIGHT)"
@@ -386,9 +386,10 @@
(when (eq direction :below) (incf depth-aux))
(rotatef (nth 0 *windows*) (nth depth-aux *windows*)))))
(when (and *verbose-window-cycling* (car *windows*))
- (with-slots (window) (lookup-widget (car *windows*))
+ (with-slots (window icon) (lookup-widget (car *windows*))
(setf (message-pixmap *current-widget-info*)
- (clx-ext::wm-hints-icon-pixmap window))
+ (or (icon-pixmap-to-free icon)
+ (clx-ext::wm-hints-icon-pixmap window)))
(setf (button-item-to-draw *current-widget-info*) (wm-name window)))
(with-slots (window) *current-widget-info*
(xlib:map-window window)
Index: eclipse/input.lisp
diff -u eclipse/input.lisp:1.23 eclipse/input.lisp:1.24
--- eclipse/input.lisp:1.23 Mon Nov 24 08:44:50 2003
+++ eclipse/input.lisp Fri Nov 28 05:13:47 2003
@@ -1,5 +1,5 @@
;;; -*- Mode: Lisp; Package: ECLIPSE-INTERNALS -*-
-;;; $Id: input.lisp,v 1.23 2003/11/24 13:44:50 ihatchondo Exp $
+;;; $Id: input.lisp,v 1.24 2003/11/28 10:13:47 ihatchondo Exp $
;;;
;;; ECLIPSE. The Common Lisp Window Manager.
;;; Copyright (C) 2000, 2001, 2002 Iban HATCHONDO
@@ -374,16 +374,16 @@
(let* ((cur-desk (window-desktop-num window))
(new-desk (aref data 0))
(master-window (and master (widget-window master)))
- (unmap-p (/= new-desk +any-desktop+ (current-desk))))
+ (unmap-p (/= new-desk +any-desktop+ (current-desk)))
+ (operation (if unmap-p #'xlib:unmap-window #'xlib:map-window)))
(unless (= cur-desk new-desk)
(when (shaded-p application) (shade application))
(setf (window-desktop-num window) new-desk)
- (let ((operation (if unmap-p #'xlib:unmap-window #'xlib:map-window)))
- (with-event-mask (*root-window*)
- (funcall operation (or master-window window))
- (when master-window
- (with-event-mask (master-window)
- (funcall operation window)))))
+ (with-event-mask (*root-window*)
+ (funcall operation (or master-window window))
+ (when master-window
+ (with-event-mask (master-window)
+ (funcall operation window))))
(when unmap-p
(xlib:set-input-focus *display* :pointer-root :pointer-root)))))
(:_NET_CLOSE_WINDOW (close-widget application))
@@ -488,4 +488,4 @@
;;; Events for Message Box
(defmethod event-process ((event visibility-notify) (box box-button))
- (setf (xlib:window-priority (widget-window box)) :above))
\ No newline at end of file
+ (setf (xlib:window-priority (widget-window box)) :above))
Index: eclipse/misc.lisp
diff -u eclipse/misc.lisp:1.14 eclipse/misc.lisp:1.15
--- eclipse/misc.lisp:1.14 Wed Nov 19 05:29:08 2003
+++ eclipse/misc.lisp Fri Nov 28 05:13:47 2003
@@ -1,5 +1,5 @@
;;; -*- Mode: Lisp; Package: ECLIPSE-INTERNALS -*-
-;;; $Id: misc.lisp,v 1.14 2003/11/19 10:29:08 ihatchondo Exp $
+;;; $Id: misc.lisp,v 1.15 2003/11/28 10:13:47 ihatchondo Exp $
;;;
;;; This file is part of Eclipse.
;;; Copyright (C) 2002 Iban HATCHONDO
@@ -29,7 +29,6 @@
"~/"))
directory))
-
;;;; Helpers macros.
(defmacro with-gensym (symbols &body body)
@@ -115,6 +114,32 @@
(or (ignore-errors (netwm:net-wm-icon-name window))
(ignore-errors (xlib:wm-icon-name window))
"incognito"))
+
+(defun decode-netwm-icon-pixmap (window property-vector)
+ "Return a pixmap containing the first icon of the property or NIL."
+ ;;(declare (optimize (speed 3) (safety 1)))
+ (declare (type (or null (simple-vector *)) property-vector))
+ (unless property-vector (return-from decode-netwm-icon-pixmap nil))
+ (loop with depth of-type ppm::card-8 = (xlib:drawable-depth window)
+ with bits-per-pixel = (ppm::find-bits-per-pixel depth)
+ with type = `(unsigned-byte ,depth)
+ with width of-type ppm::card-16 = (aref property-vector 0)
+ with height of-type ppm::card-16 = (aref property-vector 1)
+ with size of-type ppm::card-32 = (* width height)
+ with data = (make-array (list height width) :element-type type)
+ with tmp = (make-array size :displaced-to data :element-type type)
+ for i of-type ppm::card-32 from 2 below (+ 2 size)
+ for argb of-type ppm::card-32 = (aref property-vector i)
+ for r of-type ppm::card-8 = (ldb (byte 8 16) argb)
+ for g of-type ppm::card-8 = (ldb (byte 8 8) argb)
+ for b of-type ppm::card-8 = (ldb (byte 8 0) argb)
+ do (setf (aref tmp (- i 2)) (ppm::get-color r g b))
+ finally (return
+ (xlib:image-pixmap
+ window
+ (xlib:create-image
+ :width width :height height :depth depth
+ :bits-per-pixel bits-per-pixel :data data)))))
(defun window-desktop-num (window)
(or (netwm:net-wm-desktop window) (gnome:win-workspace window)))
Index: eclipse/package.lisp
diff -u eclipse/package.lisp:1.11 eclipse/package.lisp:1.12
--- eclipse/package.lisp:1.11 Mon Nov 24 11:57:46 2003
+++ eclipse/package.lisp Fri Nov 28 05:13:47 2003
@@ -1,5 +1,5 @@
;;; -*- Mode: Lisp; Package: User -*-
-;;; $Id: package.lisp,v 1.11 2003/11/24 16:57:46 ihatchondo Exp $
+;;; $Id: package.lisp,v 1.12 2003/11/28 10:13:47 ihatchondo Exp $
;;;
;;; This file is part of Eclipse.
;;; Copyright (C) 2002 Iban HATCHONDO
@@ -80,6 +80,7 @@
"CREATE-ICON" ;function
"CREATE-MESSAGE-BOX" ;function
"CURRENT-VSCREEN" ;function
+ "DECODE-NETWM-ICON-PIXMAP" ;function
"DECORATION-P" ;function
"DECORATION-THEME" ;setf function
"DECORE-APPLICATION" ;function
Index: eclipse/widgets.lisp
diff -u eclipse/widgets.lisp:1.20 eclipse/widgets.lisp:1.21
--- eclipse/widgets.lisp:1.20 Mon Nov 24 08:12:02 2003
+++ eclipse/widgets.lisp Fri Nov 28 05:13:47 2003
@@ -1,5 +1,5 @@
;;; -*- Mode: Lisp; Package: ECLIPSE-INTERNALS -*-
-;;; $Id: widgets.lisp,v 1.20 2003/11/24 13:12:02 ihatchondo Exp $
+;;; $Id: widgets.lisp,v 1.21 2003/11/28 10:13:47 ihatchondo Exp $
;;;
;;; ECLIPSE. The Common Lisp Window Manager.
;;; Copyright (C) 2000, 2001, 2002 Iban HATCHONDO
@@ -557,33 +557,37 @@
(defclass icon (push-button)
((desiconify-p :initform nil :accessor icon-desiconify-p)
(creation-time :initform (get-universal-time) :accessor icon-creation-time)
- (application :initarg :application :reader icon-application)))
+ (application :initarg :application :reader icon-application)
+ (pixmap-to-free :initform nil :reader icon-pixmap-to-free)))
(defun icon-p (widget)
(typep widget 'icon))
(defun create-icon (application master &optional (bg-color *black*))
(with-slots (window icon gcontext) application
- (let ((background (clx-ext::wm-hints-icon-pixmap window))
- (width 45) (height 20))
+ (let* ((bkgrd (decode-netwm-icon-pixmap window (netwm:net-wm-icon window)))
+ (width 45) (height 20) (pixmap-to-free bkgrd))
+ (unless bkgrd
+ (setf bkgrd (ignore-errors (clx-ext::wm-hints-icon-pixmap window))))
(ignore-errors
- (if (typep background 'xlib:pixmap)
- (multiple-value-setq (width height) (drawable-sizes background))
- (setf background nil)))
+ (if (typep bkgrd 'xlib:pixmap)
+ (multiple-value-setq (width height) (drawable-sizes bkgrd))
+ (setf bkgrd nil)))
(ignore-errors
- (when (and background (= 1 (xlib:drawable-depth background)))
+ (when (and bkgrd (= 1 (xlib:drawable-depth bkgrd)))
(let ((pix (xlib:create-pixmap
:drawable window :width width :height height
:depth (xlib:drawable-depth window))))
- (xlib:copy-plane background gcontext 1 0 0 width height pix 0 0)
- (setf background pix))))
+ (xlib:copy-plane bkgrd gcontext 1 0 0 width height pix 0 0)
+ (setf bkgrd pix))))
(setf icon (create-button
'icon
:parent *root-window* :master master
:x 0 :y 0 :width width :height height
- :item (unless background (wm-icon-name window))
- :background (or background bg-color))
- (slot-value icon 'application) application)
+ :item (unless bkgrd (wm-icon-name window))
+ :background (or bkgrd bg-color)))
+ (setf (slot-value icon 'pixmap-to-free) pixmap-to-free)
+ (setf (slot-value icon 'application) application)
icon)))
(defun icon-sort-creation-order (icon1 icon2)
@@ -651,6 +655,11 @@
(xlib:with-state (icon-window)
(setf (window-position icon-window) (values basex basey)))))
(setq prev-icon-window icon-window)))))))
+
+(defmethod remove-widget :after ((widget icon))
+ (with-slots (pixmap-to-free) widget
+ (when pixmap-to-free
+ (xlib:free-pixmap pixmap-to-free))))
(defmethod repaint ((widget icon) theme-name focus)
(declare (ignorable theme-name focus))
Index: eclipse/wm.lisp
diff -u eclipse/wm.lisp:1.24 eclipse/wm.lisp:1.25
--- eclipse/wm.lisp:1.24 Mon Nov 24 11:57:46 2003
+++ eclipse/wm.lisp Fri Nov 28 05:13:47 2003
@@ -1,5 +1,5 @@
;;; -*- Mode: Lisp; Package: ECLIPSE-INTERNALS -*-
-;;; $Id: wm.lisp,v 1.24 2003/11/24 16:57:46 ihatchondo Exp $
+;;; $Id: wm.lisp,v 1.25 2003/11/28 10:13:47 ihatchondo Exp $
;;;
;;; ECLIPSE. The Common Lisp Window Manager.
;;; Copyright (C) 2000, 2001, 2002 Iban HATCHONDO
@@ -592,11 +592,13 @@
(1 (change-vscreen root :n index))
(3 (uniconify (slot-value (lookup-widget window) 'icon))))
(put-on-top (lookup-widget window))))
- (make-desktop-entries (index)
- (loop for w in (screen-content index :iconify-p t)
+ (make-desktop-entries (i)
+ (loop for w in (screen-content i :iconify-p t)
for state = (= 1 (first (wm-state w)))
- collect (cons (format nil "~:[[ ~A ]~;~A~]" state (wm-name w))
- (raise w index)))))
+ for name = (format nil "~:[[ ~A ]~;~A~]" state (wm-name w))
+ collect (cons name (raise w i)) into entries
+ finally
+ (return (or entries (lambda () (change-vscreen root :n i)))))))
(make-desktop-menu root #'make-desktop-entries :realize t)))
(defun make-menu-button-menu (master)