1 ;;; xwem-frametrans.el --- Transparency frames support.
3 ;; Copyright (C) 2004,2005 by XWEM Org.
5 ;; Author: Zajcev Evgeny <zevlg@yandex.ru>
6 ;; Created: Thu Dec 2 10:35:14 MSK 2004
8 ;; X-CVS: $Id: xwem-frametrans.el,v 1.2 2005-04-04 19:54:12 lg Exp $
10 ;; This file is part of XWEM.
12 ;; XWEM is free software; you can redistribute it and/or modify it
13 ;; under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 2, or (at your option)
17 ;; XWEM is distributed in the hope that it will be useful, but WITHOUT
18 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
20 ;; License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with XEmacs; see the file COPYING. If not, write to the Free
24 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 ;;; Synched up with: Not in FSF
31 ;; Not yet fully functional. To start using it do:
33 ;; (add-hook 'xwem-frame-creation-hook 'xwem-ft-mask-init)
35 ;; It will apply masking to every newly created frame.
37 ;; For masking on already exsting frame, do something like:
39 ;; H-: (xwem-ft-mask-init (xwem-frame-selected))
45 (require 'xlib-xshape)
48 (defstruct xwem-frame-ft
58 (defmacro xwem-frame-ft-get-prop (xff prop)
59 `(plist-get (xwem-frame-ft-plist ,xff) ,prop))
60 (defmacro xwem-frame-ft-rem-prop (xff prop)
61 `(setf (xwem-frame-ft-plist ,xff)
62 (plist-remprop (xwem-frame-ft-plist ,xff) ,prop)))
63 (defmacro xwem-frame-ft-set-prop (xff prop val)
65 (setf (xwem-frame-ft-plist ,xff)
66 (plist-put (xwem-frame-ft-plist ,xff) ,prop ,val))
67 (xwem-frame-ft-rem-prop ,xff ,prop)))
71 (define-xwem-deffered xwem-ft-fill-mask (frame)
72 "Fill the FRAME with mask."
73 (let* ((xff (and (xwem-frame-p frame)
74 (xwem-frame-get-prop frame 'xwem-frame-ft)))
75 (mask (and xff (xwem-frame-ft-mask xff)))
76 (xgc (and xff (xwem-frame-ft-gc xff)))
77 (xmgc (and xff (xwem-frame-ft-bgc xff))))
78 ; (plist (and xff (xwem-frame-ft-plist xff))))
79 (when (and (X-Pixmap-p mask)
82 (XFillRectangle (xwem-dpy) mask xgc 0 0
83 (xwem-frame-width frame) (xwem-frame-height frame))
84 (xwem-win-map #'(lambda (w)
85 (XFillRectangle (xwem-dpy) mask xmgc
87 (xwem-win-border-width w))
89 (xwem-win-border-width w))
91 (xwem-win-border-width w)
92 (xwem-win-border-width w))
93 (- (xwem-win-height w)
94 (xwem-win-border-width w)
95 (xwem-win-border-width w)))
96 (let ((cl (xwem-win-cl w))
98 (when (and (xwem-cl-p cl) (xwem-cl-active-p cl))
99 (setq clg (xwem-cl-xgeom cl))
100 (XFillRectangle (xwem-dpy) mask xgc
103 (X-Geom-width-with-borders clg)
104 (X-Geom-height-with-borders clg)))))
105 (xwem-frame-selwin frame))
106 (X-XShapeMask (xwem-dpy) (xwem-frame-xwin frame)
107 X-XShape-Bounding X-XShapeSet 0 0 mask))))
109 (defun xwem-ft-mask-init (frame &optional ft-properties)
110 "Initialize transparency mask for FRAME."
111 (let* ((xpx (XCreatePixmap (xwem-dpy) (make-X-Pixmap :dpy (xwem-dpy) :id (X-Dpy-get-id (xwem-dpy)))
112 (xwem-frame-xwin frame) 1
113 (xwem-frame-width frame) (xwem-frame-height frame)))
114 (gc xwem-misc-mask-fgc)
115 (bgc xwem-misc-mask-bgc))
117 (XFillRectangle (xwem-dpy) xpx gc 0 0
118 (xwem-frame-width frame)
119 (xwem-frame-height frame))
120 (xwem-frame-put-prop frame 'xwem-frame-ft
121 (make-xwem-frame-ft :frame frame
125 :saved-height (xwem-frame-height frame)
126 :saved-width (xwem-frame-width frame)
127 :plist ft-properties))
129 (xwem-ft-fill-mask frame)))
131 (define-xwem-deffered xwem-ft-mask-resize (frame)
132 "Resize FRAME's transparency mask."
133 (let ((xff (and (xwem-frame-p frame)
134 (xwem-frame-get-prop frame 'xwem-frame-ft))))
136 (when (or (not (xwem-frame-ft-saved-height xff))
137 (not (xwem-frame-ft-saved-width xff))
138 (> (xwem-frame-width frame)
139 (xwem-frame-ft-saved-width xff))
140 (> (xwem-frame-height frame)
141 (xwem-frame-ft-saved-height xff)))
143 (XFreePixmap (xwem-dpy) (xwem-frame-ft-mask xff))
145 (setf (xwem-frame-ft-mask xff)
146 (XCreatePixmap (xwem-dpy) (make-X-Pixmap :dpy (xwem-dpy)
147 :id (X-Dpy-get-id (xwem-dpy)))
148 (xwem-frame-xwin frame) 1
149 (xwem-frame-width frame) (xwem-frame-height frame)))
150 (setf (xwem-frame-ft-saved-width xff) (xwem-frame-width frame))
151 (setf (xwem-frame-ft-saved-height xff) (xwem-frame-height frame))
154 (defun xwem-ft-mask-deinit (frame)
155 "Denitialize transparency mask for FRAME."
156 (let* ((xff (and (xwem-frame-p frame)
157 (xwem-frame-get-prop frame 'xwem-frame-ft)))
158 (xpx (xwem-frame-ft-mask xff)))
159 (xwem-frame-rem-prop frame 'xwem-frame-ft)
160 (XFreePixmap (xwem-dpy) xpx)
161 (X-XShapeMask (xwem-dpy) (xwem-frame-xwin frame)
162 X-XShape-Bounding X-XShapeSet 0 0 nil)))
164 (defun xwem-frame-set-transparency (frame prop val)
165 "Set frame transparency."
166 (xwem-frame-put-prop frame prop val)
169 (xwem-ft-mask-init frame)
170 (xwem-ft-mask-deinit frame)))
172 (defun xwem-frame-get-transparency (frame prop)
173 "Return FRAME's transparency."
174 (xwem-frame-get-prop frame prop))
177 ;;;###autoload(autoload 'xwem-frame-transparency "xwem-frametrans" nil t)
178 (define-xwem-command xwem-frame-transparency (frame &optional toggle)
179 "Toggle transparency for FRAME.
180 If TOGGLE is positive number - enable.
181 If TOGGLE is negative number - disable."
182 (xwem-interactive (list (xwem-frame-selected)
185 (xwem-frame-set-property
188 (not (xwem-frame-property frame 'transparency))
189 (> (prefix-numeric-value toggle) 0))))
192 (provide 'xwem-frametrans)
195 (add-hook 'xwem-frame-resize-hook 'xwem-ft-mask-resize)
197 (defadvice xwem-win-set-cl (after trans-frame activate)
198 "Fill frame when window changes its client."
199 (xwem-ft-fill-mask (xwem-win-frame (ad-get-arg 0))))
201 (defadvice xwem-win-redraw-win-1 (after trans-frame activate)
202 "Fill frame transparency mask."
203 (xwem-ft-fill-mask (xwem-win-frame (ad-get-arg 0))))
205 (define-xwem-frame-property transparency
206 "Make frame to be transparent."
208 :set 'xwem-frame-set-transparency
209 :get 'xwem-frame-get-transparency)
211 ;;; xwem-frametrans.el ends here