Location: lg@xxxxxxxxxxxxxx http://arch.xwem.org/2005/
Revision: xwem--main--2.1--patch-3
Archive: lg@xxxxxxxxxxxxxx
Creator: Zajcev Evgeny <lg@xxxxxxxx>
Date: Sun Jan 16 03:16:39 MSK 2005
Standard-date: 2005-01-16 00:16:39 GMT
Modified-files: lisp/xwem-tray.el utils/xwem-osd.el
New-patches: lg@xxxxxxxxxxxxxx/xwem--main--2.1--patch-3
Summary: osd fixes, enhancements
Keywords: osd, tray, offscreen, commit
* lisp/xwem-tray.el (xwem-tray-hide-dapp): [fix] Do not XUnmapWindow if
dockapp already unmapped, prevents infinite UnmapNotify events loop.
* lisp/xwem-tray.el (xwem-tray-show-dapp): [fix] Do not XMapWindow if
dockapp already mapped, prevents infinite MapNotify events loop.
* utils/xwem-osd.el (xwem-osd-apply-xmask): [new] Function to apply OSD
mask to life. Note: deffered.
* utils/xwem-osd.el (xwem-osd-show): Use xwem-osd-apply-xmask
* utils/xwem-osd.el (xwem-osd-arc-add): [bug] Fixed, forgot
`xwem-osd-instance-show'. Related to colours problem ignotus has.
* utils/xwem-osd.el (xwem-osd-rect-add): [bug] Fixed, forgot
`xwem-osd-instance-show'. Related to colours problem ignotus has.
* utils/xwem-osd.el (MOST): Use `xwem-osd-apply-xmask', so mask applied
only once, prevents flicking.
* utils/xwem-osd.el (xwem-osd-offscreen): [new] Move OSD to offscreen to
performe OSD operationgs in safety. Copy of OSD is displayed on top of
OSD. Usefull to prevent OSD flicking, when redrawing.
* utils/xwem-osd.el (xwem-osd-commit): [new] Commit changes to OSD while
OSD was in offscreen.
* added files
{arch}/xwem/xwem--main/xwem--main--2.1/lg@xxxxxxxxxxxxxx/patch-log/patch-3
* modified files
--- orig/lisp/xwem-tray.el
+++ mod/lisp/xwem-tray.el
@@ -493,10 +493,12 @@
(X-Geom-y (xwem-dapp-geom dapp)))))))
xwem-tray-dapp-list))))
-(defun xwem-tray-hide-dapp (hide-dapp)
- "Hide dockapp DAPP temporary."
+(defun xwem-tray-hide-dapp (hide-dapp &optional unmap-p)
+ "Hide dockapp DAPP temporary.
+Non-nil UNMAP-P mean dockapp already unmapped."
(unless (eq (xwem-dapp-state hide-dapp) 'hidden)
- (XUnmapWindow (xwem-dpy) (xwem-dapp-xwin hide-dapp))
+ (unless unmap-p
+ (XUnmapWindow (xwem-dpy) (xwem-dapp-xwin hide-dapp)))
(setf (xwem-dapp-state hide-dapp) 'hidden)
(let ((dgeom (xwem-dapp-geom hide-dapp)))
@@ -522,10 +524,12 @@
(X-Geom-y (xwem-dapp-geom
dapp))))))))
xwem-tray-dapp-list))))
-(defun xwem-tray-show-dapp (show-dapp)
- "Show dockapp SHOW-DAPP that was hidden temporary."
+(defun xwem-tray-show-dapp (show-dapp &optional map-p)
+ "Show dockapp SHOW-DAPP that was hidden temporary.
+Non-nil MAP-P mean dock app already mapped."
(unless (eq (xwem-dapp-state show-dapp) 'shown)
- (XMapWindow (xwem-dpy) (xwem-dapp-xwin show-dapp))
+ (unless map-p
+ (XMapWindow (xwem-dpy) (xwem-dapp-xwin show-dapp)))
(setf (xwem-dapp-state show-dapp) 'shown)
(let ((dgeom (xwem-dapp-geom show-dapp)))
@@ -780,12 +784,12 @@
(:X-UnmapNotify
(let ((dapp (xwem-tray-find-dapp (X-Event-xunmap-window xev))))
(when (xwem-dapp-alive-p dapp)
- (xwem-tray-hide-dapp dapp))))
+ (xwem-tray-hide-dapp dapp t))))
(:X-MapNotify
(let ((dapp (xwem-tray-find-dapp (X-Event-xunmap-window xev))))
(when (xwem-dapp-alive-p dapp)
- (xwem-tray-show-dapp dapp))))
+ (xwem-tray-show-dapp dapp t))))
(:X-ConfigureNotify
(when (eq (X-Event-xconfigure-window xev)
--- orig/utils/xwem-osd.el
+++ mod/utils/xwem-osd.el
@@ -162,6 +162,11 @@
(setf (xwem-osd-plist osd)
(plist-remprop (xwem-osd-plist osd) prop)))
+(defmacro xwem-osd-xwin-copy (osd)
+ `(xwem-osd-get-prop ,osd 'xwin-copy))
+(defsetf xwem-osd-xwin-copy (osd) (xwin)
+ `(xwem-osd-put-prop ,osd 'xwin-copy ,xwin))
+
;;; Functions
(defun xwem-osd-event-handler (xdpy xwin xev)
@@ -419,7 +424,7 @@
(defun xwem-osd-show (osd)
"Show OSD's window."
- (X-XShapeMask (xwem-osd-xdpy osd) (xwem-osd-xwin osd) X-XShape-Bounding
X-XShapeSet 0 0 (xwem-osd-xmask osd))
+ (xwem-osd-apply-xmask-1 osd)
(XMapWindow (xwem-osd-xdpy osd) (xwem-osd-xwin osd))
(XRaiseWindow (xwem-osd-xdpy osd) (xwem-osd-xwin osd))
@@ -482,7 +487,10 @@
"Clear OSD window."
(xwem-osd-destroy-instances osd)
(xwem-osd-clear-mask osd)
+ (xwem-osd-apply-xmask osd))
+(define-xwem-deffered xwem-osd-apply-xmask (osd)
+ "Apply OSD's mask to life."
(X-XShapeMask (xwem-osd-xdpy osd) (xwem-osd-xwin osd)
X-XShape-Bounding X-XShapeSet 0 0 (xwem-osd-xmask osd)))
@@ -498,9 +506,7 @@
(xwem-osd-clear-mask osd)
(XDrawString xdpy (xwem-osd-xmask osd) (xwem-osd-mask-gc osd)
0 yoff string)
- (X-XShapeMask xdpy (xwem-osd-xwin osd)
- X-XShape-Bounding X-XShapeSet 0 0 (xwem-osd-xmask osd))
- ))
+ (xwem-osd-apply-xmask osd)))
(defun xwem-osd-color-text (osd strspec-list)
"In OSD's win draw colored text specified by STRSPEC-LIST."
@@ -514,8 +520,7 @@
(xwem-osd-set-xwin-color osd (cdr strspec))
(XDrawString xdpy (xwem-osd-xmask osd) (xwem-osd-mask-gc osd)
0 yoff str)
- (X-XShapeMask xdpy (xwem-osd-xwin osd)
- X-XShape-Bounding X-XShapeSet 0 0
(xwem-osd-xmask osd))
+ (xwem-osd-apply-xmask osd)
(setq curstr (concat curstr (car strspec)))))
strspec-list)))
@@ -539,8 +544,7 @@
;; Update window shape
(XDrawString xdpy (xwem-osd-xmask osd) (xwem-osd-mask-gc osd)
x (+ y yoff) string)
- (X-XShapeMask xdpy (xwem-osd-xwin osd)
- X-XShape-Bounding X-XShapeUnion 0 0 (xwem-osd-xmask osd))
+ (xwem-osd-apply-xmask osd)
osin))
(defun xwem-osd-set-line-width (osd new-line-width)
@@ -569,8 +573,7 @@
;; Update OSD window shape
(XDrawLine xdpy (xwem-osd-xmask osd) (xwem-osd-mask-gc osd)
x0 y0 x1 y1)
- (X-XShapeMask (xwem-osd-xdpy osd) (xwem-osd-xwin osd)
- X-XShape-Bounding X-XShapeUnion 0 0 (xwem-osd-xmask osd))
+ (xwem-osd-apply-xmask osd)
osin))
(defun xwem-osd-dots-add (osd dots type &optional depth color)
@@ -590,8 +593,7 @@
;; Update OSD window shape
(xwem-diag-plot-dots type (xwem-osd-xmask osd) (xwem-osd-mask-gc osd)
0 (xwem-osd-height osd) dots)
- (X-XShapeMask (xwem-osd-xdpy osd) (xwem-osd-xwin osd)
- X-XShape-Bounding X-XShapeUnion 0 0 (xwem-osd-xmask osd))
+ (xwem-osd-apply-xmask osd)
osin))
(defun xwem-osd-arc-add (osd xarc &optional depth color)
@@ -606,12 +608,12 @@
(list xarc))
(X-XShapeMask xdpy (xwem-osd-instance-xwin osin)
X-XShape-Bounding X-XShapeSet 0 0 (xwem-osd-instance-xmask
osin))
+ (xwem-osd-instance-show osin)
;; Update OSD shape
(XDrawArcs xdpy (xwem-osd-xmask osd) (xwem-osd-mask-gc osd)
(list xarc))
- (X-XShapeMask (xwem-osd-xdpy osd) (xwem-osd-xwin osd)
- X-XShape-Bounding X-XShapeUnion 0 0 (xwem-osd-xmask osd))
+ (xwem-osd-apply-xmask osd)
osin))
(defun xwem-osd-rect-add (osd x y width height &optional depth color fill-p)
@@ -628,13 +630,13 @@
fill-p)
(X-XShapeMask xdpy (xwem-osd-instance-xwin osin)
X-XShape-Bounding X-XShapeSet 0 0 (xwem-osd-instance-xmask
osin))
+ (xwem-osd-instance-show osin)
;; Update OSD shape
(XDrawRectangles xdpy (xwem-osd-xmask osd) (xwem-osd-mask-gc osd)
(list (make-X-Rect :x x :y y :width width :height height))
fill-p)
- (X-XShapeMask (xwem-osd-xdpy osd) (xwem-osd-xwin osd)
- X-XShape-Bounding X-XShapeUnion 0 0 (xwem-osd-xmask osd))
+ (xwem-osd-apply-xmask osd)
osin))
(defun xwem-osd-icon-data-add (osd xpm-data &optional x y depth)
@@ -670,8 +672,7 @@
;; Update OSD shape
(XImagePut xdpy gc (xwem-osd-xmask osd) x y ximg-shape)
- (X-XShapeMask (xwem-osd-xdpy osd) (xwem-osd-xwin osd)
- X-XShape-Bounding X-XShapeUnion 0 0 (xwem-osd-xmask osd)))
+ (xwem-osd-apply-xmask osd))
(XFreeGC xdpy gc)
;; Draw Image
@@ -696,6 +697,30 @@
(xwem-osd-icon-data-add osd xpm-data x y depth)))
+(defun xwem-osd-offscreen (osd)
+ "Put OSD off the screen, displaying OSD copy.
+Usefull to prevent flicking."
+ (if (xwem-osd-xwin-copy osd)
+ (XResizeWindow (xwem-osd-xdpy osd) (xwem-osd-xwin-copy osd)
+ (xwem-osd-width osd) (xwem-osd-height osd))
+ (setf (xwem-osd-xwin-copy osd)
+ (XCreateWindow (xwem-osd-xdpy osd) (xwem-osd-xwin osd)
+ 0 0
+ (xwem-osd-width osd) (xwem-osd-height osd)
+ 0
+ nil nil nil (make-X-Attr :override-redirect t))))
+
+ (XCopyArea (xwem-osd-xdpy osd)
+ (xwem-osd-xwin osd) (xwem-osd-xwin-copy osd)
+ (xwem-osd-gc osd)
+ 0 0 (xwem-osd-width osd) (xwem-osd-height osd)
+ 0 0)
+ (XMapWindow (xwem-osd-xdpy osd) (xwem-osd-xwin-copy osd)))
+
+(defun xwem-osd-commit (osd)
+ "Commit changes made while OSD was in off screen."
+ (XUnmapWindow (xwem-osd-xdpy osd) (xwem-osd-xwin-copy osd)))
+
;;; You might consider more powerfull `working' package, which is part
;;; of CEDET.
(defun xwem-osd-working-bar-display (tot-len percents)
|