**************************************************************************** transparency2.patch Authors Takashi Hiromatsu Ryo Yoshitake Seiji Zenitani contact: macemacsjp-dev@lists.sourceforge.jp **************************************************************************** Copyright (C) 2005 Takashi Hiromatsu, Ryo Yoshitake, Seiji Zenitani 本プログラムはフリー・ソフトウェアです。 あなたは、Free Software Foundationが公表したGNU 一般公有使用許諾の 「バージョン2」或いはそれ以降の各バージョンの中からいずれかを選択し、 そのバージョンが定める条項に従って本プログラムを 再頒布または変更することができます。 本プログラムは有用とは思いますが、頒布にあたっては、 市場性及び特定目的適合性についての暗黙の保証を含めて、 いかなる保証も行ないません。 詳細についてはGNU 一般公有使用許諾書をお読みください。 GNU一般公有使用許諾は、  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA http://www.gnu.org/licenses/gpl.html から入手可能です。 **************************************************************************** 1. 概要 Mac OSX と Windows 上で動く、Emacs-22.0.50(現CVS先端) に、ウインドウ (Emacs的には、Frame)の透過表示機能を追加する為の、patchです。 このバージョンから、 *frame parameter として設定されます。 *アクティブ、非アクティブで別の透明度が設定できます。 * Mac OSX 上の Emacs: Carbon Emacs と呼ばれています。 透過機能は、10.1ではサポートされていません。 * Windows 上の Emacs: Ntemacs と呼ばれています。 透過機能は、WinNT、Win9*ではサポートされていま せん。 2. ビルドの方法 emacs ソースのトップディレクトリからであれば、 patch -p0 <../transparency2.patch で、パッチが当たります。 コンフィグ、コンパイルにあたって、設定は不要です。実行時に、透明度ルー チンの有無が判定されます。 Emacs 自体のビルドについては、下記を参照ください。 Carbon Emacs http://macemacsjp.sourceforge.jp/ NTEmacs http://homepage.mac.com/matsuan_tamachan/emacs/BuildNtemacs.html 3. 設定 下記、各変数に、0.0〜1.0迄の小数値を設定してください。 0.0: 完全透明(危険です) 1.0: 無透明(Default) カレントフレームに設定する場合 ;; アクティブアルファ (set-active-alpha 0.9) ;; 非アクティブアルファ (set-inactive-alpha 0.8) 又、全てのフレームに設定する場合は、以下のようにします (setq default-frame-alist (append (list '(active-alpha . 0.80) ;; アクティブウィンドウ '(inactive-alpha . 0.4) ;; 非アクティブウィンドウ ) default-frame-alist) ) 4. 関数 (set-active-alpha alpha &optional frame) アクティブ時の透明度を alpha に設定します。オプションで、frame を選べます。 alpha の値は、0.0 (見えない)から、1.0 (不透明)の、小数値で設定出来ます。 対話的に呼び出すと、透明度を設定するプロンプトが現れます。 現在のアクティブ透明度は、`frame-parameters を使って知ることが出来ます。 (set-inactive-alpha alpha &optional frame) 非アクティブ時の透明度を alpha に設定します。オプションで、frame を選べます。 alpha の値は、0.0 (見えない)から、1.0 (不透明)の、小数値で設定出来ます。 対話的に呼び出すと、透明度を設定するプロンプトが現れます。 現在の非アクティブ透明度は、`frame-parameters を使って知ることが出来ます。 5. 応用例 5.1. 別のフレームの透明度を変更する (progn (setq current-frame (car (car (cdr (current-frame-configuration))))) (setq new-frame (make-frame '((top . 40) (left . 200)))) (select-frame-set-input-focus current-frame) ) (set-inactive-alpha 0.2 new-frame) 5.2. こんな遊びも出来ます 最初に、これを評価しておいて、(ファイル名はお好みの物に) (progn (setq frame-current-frame (car (car (cdr (current-frame-configuration))))) (setq buffer-current-buffer (current-buffer)) (setq new-frame1 (make-frame '((top . 40) (left . 300) (inactive-alpha . 1.0) (active-alpha . 1.0)))) (setq new-frame2 (make-frame '((top . 40) (left . 300) (inactive-alpha . 0.0) (active-alpha . 1.0)))) (find-file "~/Pictures/hoge1.jpg") (find-file "~/Pictures/hoge2.jpg") (switch-to-buffer buffer-current-buffer) (select-frame new-frame1) (switch-to-buffer "hoge1.jpg") (select-frame new-frame2) (switch-to-buffer "hoge2.jpg") (select-frame-set-input-focus frame-current-frame) ) その後、これを実行すると、擬似的にフェードインアウトが出来ます。 (let ((increment 0.01) (alpha-i 0.0) (inhibit-eval-during-redisplay t)) (while (<= alpha-i 1.0) (set-inactive-alpha (- 1 alpha-i) new-frame1) (set-inactive-alpha alpha-i new-frame2) (setq alpha-i (+ alpha-i increment)) (sleep-for 0.1)) (select-frame frame-current-frame) ) 5.3. 透明度キーバインド こんな風に、キーで透明度を変えることも出来ます。 (Thanks, Juanma Barranquero) (when (fboundp 'set-active-alpha) (defun lk-change-alpha (increment) (let ((step (abs increment))) (/ (round (+ increment (frame-parameter nil 'active-alpha)) step) (/ 1.0 step)))) (defun lk-opaque () (interactive) (set-active-alpha (min 1.0 (lk-change-alpha 0.01)))) (defun lk-transparent () (interactive) (set-active-alpha (max 0.0 (lk-change-alpha -0.01)))) (global-set-key (kbd "M-") #'lk-transparent) (global-set-key (kbd "M-") #'lk-opaque)) 6. ChangeLog 2005-06-26 2.1.0 frame.el:(set-active-alpha) (set-inactive-alpha) 入力チェックルーチンを付加 オプションで、フレームオブジェクトを取ることができるように変更 alpha が 0.0 - 1.0 の値であることの説明を追加 frame.h: extern x_set_(in)active_alpha を削除 (mac|w32)fns.c: extern void x_set_frame_alpha を追加 x_set_inactive_alpha extern --> static frame parameter の値のチェックルーチンを追加 フレームのアクティブ、非アクティブのチェックを追加 非アクティブフレームも、透明度の変更が、すぐ反映されるように、 x_set_frame_alpha を呼ぶ様に変更 x_set_active_alpha extern --> static frame parameter の値のチェックルーチンを追加 フレームのアクティブ、非アクティブのチェックを追加 独自に持っていた、transparency ルーチンを、x_set_frame_alpha を 呼ぶように変更 w32fns.c: SetLayeredWindowAttributes_Proc set_layered_window_attributes_fn を追加。 透明度設定関数へのポインタを使って、システムバージョン違いに対応。 macterm.c #ifdef での、コンパイル時のシステムバージョン判定を削除し、実行時判 定に変更。 w32term.c set_layered_window_attributes_fn を呼ぶように変更 w32term.h マクロ定義追加 2005-06-13 2.0.1 Bug fix on frame.el 2005-06-10 2.0 吉武さんによる frame parameter 化 NTEmacs 版は、バグフィックス