From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Seiji Zenitani Newsgroups: gmane.emacs.devel Subject: new frame-parameter "alpha" Date: Fri, 14 Mar 2008 07:02:34 -0400 Message-ID: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 (Apple Message framework v753) Content-Type: multipart/mixed; boundary=Apple-Mail-37--447911808 X-Trace: ger.gmane.org 1205492606 3655 80.91.229.12 (14 Mar 2008 11:03:26 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 14 Mar 2008 11:03:26 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Mar 14 12:03:53 2008 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1Ja7hP-00071A-BB for ged-emacs-devel@m.gmane.org; Fri, 14 Mar 2008 12:03:44 +0100 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Ja7gq-0004ny-8x for ged-emacs-devel@m.gmane.org; Fri, 14 Mar 2008 07:03:08 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Ja7gm-0004mT-97 for emacs-devel@gnu.org; Fri, 14 Mar 2008 07:03:04 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Ja7gk-0004lX-La for emacs-devel@gnu.org; Fri, 14 Mar 2008 07:03:03 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Ja7gk-0004lJ-Bx for emacs-devel@gnu.org; Fri, 14 Mar 2008 07:03:02 -0400 Original-Received: from smtpoutm.mac.com ([17.148.16.80]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Ja7gj-0005eL-Ks for emacs-devel@gnu.org; Fri, 14 Mar 2008 07:03:02 -0400 Original-Received: from mac.com (asmtp008-s [10.150.69.71]) by smtpoutm.mac.com (Xserve/smtpout017/MantshX 4.0) with ESMTP id m2EB2xwY013784 for ; Fri, 14 Mar 2008 04:02:59 -0700 (PDT) Original-Received: from [10.0.1.200] (c-98-204-109-185.hsd1.md.comcast.net [98.204.109.185]) (authenticated bits=0) by mac.com (Xserve/asmtp008/MantshX 4.0) with ESMTP id m2EB2v8w004060 for ; Fri, 14 Mar 2008 04:02:58 -0700 (PDT) X-Mailer: Apple Mail (2.753) X-detected-kernel: by monty-python.gnu.org: FreeBSD 4.7-5.2 (or MacOS X 10.2-10.4) (1) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:92524 Archived-At: --Apple-Mail-37--447911808 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Hi, The attached patch adds the window (frame) opacity feature to GNU Emacs. The user can control the frame opacity via a frame parameter 'alpha'. If you like the code, I'll start to contact major contributors. Tested on: * Emacs 23.0.60 (CVS 2008-03-13; i686-pc-linux-gnu, GTK+ Version 2.12.0) * Ubuntu Linux 7.10 * It may not work on older X11 systems (X11R6.x) Elisp syntax: We can use both a floating point number (0.0-1.0) as well as an integer number (0-100). (set-frame-parameter nil 'alpha 80) (set-frame-parameter nil 'alpha 0.8) (set-frame-parameter nil 'alpha '( [])) (set-frame-parameter nil 'alpha '(100 70)) (set-frame-parameter nil 'alpha '(nil 70)) (set-frame-parameter nil 'alpha '(0.8 nil)) (set-frame-parameter nil 'alpha nil) ;; nil = default = opaque (set-alpha 80) (set-alpha 0.8) (set-alpha '(100 0.7)) (set-alpha nil) (setq frame-alpha-lower-limit 20) (setq frame-alpha-lower-limit 0.2) Contributors: * Ryo Yoshitake (frame parameter code, x_set_frame_alpha function) * Seiji Zenitani (x_set_alpha function) * Meadow devel team (the original version of x_set_alpha function) * Takashi Hiromatsu (the author of the initial version) * Yoichi Nakayama (minor improvement to x_set_frame_alpha function) --Apple-Mail-37--447911808 Content-Transfer-Encoding: quoted-printable Content-Type: application/octet-stream; x-unix-mode=0644; name=transparency4-x23.patch Content-Disposition: attachment; filename=transparency4-x23.patch diff=20-Naur=20emacs.orig/lisp/frame.el=20emacs.new/lisp/frame.el=0A---=20= emacs.orig/lisp/frame.el=092008-02-14=2016:16:36.000000000=20-0500=0A+++=20= emacs.new/lisp/frame.el=092008-03-13=2007:10:40.000000000=20-0400=0A@@=20= -1079,6=20+1079,17=20@@=0A=20=20=20(modify-frame-parameters=20= (selected-frame)=0A=20=09=09=09=20=20=20(list=20(cons=20'border-color=20= color-name))))=0A=20=0A+=20=20(defun=20set-alpha=20(alpha=20&optional=20= frame)=0A+=20=20=20=20"Set=20the=20opacity=20of=20FRAME=20to=20ALPHA.=20=20= First=20argument=20ALPHA=20=0A+should=20range=20from=200=20(invisible)=20= to=20100=20(completely=20opaque).=0A+You=20can=20also=20use=20an=20= floating=20point=20number=200.0=20to=201.0.=0A+When=20called=20= interactively,=20prompt=20for=20the=20value=20of=20the=20opacity=20to=20= set.=0A+FRAME=20defaults=20to=20the=20selected=20frame.=20=20To=20get=20= the=20frame's=20current=0A+alpha=20value=20state,=20use=20= `frame-parameters'."=0A+=20=20=20=20(interactive=20"XWindow=20Opacity=20= (0-100=20or=200.0-1.0)=20:=20")=0A+=20=20=20=20(modify-frame-parameters=20= frame=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(list=20(cons=20'alpha=20alpha))))=0A+=0A=20(defun=20= auto-raise-mode=20(arg)=0A=20=20=20"Toggle=20whether=20or=20not=20the=20= selected=20frame=20should=20auto-raise.=0A=20With=20arg,=20turn=20= auto-raise=20mode=20on=20if=20and=20only=20if=20arg=20is=20positive.=0A= diff=20-Naur=20emacs.orig/src/frame.c=20emacs.new/src/frame.c=0A---=20= emacs.orig/src/frame.c=092008-02-11=2023:03:16.000000000=20-0500=0A+++=20= emacs.new/src/frame.c=092008-03-13=2007:10:40.000000000=20-0400=0A@@=20= -67,6=20+67,12=20@@=0A=20=0A=20Lisp_Object=20Vx_resource_class;=0A=20=0A= +#ifdef=20HAVE_X_WINDOWS=0A+/*=20Lower=20limit=20value=20of=20frame=20= transparency.=20=20*/=0A+=0A+Lisp_Object=20Vframe_alpha_lower_limit;=0A= +#endif=0A+=0A=20#endif=0A=20=0A=20Lisp_Object=20Qframep,=20= Qframe_live_p;=0A@@=20-120,6=20+126,9=20@@=0A=20#ifdef=20= USE_FONT_BACKEND=0A=20Lisp_Object=20Qfont_backend;=0A=20#endif=09/*=20= USE_FONT_BACKEND=20*/=0A+#ifdef=20HAVE_X_WINDOWS=0A+Lisp_Object=20= Qalpha;=0A+#endif=0A=20=0A=20Lisp_Object=20= Qinhibit_face_set_after_frame_default;=0A=20Lisp_Object=20= Qface_set_after_frame_default;=0A@@=20-2855,6=20+2864,9=20@@=0A=20=20=20= {"right-fringe",=09=09&Qright_fringe},=0A=20=20=20{"wait-for-wm",=09=09= &Qwait_for_wm},=0A=20=20=20{"fullscreen",=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20&Qfullscreen},=0A+#ifdef=20HAVE_X_WINDOWS=0A+=20=20= {"alpha",=09=09=09=20&Qalpha},=0A+#endif=0A=20#ifdef=20USE_FONT_BACKEND=0A= =20=20=20{"font-backend",=09=09&Qfont_backend}=0A=20#endif=09/*=20= USE_FONT_BACKEND=20*/=0A@@=20-3699,6=20+3711,63=20@@=0A=20=20=20=20=20= return=20Qnil;=0A=20}=0A=20=0A+#ifdef=20HAVE_X_WINDOWS=0A+void=0A= +x_set_alpha=20(f,=20arg,=20oldval)=0A+=20=20=20=20=20struct=20frame=20= *f;=0A+=20=20=20=20=20Lisp_Object=20arg,=20oldval;=0A+{=0A+=20=20double=20= alpha=20=3D=201.0;=0A+=20=20double=20newval[2];=0A+=20=20int=20i,=20= ialpha;=0A+=20=20Lisp_Object=20item;=0A+=0A+=20=20for(=20i=3D0;=20i<2;=20= i++=20)=0A+=20=20=20=20newval[i]=20=3D=201.0;=0A+=0A+=20=20for(=20i=3D0;=20= i<2;=20i++=20)=0A+=20=20=20=20{=0A+=20=20=20=20=20=20if(=20CONSP=20(arg)=20= )=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20item=20=3D= =20CAR=20(arg);=0A+=20=20=20=20=20=20=20=20=20=20arg=20=20=3D=20CDR=20= (arg);=0A+=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20else=0A+=20=20=20= =20=20=20=20=20item=3Darg;=0A+=0A+=20=20=20=20=20=20if(=20!NILP=20(item)=20= )=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20if(=20= FLOATP(item)=20)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20alpha=20=3D=20XFLOAT_DATA=20(item);=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20if=20(=20alpha=20<=200.0=20||=201.0=20= <=20alpha=20)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= args_out_of_range=20(make_float=20(0.0),=20make_float=20(1.0));=0A+=20=20= =20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20else=20= if(=20INTEGERP(item)=20)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20ialpha=20=3D=20XINT=20(item);=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20if=20(=20ialpha=20<=200=20||=20100=20= <=20ialpha=20)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= args_out_of_range=20(make_number=20(0),=20make_number=20(100));=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20alpha=20=3D=20ialpha=20/=20100.0;=0A+=20=20=20=20=20=20= =20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20= =20=20=20=20=20=20=20=20wrong_type_argument=20(Qnumberp,=20item);=0A+=20=20= =20=20=20=20=20=20}=0A+=20=20=20=20=20=20newval[i]=3Dalpha;=0A+=20=20=20=20= }=0A+=0A+=20=20for=20(=20i=3D0;=20i<2;=20i++=20)=0A+=20=20=20=20= f->alpha[i]=20=3D=20newval[i];=0A+=0A+=20=20BLOCK_INPUT;=0A+=20=20= x_set_frame_alpha=20(f);=0A+=20=20UNBLOCK_INPUT;=0A+=0A+=20=20return;=0A= +}=0A+#endif=0A+=0A=20=0C=0A=20/*=20Subroutines=20of=20creating=20an=20X=20= frame.=20=20*/=0A=20=0A@@=20-4468,6=20+4537,12=20@@=0A=20but=20binding=20= this=20variable=20locally=20around=20a=20call=20to=20`x-get-resource'=0A=20= is=20a=20reasonable=20practice.=20=20See=20also=20the=20variable=20= `x-resource-name'.=20=20*/);=0A=20=20=20Vx_resource_class=20=3D=20= build_string=20(EMACS_CLASS);=0A+=0A+#ifdef=20HAVE_X_WINDOWS=0A+=20=20= DEFVAR_LISP=20("frame-alpha-lower-limit",=20&Vframe_alpha_lower_limit,=0A= +=20=20=20=20doc:=20/*=20Lower=20limit=20of=20alpha=20value=20of=20= frame.=20=20*/);=0A+=20=20Vframe_alpha_lower_limit=20=3D=20make_number=20= (20);=0A+#endif=0A=20#endif=0A=20=0A=20=20=20DEFVAR_LISP=20= ("default-frame-alist",=20&Vdefault_frame_alist,=0Adiff=20-Naur=20= emacs.orig/src/frame.h=20emacs.new/src/frame.h=0A---=20= emacs.orig/src/frame.h=092008-02-22=2012:42:08.000000000=20-0500=0A+++=20= emacs.new/src/frame.h=092008-03-13=2007:10:40.000000000=20-0400=0A@@=20= -204,6=20+204,11=20@@=0A=20=20=20=20=20=20be=20used=20for=20output.=20=20= */=0A=20=20=20unsigned=20glyphs_initialized_p=20:=201;=0A=20=0A+#ifdef=20= HAVE_X_WINDOWS=0A+=20=20/*=20Opacity=20of=20the=20Frame=20=20*/=0A+=20=20= double=20alpha[2];=0A+#endif=0A+=0A=20=20=20/*=20Set=20to=20non-zero=20= in=20change_frame_size=20when=20size=20of=20frame=20changed=0A=20=20=20=20= =20=20Clear=20the=20frame=20in=20clear_garbaged_frames=20if=20set.=20=20= */=0A=20=20=20unsigned=20resized_p=20:=201;=0A@@=20-1021,6=20+1026,9=20= @@=0A=20extern=20Lisp_Object=20Qwait_for_wm;=0A=20extern=20Lisp_Object=20= Qfullscreen;=0A=20extern=20Lisp_Object=20Qfont_backend;=0A+#ifdef=20= HAVE_X_WINDOWS=0A+extern=20Lisp_Object=20Qalpha;=0A+#endif=0A=20=0A=20= extern=20Lisp_Object=20Qleft_fringe,=20Qright_fringe;=0A=20extern=20= Lisp_Object=20Qheight,=20Qwidth;=0A@@=20-1100,6=20+1108,10=20@@=0A=20=0A=20= extern=20int=20x_figure_window_size=20P_=20((struct=20frame=20*,=20= Lisp_Object,=20int));=0A=20=0A+#if=20defined=20(HAVE_X_WINDOWS)=20||=20= defined=20(HAVE_CARBON)=0A+extern=20Lisp_Object=20= Vframe_alpha_lower_limit;=0A+extern=20void=20x_set_alpha=20P_=20((struct=20= frame=20*,=20Lisp_Object,=20Lisp_Object));=0A+#endif=0A=20=0A=20extern=20= void=20validate_x_resource_name=20P_=20((void));=0A=20=0Adiff=20-Naur=20= emacs.orig/src/xfns.c=20emacs.new/src/xfns.c=0A---=20= emacs.orig/src/xfns.c=092008-02-22=2012:42:05.000000000=20-0500=0A+++=20= emacs.new/src/xfns.c=092008-03-13=2007:10:40.000000000=20-0400=0A@@=20= -585,6=20+585,8=20@@=0A=20=09=09=09=09=09=09=09=20=20=20=20=20= Lisp_Object,=0A=20=09=09=09=09=09=09=09=20=20=20=20=20char=20*,=20char=20= *,=0A=20=09=09=09=09=09=09=09=20=20=20=20=20int));=0A+extern=20void=20= x_set_frame_alpha=20P_=20((struct=20frame=20*));=0A+=0A=20=0C=0A=20=0A=20= /*=20Store=20the=20screen=20positions=20of=20frame=20F=20into=20XPTR=20= and=20YPTR.=0A@@=20-3578,6=20+3580,8=20@@=0A=20=20=20x_default_parameter=20= (f,=20parms,=20Qscroll_bar_width,=20Qnil,=0A=20=09=09=20=20=20=20=20=20=20= "scrollBarWidth",=20"ScrollBarWidth",=0A=20=09=09=20=20=20=20=20=20=20= RES_TYPE_NUMBER);=0A+=20=20x_default_parameter=20(f,=20parms,=20Qalpha,=20= Qnil,=0A+=09=09=20=20=20=20=20=20=20"alpha",=20"Alpha",=20= RES_TYPE_NUMBER);=0A=20=0A=20=20=20/*=20Dimensions,=20especially=20= FRAME_LINES=20(f),=20must=20be=20done=20via=20change_frame_size.=0A=20=20= =20=20=20=20Change=20will=20not=20be=20effected=20unless=20different=20= from=20the=20current=0A@@=20-5991,6=20+5995,9=20@@=0A=20=20=20= x_set_fringe_width,=0A=20=20=20x_set_wait_for_wm,=0A=20=20=20= x_set_fullscreen,=0A+#ifdef=20HAVE_X_WINDOWS=0A+=20=20=20x_set_alpha,=0A= +#endif=0A=20#ifdef=20USE_FONT_BACKEND=0A=20=20=20x_set_font_backend=0A=20= #endif=09/*=20USE_FONT_BACKEND=20*/=0Adiff=20-Naur=20= emacs.orig/src/xterm.c=20emacs.new/src/xterm.c=0A---=20= emacs.orig/src/xterm.c=092008-03-11=2011:54:05.000000000=20-0400=0A+++=20= emacs.new/src/xterm.c=092008-03-13=2007:10:40.000000000=20-0400=0A@@=20= -1018,6=20+1018,66=20@@=0A=20=20=20return=20FONT_TYPE_UNKNOWN;=0A=20}=0A=20= =0A+#define=20OPAQUE=20=200xffffffff=0A+#define=20OPACITY=20= "_NET_WM_WINDOW_OPACITY"=0A+=0A+void=0A+x_set_frame_alpha=20(f)=0A+=20=20= =20=20=20struct=20frame=20*f;=0A+{=0A+=20=20struct=20x_display_info=20= *dpyinfo=20=3D=20FRAME_X_DISPLAY_INFO=20(f);=0A+=20=20Display=20*dpy=20=3D= =20FRAME_X_DISPLAY=20(f);=0A+=20=20Window=20win=20=3D=20= FRAME_OUTER_WINDOW=20(f);=0A+=20=20if=20(FRAME_X_DISPLAY_INFO=20= (f)->root_window=20!=3D=20FRAME_X_OUTPUT=20(f)->parent_desc)=0A+=20=20=20= =20/*=20Since=20the=20WM=20decoration=20lies=20under=20the=20= FRAME_OUTER_WINDOW,=0A+=20=20=20=20=20=20=20we=20must=20treat=20the=20= former=20instead=20of=20the=20latter.=20*/=0A+=20=20=20=20win=20=3D=20= FRAME_X_OUTPUT(f)->parent_desc;=0A+=0A+=20=20double=20alpha=20=3D=201.0,=20= alpha_lower_limit=20=3D=201.0;=0A+=0A+=20=20if=20= (dpyinfo->x_highlight_frame=20=3D=3D=20f)=0A+=20=20=20=20alpha=20=3D=20= f->alpha[0];=0A+=20=20else=0A+=20=20=20=20alpha=20=3D=20f->alpha[1];=0A+=0A= +=20=20if(=20FLOATP(Vframe_alpha_lower_limit)=20)=0A+=20=20=20=20= alpha_lower_limit=20=3D=20XFLOAT_DATA=20(Vframe_alpha_lower_limit);=0A+=20= =20else=20if(=20INTEGERP(Vframe_alpha_lower_limit)=20)=0A+=20=20=20=20= alpha_lower_limit=20=3D=20(=20XINT=20(Vframe_alpha_lower_limit)=20)=20/=20= 100.0;=0A+=0A+=20=20if(=20alpha=20<=200.0=20||=201.0=20<=20alpha=20)=20= alpha=20=3D=201.0;=0A+=20=20if=20(=200.0=20<=3D=20alpha=20&&=20alpha=20<=20= alpha_lower_limit=20&&=20alpha_lower_limit=20<=201.0)=0A+=20=20=20=20= alpha=20=3D=20alpha_lower_limit;=0A+=0A+=20=20unsigned=20int=20opac=20=3D=20= (unsigned=20int)(alpha=20*=20OPAQUE);=0A+=0A+=20=20/*=20return=20unless=20= necessary=20*/=0A+=20=20{=0A+=20=20=20=20unsigned=20char=20*data;=0A+=20=20= =20=20Atom=20actual;=0A+=20=20=20=20int=20format;=0A+=20=20=20=20= unsigned=20long=20n,=20left;=0A+=0A+=20=20=20=20XGetWindowProperty(dpy,=20= win,=20XInternAtom(dpy,=20OPACITY,=20False),=0A+=09=09=20=20=20=20=20=20=20= 0L,=201L,=20False,=20XA_CARDINAL,=20&actual,=20&format,=20&n,=20&left,=0A= +=09=09=20=20=20=20=20=20=20(unsigned=20char=20**)=20&data);=0A+=20=20=20= =20if=20(data=20!=3D=20None)=0A+=20=20=20=20=20=20if=20(*(unsigned=20int=20= *)data=20=3D=3D=20opac)=0A+=09{=0A+=09=20=20XFree=20((void=20*)=20data);=0A= +=09=20=20return;=0A+=09}=0A+=20=20=20=20=20=20else=0A+=20=20=20=20=20=20= =20{=0A+=09=20=20XFree=20((void=20*)=20data);=0A+=20=20=20=20=20=20=20}=0A= +=20=20}=0A+=0A+=20=20XChangeProperty=20(dpy,=20win,=20XInternAtom=20= (dpy,=20OPACITY,=20False),=0A+=09=09=20=20=20XA_CARDINAL,=2032,=20= PropModeReplace,=0A+=09=09=20=20=20(unsigned=20char=20*)=20&opac,=201L);=0A= +=20=20XSync=20(dpy,=20False);=0A+}=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= @@=20-3468,6=20+3528,7=20@@=0A=20=09=09=20=20=20=20= f->output_data.x->border_pixel);=0A=20=20=20UNBLOCK_INPUT;=0A=20=20=20= x_update_cursor=20(f,=201);=0A+=20=20x_set_frame_alpha=20(f);=0A=20}=0A=20= =0A=20static=20void=0A@@=20-3483,6=20+3544,7=20@@=0A=20=09=09=09=20=20= f->output_data.x->border_tile);=0A=20=20=20UNBLOCK_INPUT;=0A=20=20=20= x_update_cursor=20(f,=201);=0A+=20=20x_set_frame_alpha=20(f);=0A=20}=0A=20= =0A=20/*=20The=20focus=20has=20changed.=20=20Update=20the=20frames=20as=20= necessary=20to=20reflect=0A= --Apple-Mail-37--447911808 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed == Seiji Zenitani zenitani@mac.com --Apple-Mail-37--447911808--