From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: =?utf-8?B?7KGw7ISx67mI?= Newsgroups: gmane.emacs.devel Subject: Re: [PATCH v5] Enable xwidgets on macOS Date: Fri, 26 Jul 2019 03:51:11 +0900 Message-ID: References: <20190718192321.65684-1-pcr910303@icloud.com> <20190719041654.88561-1-pcr910303@icloud.com> <83pnm5t8ui.fsf@gnu.org> Mime-Version: 1.0 (Mac OS X Mail 11.5 \(3445.9.1\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_AA24E5D7-D128-4230-9BB5-4ABD010C3AB8" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="198456"; mail-complaints-to="usenet@blaine.gmane.org" Cc: alan@idiocy.org, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Jul 25 20:51:39 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1hqiq1-000pVv-TA for ged-emacs-devel@m.gmane.org; Thu, 25 Jul 2019 20:51:38 +0200 Original-Received: from localhost ([::1]:34880 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hqiq0-0003nl-S3 for ged-emacs-devel@m.gmane.org; Thu, 25 Jul 2019 14:51:36 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:45407) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hqipm-0003ly-Tp for emacs-devel@gnu.org; Thu, 25 Jul 2019 14:51:24 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hqipl-0001x8-Ru for emacs-devel@gnu.org; Thu, 25 Jul 2019 14:51:22 -0400 Original-Received: from pv50p00im-ztbu10021601.me.com ([17.58.6.57]:45836) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hqipl-0001qe-8C for emacs-devel@gnu.org; Thu, 25 Jul 2019 14:51:21 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1564080676; bh=cW+KVTHT096V4jQAS73E4fHP4/d4TvAfjgevrfReaiE=; h=From:Message-Id:Content-Type:Subject:Date:To; b=LLTFWDyEWrRYf5SiUZPPvss5Vcs6iAO5QlmOUeeTm+BZb5y3ms/E/ckAd+sQxOqQ3 Qxkm1+biPW/LdDrlTed/yemOdGFNMcrYpo6R2Jr3/DzNBkM+foY/sGXTsfcZJMcjl6 0s9oHOHdS1HnMiYcDbH2sVr6e9bxiojPGa67XW8Cm6Pml6MUcdVFqYGKBy/MtBb1Ka RSvWuPIqHHQ6NWgutgxWLJteENEATmJGbobuYNK3WVxHOXNz1pFap1IN082QbOIIXc /UNeeXojGW3bNHVJ3d7TH0aMohecfFR10dtBoMluSGDul7bK3eMqH0Lx5EBcH/Fi91 cFs/kMsX/zh7g== Original-Received: from [192.168.0.11] (unknown [1.230.108.64]) by pv50p00im-ztbu10021601.me.com (Postfix) with ESMTPSA id 5CFE56E0976; Thu, 25 Jul 2019 18:51:14 +0000 (UTC) In-Reply-To: X-Mailer: Apple Mail (2.3445.9.1) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2019-07-25_07:, , signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 mlxscore=0 mlxlogscore=749 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1812120000 definitions=main-1907250223 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 17.58.6.57 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:238895 Archived-At: --Apple-Mail=_AA24E5D7-D128-4230-9BB5-4ABD010C3AB8 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Hello, I have prepared three patches to apply on master. Can anyone review these? --Apple-Mail=_AA24E5D7-D128-4230-9BB5-4ABD010C3AB8 Content-Disposition: attachment; filename=0001-Add-xwidget-webkit-support-for-macOS.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Add-xwidget-webkit-support-for-macOS.patch" Content-Transfer-Encoding: quoted-printable =46rom=206d95860c506233502b8b9d59609e653085412092=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Sungbin=20Jo=20=0ADate:=20= Thu,=2025=20Jul=202019=2023:55:42=20+0900=0ASubject:=20[PATCH=201/3]=20= Add=20xwidget=20webkit=20support=20for=20macOS=0A=0ACo-authored-by:=20= Jaesup=20Kwak=20=0A=0A*=20configure.ac:=20Allow=20= '--with-xwidgets'=20for=20"${NS_IMPL_COCOA}".=0A*=20etc/NEWS:=20Mention=20= new=20feature.=0A*=20etc/TODO:=20Remove=20done=20TODO=20to=20implement=20= xwidget=20in=20NeXTstep=20port.=0A*=20lisp/xwidget.el=20= (xwidget-webkit-clone-and-split-below)=0A= (xwidget-webkit-clone-and-split-right):=20New=20procedures.=0A= (xwidget-webkit-callback):=20Remove=20call=20to=0A= 'xwidget-webkit-adjust-size-to-window'=20as=20adjusting=20xwidget=20size=20= is=0Ahandled=20in=20'x_draw_xwidget_glyph_string'.=0A= (xwidget-webkit-enable-plugins):=20New=20variable.=0A*=20= nextstep/templates/Info.plist.in:=20Add=20'NSAppTransportSecurity'.=0A*=20= src/Makefile.in:=20Add=20nsxwidget.o=20for=20compilation.=0A*=20= src/emacs.c=20(main):=20Move=20conditional=20call=20to=20= 'syms_of_xwidget'.=0A*=20src/nsterm.m=20(ns_draw_glyph_string):=20Add=20= case=20for=20'XWIDGET_GLYPH'.=0A(note_mouse_movement=20mouseMoved):=20= Make=20it=20easy=20to=20resize=20window=20by=0Adragging=20mode-line=20or=20= vertical=20separator=20adjacent=20to=20large=20glyph.=0A*=20= src/nsxwidget.h=20src/nsxwidget.m:=20Newly=20added=20files,=20xwidget=20= webkit=0Abackend=20for=20macOS=20Cocoa.=0A*=20src/xwidget.c=20= (Fmake_xwidget,=20xwidget_init_view)=0A(x_draw_xwidget_glyph_string,=20= xwidget_is_web_view)=0A(Fxwidget_webkit_goto_uri,=20= Fxwidget_webkit_zoom,=20Fxwidget_resize)=0A(Fxwidget_size_request,=20= Fdelete_xwidget_view,=20xwidget_end_redisplay)=0A(kill_buffer_xwidgets):=20= Add=20macOS=20Cocoa=20specific=20functions=20and=20code=0Awith=20= 'NS_IMPL_COCOA'=20and=20guard=20GTK=20specific=20functions=20and=20code=20= with=0A'USE_GTK'.=0A(x_draw_xwidget_glyph_string):=20Handle=20adjusting=20= xwidget=20size.=0A*=20src/xwidget.h=20(xwidget,=20xwidget_view):=20Add=20= macOS=20Cocoa=20specific=0Afields=20with=20'NS_IMPL_COCOA'=20and=20guard=20= GTK=20specific=20fields=20with=0AUSE_GTK.=0A---=0A=20configure.ac=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2034=20+-=0A=20= etc/NEWS=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=2012=20+=0A=20etc/TODO=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=209=20-=0A=20lisp/xwidget.el=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2028=20+-=0A=20= nextstep/templates/Info.plist.in=20|=20=2012=20+-=0A=20src/Makefile.in=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=201=20+=0A=20= src/emacs.c=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20|=20=20=202=20+-=0A=20src/nsterm.m=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20|=20=2020=20+-=0A=20src/nsxwidget.h=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20=2077=20+++++=0A=20= src/nsxwidget.m=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= 564=20+++++++++++++++++++++++++++++++=0A=20src/xwidget.c=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20177=20+++++++++-=0A=20= src/xwidget.h=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= |=20=2045=20++-=0A=2012=20files=20changed,=20937=20insertions(+),=2044=20= deletions(-)=0A=20create=20mode=20100644=20src/nsxwidget.h=0A=20create=20= mode=20100644=20src/nsxwidget.m=0A=0Adiff=20--git=20a/configure.ac=20= b/configure.ac=0Aindex=20c093d8650d..9685b65862=20100644=0A---=20= a/configure.ac=0A+++=20b/configure.ac=0A@@=20-484,7=20+484,7=20@@=20= AC_DEFUN=0A=20=20[with_file_notification=3D$with_features])=0A=20=0A=20= OPTION_DEFAULT_OFF([xwidgets],=0A-=20=20[enable=20use=20of=20some=20gtk=20= widgets=20in=20Emacs=20buffers=20(requires=20gtk3)])=0A+=20=20[enable=20= use=20of=20xwidgets=20in=20Emacs=20buffers=20(requires=20gtk3=20or=20= macOS=20Cocoa)])=0A=20=0A=20##=20For=20the=20times=20when=20you=20want=20= to=20build=20Emacs=20but=20don't=20have=0A=20##=20a=20suitable=20= makeinfo,=20and=20can=20live=20without=20the=20manuals.=0A@@=20-2808,20=20= +2808,34=20@@=20AC_DEFUN=0A=20=0A=20=0A=20dnl=20Enable=20xwidgets=20if=20= GTK3=20and=20WebKitGTK+=20are=20available.=0A+dnl=20Enable=20xwidgets=20= if=20macOS=20Cocoa=20and=20WebKit=20framework=20are=20available.=0A=20= HAVE_XWIDGETS=3Dno=0A=20XWIDGETS_OBJ=3D=0A=20if=20test=20= "$with_xwidgets"=20!=3D=20"no";=20then=0A-=20=20test=20= "$USE_GTK_TOOLKIT"=20=3D=20"GTK3"=20&&=20test=20"$window_system"=20!=3D=20= "none"=20||=0A-=20=20=20=20AC_MSG_ERROR([xwidgets=20requested=20but=20= gtk3=20not=20used.])=0A+=20=20if=20test=20"$USE_GTK_TOOLKIT"=20=3D=20= "GTK3"=20&&=20test=20"$window_system"=20!=3D=20"none";=20then=0A+=20=20=20= =20WEBKIT_REQUIRED=3D2.12=0A+=20=20=20=20WEBKIT_MODULES=3D"webkit2gtk-4.0=20= >=3D=20$WEBKIT_REQUIRED"=0A+=20=20=20=20EMACS_CHECK_MODULES([WEBKIT],=20= [$WEBKIT_MODULES])=0A+=20=20=20=20HAVE_XWIDGETS=3D$HAVE_WEBKIT=0A+=20=20=20= =20XWIDGETS_OBJ=3D"xwidget.o"=0A+=20=20elif=20test=20"${NS_IMPL_COCOA}"=20= =3D=20"yes";=20then=0A+=20=20=20=20dnl=20FIXME:=20Check=20framework=20= WebKit2=0A+=20=20=20=20dnl=20WEBKIT_REQUIRED=3DM.m.p=0A+=20=20=20=20= WEBKIT_LIBS=3D"-Wl,-framework=20-Wl,WebKit"=0A+=20=20=20=20= WEBKIT_CFLAGS=3D"-I/System/Library/Frameworks/WebKit.framework/Headers"=0A= +=20=20=20=20HAVE_WEBKIT=3D"yes"=0A+=20=20=20=20= HAVE_XWIDGETS=3D$HAVE_WEBKIT=0A+=20=20=20=20XWIDGETS_OBJ=3D"xwidget.o"=0A= +=20=20=20=20NS_OBJC_OBJ=3D"$NS_OBJC_OBJ=20nsxwidget.o"=0A+=20=20=20=20= dnl=20Update=20NS_OBJC_OBJ=20with=20added=20nsxwidget.o=0A+=20=20=20=20= AC_SUBST(NS_OBJC_OBJ)=0A+=20=20else=0A+=20=20=20=20= AC_MSG_ERROR([xwidgets=20requested,=20it=20requires=20GTK3=20as=20X=20= window=20toolkit=20or=20macOS=20Cocoa=20as=20window=20system.])=0A+=20=20= fi=0A=20=0A-=20=20WEBKIT_REQUIRED=3D2.12=0A-=20=20= WEBKIT_MODULES=3D"webkit2gtk-4.0=20>=3D=20$WEBKIT_REQUIRED"=0A-=20=20= EMACS_CHECK_MODULES([WEBKIT],=20[$WEBKIT_MODULES])=0A-=20=20= HAVE_XWIDGETS=3D$HAVE_WEBKIT=0A=20=20=20test=20$HAVE_XWIDGETS=20=3D=20= yes=20||=0A-=20=20=20=20AC_MSG_ERROR([xwidgets=20requested=20but=20= WebKitGTK+=20not=20found.])=0A+=20=20=20=20AC_MSG_ERROR([xwidgets=20= requested=20but=20WebKitGTK+=20or=20WebKit=20framework=20not=20found.])=0A= =20=0A-=20=20XWIDGETS_OBJ=3Dxwidget.o=0A=20=20=20= AC_DEFINE([HAVE_XWIDGETS],=201,=20[Define=20to=201=20if=20you=20have=20= xwidgets=20support.])=0A=20fi=0A=20AC_SUBST(XWIDGETS_OBJ)=0A@@=20-5697,7=20= +5711,7=20@@=20AC_DEFUN=0A=20=20=20Does=20Emacs=20directly=20use=20zlib?=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${HAVE_ZLIB}=0A=20=20=20Does=20Emacs=20have=20dynamic=20modules=20= support?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20${HAVE_MODULES}=0A= =20=20=20Does=20Emacs=20use=20toolkit=20scroll=20bars?=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20${USE_TOOLKIT_SCROLL_BARS}=0A-=20= =20Does=20Emacs=20support=20Xwidgets=20(requires=20gtk3)?=20=20=20=20=20=20= =20=20=20=20=20=20${HAVE_XWIDGETS}=0A+=20=20Does=20Emacs=20support=20= Xwidgets?=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${HAVE_XWIDGETS}=0A=20=20=20Does=20Emacs=20have=20= threading=20support=20in=20lisp?=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ${threads_enabled}=0A=20=20=20Does=20Emacs=20support=20the=20portable=20= dumper?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ${with_pdumper}=0A=20=20=20Does=20Emacs=20support=20legacy=20unexec=20= dumping?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20${with_unexec}=0A= diff=20--git=20a/etc/NEWS=20b/etc/NEWS=0Aindex=205313270411..52b49bab75=20= 100644=0A---=20a/etc/NEWS=0A+++=20b/etc/NEWS=0A@@=20-2440,6=20+2440,18=20= @@=20was=20able=20to=20'set'=20modifiers=20without=20the=20knowledge=20= of=20the=20user.=0A=20**=20On=20NS=20multicolor=20font=20display=20is=20= enabled=20again=20since=20it=20is=20also=0A=20implemented=20in=20Emacs=20= on=20free=20operating=20systems=20via=20Cairo=20drawing.=0A=20=0A+**=20= On=20macOS,=20Xwidget=20is=20now=20supported.=0A+If=20Emacs=20was=20= built=20with=20xwidget=20support,=20you=20can=20access=20the=20embedded=0A= +webkit=20browser=20with=20'M-x=20xwidget-webkit-browse-url'.=20=20= Viewing=20two=0A+instances=20of=20xwidget=20webkit=20is=20not=20= supported.=0A+=0A+***=20New=20functions=20for=20xwidget-webkit=20mode=0A= +'xwidget-webkit-clone-and-split-below',=0A= +'xwidget-webkit-clone-and-split-right'.=0A+=0A+***=20New=20variable=20= 'xwidget-webkit-enable-plugins'.=0A+=0A+=0A=20=0C=0A=20= ----------------------------------------------------------------------=0A= =20This=20file=20is=20part=20of=20GNU=20Emacs.=0Adiff=20--git=20= a/etc/TODO=20b/etc/TODO=0Aindex=20a065763933..bda1cf8f9e=20100644=0A---=20= a/etc/TODO=0A+++=20b/etc/TODO=0A@@=20-640,15=20+640,6=20@@=20from=20the=20= emacsclient=20process.=0A=20=0A=20This=20sections=20contains=20features=20= found=20in=20other=20official=20Emacs=20ports.=0A=20=0A-****=20Support=20= for=20xwidgets=0A-=0A-Emacs=2025=20has=20support=20for=20xwidgets,=20a=20= system=20to=20include=20operating=0A-system=20components=20into=20an=20= Emacs=20buffer.=20=20The=20components=20range=20from=0A-simple=20buttons=20= to=20webkit=20(effectively,=20a=20web=20browser).=0A-=0A-Currently,=20= xwidgets=20works=20only=20for=20the=20gtk+=20framework=20but=20it=20is=0A= -designed=20to=20be=20compatible=20with=20multiple=20Emacs=20ports.=0A-=0A= =20****=20Respect=20'frame-inhibit-implied-resize'=0A=20=0A=20When=20the=20= variable=20'frame-inhibit-implied-resize'=20is=20non-nil,=20frames=0A= diff=20--git=20a/lisp/xwidget.el=20b/lisp/xwidget.el=0Aindex=20= 662a854ac3..f01822c792=20100644=0A---=20a/lisp/xwidget.el=0A+++=20= b/lisp/xwidget.el=0A@@=20-96,6=20+96,24=20@@=20xwidget-webkit-browse-url=0A= =20=20=20=20=20=20=20=20=20(xwidget-webkit-new-session=20url)=0A=20=20=20= =20=20=20=20(xwidget-webkit-goto-url=20url))))=0A=20=0A+(defun=20= xwidget-webkit-clone-and-split-below=20()=0A+=20=20"Clone=20current=20= URL=20into=20a=20new=20widget=20place=20in=20new=20window=20below.=0A= +Get=20the=20URL=20of=20current=20session,=20then=20browse=20to=20the=20= URL=0A+in=20`split-window-below'=20with=20a=20new=20xwidget=20webkit=20= session."=0A+=20=20(interactive)=0A+=20=20(let=20((url=20= (xwidget-webkit-current-url)))=0A+=20=20=20=20(with-selected-window=20= (split-window-below)=0A+=20=20=20=20=20=20(xwidget-webkit-new-session=20= url))))=0A+=0A+(defun=20xwidget-webkit-clone-and-split-right=20()=0A+=20=20= "Clone=20current=20URL=20into=20a=20new=20widget=20place=20in=20new=20= window=20right.=0A+Get=20the=20URL=20of=20current=20session,=20then=20= browse=20to=20the=20URL=0A+in=20`split-window-right'=20with=20a=20new=20= xwidget=20webkit=20session."=0A+=20=20(interactive)=0A+=20=20(let=20= ((url=20(xwidget-webkit-current-url)))=0A+=20=20=20=20= (with-selected-window=20(split-window-right)=0A+=20=20=20=20=20=20= (xwidget-webkit-new-session=20url))))=0A+=0A=20;;todo.=0A=20;;=20-=20= check=20that=20the=20webkit=20support=20is=20compiled=20in=0A=20(defvar=20= xwidget-webkit-mode-map=0A@@=20-223,9=20+241,8=20@@=20= xwidget-webkit-callback=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= xwidget=20"document.title"=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (lambda=20(title)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (xwidget-log=20"webkit=20finished=20loading:=20'%s'"=20title)=0A-=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20;;TODO=20-=20check=20the=20= native/internal=20scroll=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20;;(xwidget-adjust-size-to-content=20xwidget)=0A-=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(xwidget-webkit-adjust-size-to-window=20xwidget)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Do=20not=20adjust=20= webkit=20size=20to=20window=20here,=20the=20selected=20window=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20;;=20can=20be=20the=20mini-buffer=20= window=20unwantedly.=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (rename-buffer=20(format=20"*xwidget=20webkit:=20%s=20*"=20title))))=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(pop-to-buffer=20= (current-buffer)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20((eq=20= xwidget-event-type=20'decide-policy)=0A@@=20-241,6=20+258,11=20@@=20= xwidget-webkit-callback=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20= (xwidget-log=20"unhandled=20event:%s"=20xwidget-event-type))))))=0A=20=0A= =20(defvar=20bookmark-make-record-function)=0A+(when=20(memq=20= window-system=20'(mac=20ns))=0A+=20=20(defvar=20= xwidget-webkit-enable-plugins=20nil=0A+=20=20=20=20"Enable=20plugins=20= for=20xwidget=20webkit.=0A+If=20non-nil,=20plugins=20are=20enabled.=20=20= Otherwise,=20disabled."))=0A+=0A=20(define-derived-mode=20= xwidget-webkit-mode=0A=20=20=20=20=20special-mode=20"xwidget-webkit"=20= "Xwidget=20webkit=20view=20mode."=0A=20=20=20=20=20(setq=20= buffer-read-only=20t)=0Adiff=20--git=20= a/nextstep/templates/Info.plist.in=20b/nextstep/templates/Info.plist.in=0A= index=20c1e50a8409..76efe95673=20100644=0A---=20= a/nextstep/templates/Info.plist.in=0A+++=20= b/nextstep/templates/Info.plist.in=0A@@=20-675,7=20+675,15=20@@=20along=20= with=20GNU=20Emacs.=20=20If=20not,=20see=20= .=0A=20=09=0A=20=09= NSAppleScriptEnabled=0A=20=09YES=0A-=20=20=20= =20=20=20=20=20NSAppleEventsUsageDescription=0A-=20=20=20=20=20= =20=20=20Emacs=20requires=20permission=20to=20send=20AppleEvents=20= to=20other=20applications.=0A+=09= NSAppleEventsUsageDescription=0A+=09Emacs=20requires=20= permission=20to=20send=20AppleEvents=20to=20other=20= applications.=0A+=09=0A= +=09NSAppTransportSecurity=0A+=09=0A+=09=09= NSAllowsArbitraryLoads=0A+=09=09=0A+=09=0A=20= =0A=20=0Adiff=20--git=20a/src/Makefile.in=20= b/src/Makefile.in=0Aindex=20fd05a45df5..0af650244d=20100644=0A---=20= a/src/Makefile.in=0A+++=20b/src/Makefile.in=0A@@=20-434,6=20+434,7=20@@=20= SOME_MACHINE_OBJECTS=20=3D=0A=20=20=20xterm.o=20xfns.o=20xmenu.o=20= xselect.o=20xrdb.o=20xsmfns.o=20fringe.o=20image.o=20\=0A=20=20=20= fontset.o=20dbusbind.o=20cygw32.o=20\=0A=20=20=20nsterm.o=20nsfns.o=20= nsmenu.o=20nsselect.o=20nsimage.o=20nsfont.o=20macfont.o=20\=0A+=20=20= nsxwidget.o=20\=0A=20=20=20w32.o=20w32console.o=20w32cygwinx.o=20= w32fns.o=20w32heap.o=20w32inevt.o=20w32notify.o=20\=0A=20=20=20w32menu.o=20= w32proc.o=20w32reg.o=20w32select.o=20w32term.o=20w32xfns.o=20\=0A=20=20=20= w16select.o=20widget.o=20xfont.o=20ftfont.o=20xftfont.o=20ftxfont.o=20= gtkutil.o=20\=0Adiff=20--git=20a/src/emacs.c=20b/src/emacs.c=0Aindex=20= cc5818393a..f3b91182cf=20100644=0A---=20a/src/emacs.c=0A+++=20= b/src/emacs.c=0A@@=20-1902,7=20+1902,6=20@@=20main=20(int=20argc,=20char=20= **argv)=0A=20=20=20=20=20=20=20syms_of_xfns=20();=0A=20=20=20=20=20=20=20= syms_of_xmenu=20();=0A=20=20=20=20=20=20=20syms_of_fontset=20();=0A-=20=20= =20=20=20=20syms_of_xwidget=20();=0A=20=20=20=20=20=20=20= syms_of_xsettings=20();=0A=20#ifdef=20HAVE_X_SM=0A=20=20=20=20=20=20=20= syms_of_xsmfns=20();=0A@@=20-1979,6=20+1978,7=20@@=20main=20(int=20argc,=20= char=20**argv)=0A=20#endif=20/*=20HAVE_W32NOTIFY=20*/=0A=20#endif=20/*=20= WINDOWSNT=20*/=0A=20=0A+=20=20=20=20=20=20syms_of_xwidget=20();=0A=20=20=20= =20=20=20=20syms_of_threads=20();=0A=20=20=20=20=20=20=20= syms_of_profiler=20();=0A=20=20=20=20=20=20=20syms_of_pdumper=20();=0A= diff=20--git=20a/src/nsterm.m=20b/src/nsterm.m=0Aindex=20= 02331826d9..7b4bfa4321=20100644=0A---=20a/src/nsterm.m=0A+++=20= b/src/nsterm.m=0A@@=20-49,6=20+49,7=20@@=20Updated=20by=20Christian=20= Limpach=20(chris@nice.ch)=0A=20#include=20"nsterm.h"=0A=20#include=20= "systime.h"=0A=20#include=20"character.h"=0A+#include=20"xwidget.h"=0A=20= #include=20"fontset.h"=0A=20#include=20"composite.h"=0A=20#include=20= "ccl.h"=0A@@=20-2411,7=20+2412,7=20@@=20so=20some=20key=20presses=20= (TAB)=20are=20swallowed=20by=20the=20system.=20=20*/=0A=20}=0A=20=0A=20= static=20int=0A-ns_note_mouse_movement=20(struct=20frame=20*frame,=20= CGFloat=20x,=20CGFloat=20y)=0A+ns_note_mouse_movement=20(struct=20frame=20= *frame,=20CGFloat=20x,=20CGFloat=20y,=20BOOL=20dragging)=0A=20/*=20=20=20= ------------------------------------------------------------------------=0A= =20=20=20=20=20=20Called=20by=20EmacsView=20on=20mouseMovement=20events.=20= =20Passes=20on=0A=20=20=20=20=20=20to=20emacs=20mainstream=20code=20if=20= we=20moved=20off=20of=20a=20rect=20of=20interest=0A@@=20-2420,17=20= +2421,24=20@@=20so=20some=20key=20presses=20(TAB)=20are=20swallowed=20by=20= the=20system.=20=20*/=0A=20{=0A=20=20=20struct=20ns_display_info=20= *dpyinfo=20=3D=20FRAME_DISPLAY_INFO=20(frame);=0A=20=20=20NSRect=20*r;=0A= +=20=20BOOL=20force_update=20=3D=20NO;=0A=20=0A=20=20=20//=20NSTRACE=20= ("note_mouse_movement");=0A=20=0A=20=20=20= dpyinfo->last_mouse_motion_frame=20=3D=20frame;=0A=20=20=20r=20=3D=20= &dpyinfo->last_mouse_glyph;=0A=20=0A+=20=20/*=20If=20the=20last=20rect=20= is=20too=20large=20(ex,=20xwidget=20webkit),=20update=20at=0A+=20=20=20=20= =20every=20move,=20or=20resizing=20by=20dragging=20modeline=20or=20= vertical=20split=20is=0A+=20=20=20=20=20very=20hard=20to=20make=20its=20= way.=20=20*/=0A+=20=20if=20(dragging=20&&=20(r->size.width=20>=2032=20||=20= r->size.height=20>=2032))=0A+=20=20=20=20force_update=20=3D=20YES;=0A+=0A= =20=20=20/*=20Note,=20this=20doesn't=20get=20called=20for=20enter/leave,=20= since=20we=20don't=20have=20a=0A=20=20=20=20=20=20position.=20=20Those=20= are=20taken=20care=20of=20in=20the=20corresponding=20NSView=20methods.=20= =20*/=0A=20=0A=20=20=20/*=20Has=20movement=20gone=20beyond=20last=20rect=20= we=20were=20tracking?=20=20*/=0A-=20=20if=20(x=20<=20r->origin.x=20||=20= x=20>=3D=20r->origin.x=20+=20r->size.width=0A+=20=20if=20(force_update=20= ||=20x=20<=20r->origin.x=20||=20x=20>=3D=20r->origin.x=20+=20= r->size.width=0A=20=20=20=20=20=20=20||=20y=20<=20r->origin.y=20||=20y=20= >=3D=20r->origin.y=20+=20r->size.height)=0A=20=20=20=20=20{=0A=20=20=20=20= =20=20=20ns_update_begin=20(frame);=0A@@=20-4182,6=20+4190,10=20@@=20= overwriting=20cursor=20(usually=20when=20cursor=20on=20a=20tab).=20=20*/=0A= =20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20break;=0A=20=0A+=20=20= =20=20case=20XWIDGET_GLYPH:=0A+=20=20=20=20=20=20= x_draw_xwidget_glyph_string=20(s);=0A+=20=20=20=20=20=20break;=0A+=0A=20=20= =20=20=20case=20STRETCH_GLYPH:=0A=20=20=20=20=20=20=20= ns_dumpglyphs_stretch=20(s);=0A=20=20=20=20=20=20=20break;=0A@@=20= -6835,6=20+6847,7=20@@=20-=20(void)mouseMoved:=20(NSEvent=20*)e=0A=20=20=20= struct=20ns_display_info=20*dpyinfo=20=3D=20FRAME_DISPLAY_INFO=20= (emacsframe);=0A=20=20=20Lisp_Object=20frame;=0A=20=20=20NSPoint=20pt;=0A= +=20=20BOOL=20dragging;=0A=20=0A=20=20=20NSTRACE_WHEN=20= (NSTRACE_GROUP_EVENTS,=20"[EmacsView=20mouseMoved:]");=0A=20=0A@@=20= -6877,7=20+6890,8=20@@=20-=20(void)mouseMoved:=20(NSEvent=20*)e=0A=20=20=20= =20=20=20=20last_mouse_window=20=3D=20window;=0A=20=20=20=20=20}=0A=20=0A= -=20=20if=20(!ns_note_mouse_movement=20(emacsframe,=20pt.x,=20pt.y))=0A+=20= =20dragging=20=3D=20(e.type=20=3D=3D=20NSEventTypeLeftMouseDragged);=0A+=20= =20if=20(!ns_note_mouse_movement=20(emacsframe,=20pt.x,=20pt.y,=20= dragging))=0A=20=20=20=20=20help_echo_string=20=3D=20= previous_help_echo_string;=0A=20=0A=20=20=20XSETFRAME=20(frame,=20= emacsframe);=0Adiff=20--git=20a/src/nsxwidget.h=20b/src/nsxwidget.h=0A= new=20file=20mode=20100644=0Aindex=200000000000..7e2a3e0c40=0A---=20= /dev/null=0A+++=20b/src/nsxwidget.h=0A@@=20-0,0=20+1,77=20@@=0A+/*=20= Header=20for=20NS=20Cocoa=20part=20of=20xwidget=20and=20webkit=20widget.=0A= +=0A+Copyright=20(C)=202019=20Free=20Software=20Foundation,=20Inc.=0A+=0A= +This=20file=20is=20part=20of=20GNU=20Emacs.=0A+=0A+GNU=20Emacs=20is=20= free=20software:=20you=20can=20redistribute=20it=20and/or=20modify=0A+it=20= under=20the=20terms=20of=20the=20GNU=20General=20Public=20License=20as=20= published=20by=0A+the=20Free=20Software=20Foundation,=20either=20version=20= 3=20of=20the=20License,=20or=20(at=0A+your=20option)=20any=20later=20= version.=0A+=0A+GNU=20Emacs=20is=20distributed=20in=20the=20hope=20that=20= it=20will=20be=20useful,=0A+but=20WITHOUT=20ANY=20WARRANTY;=20without=20= even=20the=20implied=20warranty=20of=0A+MERCHANTABILITY=20or=20FITNESS=20= FOR=20A=20PARTICULAR=20PURPOSE.=20=20See=20the=0A+GNU=20General=20Public=20= License=20for=20more=20details.=0A+=0A+You=20should=20have=20received=20= a=20copy=20of=20the=20GNU=20General=20Public=20License=0A+along=20with=20= GNU=20Emacs.=20=20If=20not,=20see=20.=20=20= */=0A+=0A+#ifndef=20NSXWIDGET_H_INCLUDED=0A+#define=20= NSXWIDGET_H_INCLUDED=0A+=0A+/*=20This=20file=20can=20be=20included=20= from=20non-objc=20files=20through=20'xwidget.h'.=20=20*/=0A+#ifdef=20= __OBJC__=0A+#import=20=0A+#endif=0A+=0A+#include=20= "dispextern.h"=0A+#include=20"lisp.h"=0A+#include=20"xwidget.h"=0A+=0A= +/*=20Functions=20for=20xwidget=20webkit.=20=20*/=0A+=0A+bool=20= nsxwidget_is_web_view=20(struct=20xwidget=20*xw);=0A+void=20= nsxwidget_webkit_goto_uri=20(struct=20xwidget=20*xw,=20const=20char=20= *uri);=0A+void=20nsxwidget_webkit_zoom=20(struct=20xwidget=20*xw,=20= double=20zoom_change);=0A+void=20nsxwidget_webkit_execute_script=20= (struct=20xwidget=20*xw,=20const=20char=20*script,=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=20=20=20= =20=20=20=20=20=20Lisp_Object=20fun);=0A+=0A+/*=20Functions=20for=20= xwidget=20model.=20=20*/=0A+=0A+#ifdef=20__OBJC__=0A+@interface=20= XwWindow=20:=20NSView=0A+@property=20struct=20xwidget=20*xw;=0A+@end=0A= +#endif=0A+=0A+void=20nsxwidget_init=20(struct=20xwidget=20*xw);=0A+void=20= nsxwidget_kill=20(struct=20xwidget=20*xw);=0A+void=20nsxwidget_resize=20= (struct=20xwidget=20*xw);=0A+Lisp_Object=20nsxwidget_get_size=20(struct=20= xwidget=20*xw);=0A+=0A+/*=20Functions=20for=20xwidget=20view.=20=20*/=0A= +=0A+#ifdef=20__OBJC__=0A+@interface=20XvWindow=20:=20NSView=0A= +@property=20struct=20xwidget=20*xw;=0A+@property=20struct=20= xwidget_view=20*xv;=0A+@end=0A+#endif=0A+=0A+void=20nsxwidget_init_view=20= (struct=20xwidget_view=20*xv,=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=20struct=20xwidget=20*xww,=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= struct=20glyph_string=20*s,=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=20int=20x,=20int=20y);=0A+void=20= nsxwidget_delete_view=20(struct=20xwidget_view=20*xv);=0A+=0A+void=20= nsxwidget_show_view=20(struct=20xwidget_view=20*xv);=0A+void=20= nsxwidget_hide_view=20(struct=20xwidget_view=20*xv);=0A+void=20= nsxwidget_resize_view=20(struct=20xwidget_view=20*xv,=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=20int=20= widget,=20int=20height);=0A+=0A+void=20nsxwidget_move_view=20(struct=20= xwidget_view=20*xv,=20int=20x,=20int=20y);=0A+void=20= nsxwidget_move_widget_in_view=20(struct=20xwidget_view=20*xv,=20int=20x,=20= int=20y);=0A+void=20nsxwidget_set_needsdisplay=20(struct=20xwidget_view=20= *xv);=0A+=0A+#endif=20/*=20NSXWIDGET_H_INCLUDED=20*/=0Adiff=20--git=20= a/src/nsxwidget.m=20b/src/nsxwidget.m=0Anew=20file=20mode=20100644=0A= index=200000000000..df6c06f59a=0A---=20/dev/null=0A+++=20= b/src/nsxwidget.m=0A@@=20-0,0=20+1,564=20@@=0A+/*=20NS=20Cocoa=20part=20= implementation=20of=20xwidget=20and=20webkit=20widget.=0A+=0A+Copyright=20= (C)=202019=20Free=20Software=0A+Foundation,=20Inc.=0A+=0A+This=20file=20= is=20part=20of=20GNU=20Emacs.=0A+=0A+GNU=20Emacs=20is=20free=20software:=20= you=20can=20redistribute=20it=20and/or=20modify=0A+it=20under=20the=20= terms=20of=20the=20GNU=20General=20Public=20License=20as=20published=20= by=0A+the=20Free=20Software=20Foundation,=20either=20version=203=20of=20= the=20License,=20or=20(at=0A+your=20option)=20any=20later=20version.=0A+=0A= +GNU=20Emacs=20is=20distributed=20in=20the=20hope=20that=20it=20will=20= be=20useful,=0A+but=20WITHOUT=20ANY=20WARRANTY;=20without=20even=20the=20= implied=20warranty=20of=0A+MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20= PARTICULAR=20PURPOSE.=20=20See=20the=0A+GNU=20General=20Public=20License=20= for=20more=20details.=0A+=0A+You=20should=20have=20received=20a=20copy=20= of=20the=20GNU=20General=20Public=20License=0A+along=20with=20GNU=20= Emacs.=20=20If=20not,=20see=20.=20=20*/=0A= +=0A+#include=20=0A+=0A+#include=20"lisp.h"=0A+#include=20= "blockinput.h"=0A+#include=20"dispextern.h"=0A+#include=20"buffer.h"=0A= +#include=20"frame.h"=0A+#include=20"nsterm.h"=0A+#include=20"xwidget.h"=0A= +=0A+#import=20=0A+#import=20=0A+=0A= +/*=20Thoughts=20on=20NS=20Cocoa=20xwidget=20and=20webkit2:=0A+=0A+=20=20= =20Webkit2=20process=20architecture=20seems=20to=20be=20very=20hostile=20= for=20offscreen=0A+=20=20=20rendering=20techniques,=20which=20is=20used=20= by=20GTK=20xwiget=20implementation;=0A+=20=20=20Specifically=20NSView=20= level=20view=20sharing=20/=20copying=20is=20not=20working.=0A+=0A+=20=20=20= ***=20So=20only=20one=20view=20can=20be=20associcated=20with=20a=20= model.=20***=0A+=0A+=20=20=20With=20this=20decision,=20implementation=20= is=20plain=20and=20can=20expect=20best=20out=0A+=20=20=20of=20webkit2's=20= rationale.=20=20But=20process=20and=20session=20structures=20will=0A+=20=20= =20diverge=20from=20GTK=20xwiget.=20=20Though,=20cosmetically=20similar=20= usages=20can=0A+=20=20=20be=20presented=20and=20will=20be=20preferred,=20= if=20agreeable.=0A+=0A+=20=20=20For=20other=20widget=20types,=20OSR=20= seems=20possible,=20but=20will=20not=20care=20for=20a=0A+=20=20=20while.=20= =20*/=0A+=0A+/*=20Xwidget=20webkit.=20=20*/=0A+=0A+@interface=20= XwWebView=20:=20WKWebView=0A+=0A+@property=20struct=20xwidget=20*xw;=0A+/*=20= Map=20url=20to=20whether=20javascript=20is=20blocked=20by=0A+=20=20=20= 'Content-Security-Policy'=20sandbox=20without=20allow-scripts.=20=20*/=0A= +@property(retain)=20NSMutableDictionary=20*urlScriptBlocked;=0A+@end=0A= +@implementation=20XwWebView=20:=20WKWebView=0A+=0A+-=20= (id)initWithFrame:(CGRect)frame=0A+=20=20=20=20=20=20= configuration:(WKWebViewConfiguration=20*)configuration=0A+=20=20=20=20=20= =20=20=20=20=20=20=20xwidget:(struct=20xwidget=20*)xw=0A+{=0A+=20=20/*=20= Script=20controller=20to=20add=20script=20message=20handler=20and=20user=20= script.=20=20*/=0A+=20=20WKUserContentController=20*scriptor=20=3D=20= [[WKUserContentController=20alloc]=20init];=0A+=20=20= configuration.userContentController=20=3D=20scriptor;=0A+=0A+=20=20/*=20= Enable=20inspect=20element=20context=20menu=20item=20for=20debugging.=20=20= */=0A+=20=20[configuration.preferences=20setValue:@YES=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=20= =20forKey:@"developerExtrasEnabled"];=0A+=0A+=20=20Lisp_Object=20= enablePlugins=20=3D=0A+=20=20=20=20Fintern=20(build_string=20= ("xwidget-webkit-enable-plugins"),=20Qnil);=0A+=20=20if=20(!EQ=20= (Fsymbol_value=20(enablePlugins),=20Qnil))=0A+=20=20=20=20= configuration.preferences.plugInsEnabled=20=3D=20YES;=0A+=0A+=20=20self=20= =3D=20[super=20initWithFrame:frame=20configuration:configuration];=0A+=20= =20if=20(self)=0A+=20=20=20=20{=0A+=20=20=20=20=20=20self.xw=20=3D=20xw;=0A= +=20=20=20=20=20=20self.urlScriptBlocked=20=3D=20[[NSMutableDictionary=20= alloc]=20init];=0A+=20=20=20=20=20=20self.navigationDelegate=20=3D=20= self;=0A+=20=20=20=20=20=20self.UIDelegate=20=3D=20self;=0A+=20=20=20=20=20= =20self.customUserAgent=20=3D=0A+=20=20=20=20=20=20=20=20@"Mozilla/5.0=20= (Macintosh;=20Intel=20Mac=20OS=20X=2010_12_6)"=0A+=20=20=20=20=20=20=20=20= @"=20AppleWebKit/603.3.8=20(KHTML,=20like=20Gecko)"=0A+=20=20=20=20=20=20= =20=20@"=20Version/11.0.1=20Safari/603.3.8";=0A+=20=20=20=20=20=20= [scriptor=20addScriptMessageHandler:self=20name:@"keyDown"];=0A+=20=20=20= =20=20=20[scriptor=20addUserScript:[[WKUserScript=20alloc]=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= =20=20=20initWithSource:xwScript=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=20=20=20=20= injectionTime:=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=20=20=20=20=20= WKUserScriptInjectionTimeAtDocumentStart=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=20=20=20= forMainFrameOnly:NO]];=0A+=20=20=20=20}=0A+=20=20return=20self;=0A+}=0A+=0A= +-=20(void)webView:(WKWebView=20*)webView=0A= +didFinishNavigation:(WKNavigation=20*)navigation=0A+{=0A+=20=20if=20(EQ=20= (Fbuffer_live_p=20(self.xw->buffer),=20Qt))=0A+=20=20=20=20= store_xwidget_event_string=20(self.xw,=20"load-changed",=20"");=0A+}=0A+=0A= +-=20(void)webView:(WKWebView=20*)webView=0A= +decidePolicyForNavigationAction:(WKNavigationAction=20= *)navigationAction=0A+decisionHandler:(void=20= (^)(WKNavigationActionPolicy))decisionHandler=0A+{=0A+=20=20switch=20= (navigationAction.navigationType)=20{=0A+=20=20case=20= WKNavigationTypeLinkActivated:=0A+=20=20=20=20decisionHandler=20= (WKNavigationActionPolicyAllow);=0A+=20=20=20=20break;=0A+=20=20default:=0A= +=20=20=20=20//=20decisionHandler=20(WKNavigationActionPolicyCancel);=0A= +=20=20=20=20decisionHandler=20(WKNavigationActionPolicyAllow);=0A+=20=20= =20=20break;=0A+=20=20}=0A+}=0A+=0A+-=20(void)webView:(WKWebView=20= *)webView=0A+decidePolicyForNavigationResponse:(WKNavigationResponse=20= *)navigationResponse=0A+decisionHandler:(void=20= (^)(WKNavigationResponsePolicy))decisionHandler=0A+{=0A+=20=20= decisionHandler=20(WKNavigationResponsePolicyAllow);=0A+=0A+=20=20= self.urlScriptBlocked[navigationResponse.response.URL]=20=3D=0A+=20=20=20= =20[NSNumber=20numberWithBool:NO];=0A+=20=20if=20= ([navigationResponse.response=20isKindOfClass:[NSHTTPURLResponse=20= class]])=0A+=20=20=20=20{=0A+=20=20=20=20=20=20NSDictionary=20*headers=20= =3D=0A+=20=20=20=20=20=20=20=20((NSHTTPURLResponse=20*)=20= navigationResponse.response).allHeaderFields;=0A+=20=20=20=20=20=20= NSString=20*value=20=3D=20headers[@"Content-Security-Policy"];=0A+=20=20=20= =20=20=20if=20(value)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20/*=20TODO:=20Sloppy=20parsing=20of=20'Content-Security-Policy'=20= value.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20NSRange=20sandbox=20=3D=20= [value=20rangeOfString:@"sandbox"];=0A+=20=20=20=20=20=20=20=20=20=20if=20= (sandbox.location=20!=3D=20NSNotFound=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20&&=20(sandbox.location=20=3D=3D=200=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20||=20[value=20= characterAtIndex:(sandbox.location=20-=201)]=20=3D=3D=20'=20'=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20[value=20= characterAtIndex:(sandbox.location=20-=201)]=20=3D=3D=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=20= NSRange=20allowScripts=20=3D=20[value=20rangeOfString:@"allow-scripts"];=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20(allowScripts.location=20= =3D=3D=20NSNotFound=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20||=20allowScripts.location=20<=20sandbox.location)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20= self.urlScriptBlocked[navigationResponse.response.URL]=20=3D=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20[NSNumber=20= numberWithBool:YES];=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20= =20=20=20=20=20}=0A+=20=20=20=20}=0A+}=0A+=0A+/*=20No=20additional=20new=20= webview=20or=20emacs=20window=20will=20be=20created=0A+=20=20=20for=20.=20=20*/=0A+-=20(WKWebView=20= *)webView:(WKWebView=20*)webView=0A= +createWebViewWithConfiguration:(WKWebViewConfiguration=20= *)configuration=0A+=20=20=20forNavigationAction:(WKNavigationAction=20= *)navigationAction=0A+=20=20=20=20=20=20=20=20= windowFeatures:(WKWindowFeatures=20*)windowFeatures=0A+{=0A+=20=20if=20= (!navigationAction.targetFrame.isMainFrame)=0A+=20=20=20=20[webView=20= loadRequest:navigationAction.request];=0A+=20=20return=20nil;=0A+}=0A+=0A= +/*=20Open=20panel=20for=20file=20upload.=20=20*/=0A+-=20= (void)webView:(WKWebView=20*)webView=0A= +runOpenPanelWithParameters:(WKOpenPanelParameters=20*)parameters=0A= +initiatedByFrame:(WKFrameInfo=20*)frame=0A+completionHandler:(void=20= (^)(NSArray=20*URLs))completionHandler=0A+{=0A+=20=20= NSOpenPanel=20*openPanel=20=3D=20[NSOpenPanel=20openPanel];=0A+=20=20= openPanel.canChooseFiles=20=3D=20YES;=0A+=20=20= openPanel.canChooseDirectories=20=3D=20NO;=0A+=20=20= openPanel.allowsMultipleSelection=20=3D=20= parameters.allowsMultipleSelection;=0A+=20=20if=20([openPanel=20= runModal]=20=3D=3D=20NSModalResponseOK)=0A+=20=20=20=20completionHandler=20= (openPanel.URLs);=0A+=20=20else=0A+=20=20=20=20completionHandler=20= (nil);=0A+}=0A+=0A+/*=20By=20forwarding=20mouse=20events=20to=20emacs=20= view=20(frame)=0A+=20=20=20-=20Mouse=20click=20in=20webview=20selects=20= the=20window=20contains=20the=20webview.=0A+=20=20=20-=20Correct=20mouse=20= hand/arrow/I-beam=20is=20displayed=20(TODO:=20not=20perfect=20yet).=0A= +*/=0A+=0A+-=20(void)mouseDown:(NSEvent=20*)event=0A+{=0A+=20=20= [self.xw->xv->emacswindow=20mouseDown:event];=0A+=20=20[super=20= mouseDown:event];=0A+}=0A+=0A+-=20(void)mouseUp:(NSEvent=20*)event=0A+{=0A= +=20=20[self.xw->xv->emacswindow=20mouseUp:event];=0A+=20=20[super=20= mouseUp:event];=0A+}=0A+=0A+/*=20Basically=20we=20want=20keyboard=20= events=20handled=20by=20emacs=20unless=20an=20input=0A+=20=20=20element=20= has=20focus.=20=20Especially,=20while=20incremental=20search,=20we=20set=0A= +=20=20=20emacs=20as=20first=20responder=20to=20avoid=20focus=20held=20= in=20an=20input=20element=0A+=20=20=20with=20matching=20text.=20=20*/=0A= +=0A+-=20(void)keyDown:(NSEvent=20*)event=0A+{=0A+=20=20Lisp_Object=20= var=20=3D=20Fintern=20(build_string=20("isearch-mode"),=20Qnil);=0A+=20=20= Lisp_Object=20val=20=3D=20buffer_local_value=20(var,=20Fcurrent_buffer=20= ());=0A+=20=20if=20(!EQ=20(val,=20Qunbound)=20&&=20!EQ=20(val,=20Qnil))=0A= +=20=20=20=20{=0A+=20=20=20=20=20=20[self.window=20= makeFirstResponder:self.xw->xv->emacswindow];=0A+=20=20=20=20=20=20= [self.xw->xv->emacswindow=20keyDown:event];=0A+=20=20=20=20=20=20return;=0A= +=20=20=20=20}=0A+=0A+=20=20/*=20Emacs=20handles=20keyboard=20events=20= when=20javascript=20is=20blocked.=20=20*/=0A+=20=20if=20= ([self.urlScriptBlocked[self.URL]=20boolValue])=0A+=20=20=20=20{=0A+=20=20= =20=20=20=20[self.xw->xv->emacswindow=20keyDown:event];=0A+=20=20=20=20=20= =20return;=0A+=20=20=20=20}=0A+=0A+=20=20[self=20= evaluateJavaScript:@"xwHasFocus()"=0A+=20=20=20=20=20=20=20=20=20= completionHandler:^(id=20result,=20NSError=20*error)=20{=0A+=20=20=20=20=20= =20if=20(error)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20NSLog=20(@"xwHasFocus:=20%@",=20error);=0A+=20=20=20=20=20=20=20=20=20= =20[self.xw->xv->emacswindow=20keyDown:event];=0A+=20=20=20=20=20=20=20=20= }=0A+=20=20=20=20=20=20else=20if=20(result)=0A+=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20NSNumber=20*hasFocus=20=3D=20result;=20/*=20= __NSCFBoolean=20*/=0A+=20=20=20=20=20=20=20=20=20=20if=20= (!hasFocus.boolValue)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= [self.xw->xv->emacswindow=20keyDown:event];=0A+=20=20=20=20=20=20=20=20=20= =20else=0A+=20=20=20=20=20=20=20=20=20=20=20=20[super=20keyDown:event];=0A= +=20=20=20=20=20=20=20=20}=0A+=20=20=20=20}];=0A+}=0A+=0A+-=20= (void)interpretKeyEvents:(NSArray=20*)eventArray=0A+{=0A+=20= =20/*=20We=20should=20do=20nothing=20and=20do=20not=20forward=20(default=20= implementation=0A+=20=20=20=20=20if=20we=20not=20override=20here)=20to=20= let=20emacs=20collect=20key=20events=20and=20ask=0A+=20=20=20=20=20= interpretKeyEvents=20to=20its=20superclass.=20=20*/=0A+}=0A+=0A+static=20= NSString=20*xwScript;=0A++=20(void)initialize=0A+{=0A+=20=20/*=20Find=20= out=20if=20an=20input=20element=20has=20focus.=0A+=20=20=20=20=20Message=20= to=20script=20message=20handler=20when=20'C-g'=20key=20down.=20=20*/=0A+=20= =20if=20(!xwScript)=0A+=20=20=20=20xwScript=20=3D=0A+=20=20=20=20=20=20= @"function=20xwHasFocus()=20{"=0A+=20=20=20=20=20=20@"=20=20var=20ae=20=3D= =20document.activeElement;"=0A+=20=20=20=20=20=20@"=20=20if=20(ae)=20{"=0A= +=20=20=20=20=20=20@"=20=20=20=20var=20name=20=3D=20ae.nodeName;"=0A+=20=20= =20=20=20=20@"=20=20=20=20return=20name=20=3D=3D=20'INPUT'=20||=20name=20= =3D=3D=20'TEXTAREA';"=0A+=20=20=20=20=20=20@"=20=20}=20else=20{"=0A+=20=20= =20=20=20=20@"=20=20=20=20return=20false;"=0A+=20=20=20=20=20=20@"=20=20= }"=0A+=20=20=20=20=20=20@"}"=0A+=20=20=20=20=20=20@"function=20= xwKeyDown(event)=20{"=0A+=20=20=20=20=20=20@"=20=20if=20(event.ctrlKey=20= &&=20event.key=20=3D=3D=20'g')=20{"=0A+=20=20=20=20=20=20@"=20=20=20=20= window.webkit.messageHandlers.keyDown.postMessage('C-g');"=0A+=20=20=20=20= =20=20@"=20=20}"=0A+=20=20=20=20=20=20@"}"=0A+=20=20=20=20=20=20= @"document.addEventListener('keydown',=20xwKeyDown);"=0A+=20=20=20=20=20=20= ;=0A+}=0A+=0A+/*=20Confirming=20to=20WKScriptMessageHandler,=20listens=20= concerning=20keyDown=20in=0A+=20=20=20webkit.=20Currently=20'C-g'.=20=20= */=0A+-=20(void)userContentController:(WKUserContentController=20= *)userContentController=0A+=20=20=20=20=20=20= didReceiveScriptMessage:(WKScriptMessage=20*)message=0A+{=0A+=20=20if=20= ([message.body=20isEqualToString:@"C-g"])=0A+=20=20=20=20{=0A+=20=20=20=20= =20=20/*=20Just=20give=20up=20focus,=20no=20relay=20"C-g"=20to=20emacs,=20= another=20"C-g"=0A+=20=20=20=20=20=20=20=20=20follows=20will=20be=20= handled=20by=20emacs.=20=20*/=0A+=20=20=20=20=20=20[self.window=20= makeFirstResponder:self.xw->xv->emacswindow];=0A+=20=20=20=20}=0A+}=0A+=0A= +@end=0A+=0A+/*=20Xwidget=20webkit=20commands.=20=20*/=0A+=0A+static=20= Lisp_Object=20build_string_with_nsstr=20(NSString=20*nsstr);=0A+=0A+bool=0A= +nsxwidget_is_web_view=20(struct=20xwidget=20*xw)=0A+{=0A+=20=20return=20= xw->xwWidget=20!=3D=20NULL=20&&=0A+=20=20=20=20[xw->xwWidget=20= isKindOfClass:WKWebView.class];=0A+}=0A+/*=20@Note=20ATS=20-=20Need=20= application=20transport=20security=20in=20'Info.plist'=20or=0A+=20=20=20= remote=20pages=20will=20not=20loaded.=20=20*/=0A+void=0A= +nsxwidget_webkit_goto_uri=20(struct=20xwidget=20*xw,=20const=20char=20= *uri)=0A+{=0A+=20=20XwWebView=20*xwWebView=20=3D=20(XwWebView=20*)=20= xw->xwWidget;=0A+=20=20NSString=20*urlString=20=3D=20[NSString=20= stringWithUTF8String:uri];=0A+=20=20NSURL=20*url=20=3D=20[NSURL=20= URLWithString:urlString];=0A+=20=20NSURLRequest=20*urlRequest=20=3D=20= [NSURLRequest=20requestWithURL:url];=0A+=20=20[xwWebView=20= loadRequest:urlRequest];=0A+}=0A+=0A+void=0A+nsxwidget_webkit_zoom=20= (struct=20xwidget=20*xw,=20double=20zoom_change)=0A+{=0A+=20=20XwWebView=20= *xwWebView=20=3D=20(XwWebView=20*)=20xw->xwWidget;=0A+=20=20= xwWebView.magnification=20+=3D=20zoom_change;=0A+=20=20/*=20TODO:=20= setMagnification:centeredAtPoint.=20=20*/=0A+}=0A+=0A+/*=20Build=20lisp=20= string=20*/=0A+static=20Lisp_Object=0A+build_string_with_nsstr=20= (NSString=20*nsstr)=0A+{=0A+=20=20const=20char=20*utfstr=20=3D=20[nsstr=20= UTF8String];=0A+=20=20NSUInteger=20bytes=20=3D=20[nsstr=20= lengthOfBytesUsingEncoding:NSUTF8StringEncoding];=0A+=20=20return=20= make_string=20(utfstr,=20bytes);=0A+}=0A+=0A+/*=20Recursively=20convert=20= an=20objc=20native=20type=20JavaScript=20value=20to=20a=20Lisp=0A+=20=20=20= value.=20=20Mostly=20copied=20from=20GTK=20xwidget=20= 'webkit_js_to_lisp'.=20=20*/=0A+static=20Lisp_Object=0A+js_to_lisp=20(id=20= value)=0A+{=0A+=20=20if=20(value=20=3D=3D=20nil=20||=20[value=20= isKindOfClass:NSNull.class])=0A+=20=20=20=20return=20Qnil;=0A+=20=20else=20= if=20([value=20isKindOfClass:NSString.class])=0A+=20=20=20=20return=20= build_string_with_nsstr=20((NSString=20*)=20value);=0A+=20=20else=20if=20= ([value=20isKindOfClass:NSNumber.class])=0A+=20=20=20=20{=0A+=20=20=20=20= =20=20NSNumber=20*nsnum=20=3D=20(NSNumber=20*)=20value;=0A+=20=20=20=20=20= =20char=20type=20=3D=20nsnum.objCType[0];=0A+=20=20=20=20=20=20if=20= (type=20=3D=3D=20'c')=20/*=20__NSCFBoolean=20has=20type=20character=20= 'c'.=20=20*/=0A+=20=20=20=20=20=20=20=20return=20nsnum.boolValue?=20Qt=20= :=20Qnil;=0A+=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20{=0A+=20=20= =20=20=20=20=20=20=20=20if=20(type=20=3D=3D=20'i'=20||=20type=20=3D=3D=20= 'l')=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=20make_int=20= (nsnum.longValue);=0A+=20=20=20=20=20=20=20=20=20=20else=20if=20(type=20= =3D=3D=20'f'=20||=20type=20=3D=3D=20'd')=0A+=20=20=20=20=20=20=20=20=20=20= =20=20return=20make_float=20(nsnum.doubleValue);=0A+=20=20=20=20=20=20=20= =20=20=20/*=20else=20fall=20through.=20=20*/=0A+=20=20=20=20=20=20=20=20= }=0A+=20=20=20=20}=0A+=20=20else=20if=20([value=20= isKindOfClass:NSArray.class])=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= NSArray=20*nsarr=20=3D=20(NSArray=20*)=20value;=0A+=20=20=20=20=20=20= EMACS_INT=20n=20=3D=20nsarr.count;=0A+=20=20=20=20=20=20Lisp_Object=20= obj;=0A+=20=20=20=20=20=20struct=20Lisp_Vector=20*p=20=3D=20= allocate_vector=20(n);=0A+=0A+=20=20=20=20=20=20for=20(ptrdiff_t=20i=20=3D= =200;=20i=20<=20n;=20++i)=0A+=20=20=20=20=20=20=20=20p->contents[i]=20=3D=20= js_to_lisp=20([nsarr=20objectAtIndex:i]);=0A+=20=20=20=20=20=20= XSETVECTOR=20(obj,=20p);=0A+=20=20=20=20=20=20return=20obj;=0A+=20=20=20=20= }=0A+=20=20else=20if=20([value=20isKindOfClass:NSDictionary.class])=0A+=20= =20=20=20{=0A+=20=20=20=20=20=20NSDictionary=20*nsdict=20=3D=20= (NSDictionary=20*)=20value;=0A+=20=20=20=20=20=20NSArray=20*keys=20=3D=20= nsdict.allKeys;=0A+=20=20=20=20=20=20ptrdiff_t=20n=20=3D=20keys.count;=0A= +=20=20=20=20=20=20Lisp_Object=20obj;=0A+=20=20=20=20=20=20struct=20= Lisp_Vector=20*p=20=3D=20allocate_vector=20(n);=0A+=0A+=20=20=20=20=20=20= for=20(ptrdiff_t=20i=20=3D=200;=20i=20<=20n;=20++i)=0A+=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20NSString=20*prop_key=20=3D=20= (NSString=20*)=20[keys=20objectAtIndex:i];=0A+=20=20=20=20=20=20=20=20=20= =20id=20prop_value=20=3D=20[nsdict=20valueForKey:prop_key];=0A+=20=20=20=20= =20=20=20=20=20=20p->contents[i]=20=3D=20Fcons=20= (build_string_with_nsstr=20(prop_key),=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=20=20=20=20=20= js_to_lisp=20(prop_value));=0A+=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20= =20XSETVECTOR=20(obj,=20p);=0A+=20=20=20=20=20=20return=20obj;=0A+=20=20=20= =20}=0A+=20=20NSLog=20(@"Unhandled=20type=20in=20javascript=20result");=0A= +=20=20return=20Qnil;=0A+}=0A+=0A+void=0A= +nsxwidget_webkit_execute_script=20(struct=20xwidget=20*xw,=20const=20= char=20*script,=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=20=20=20=20Lisp_Object=20fun)=0A+{=0A+=20= =20XwWebView=20*xwWebView=20=3D=20(XwWebView=20*)=20xw->xwWidget;=0A+=20=20= if=20([xwWebView.urlScriptBlocked[xwWebView.URL]=20boolValue])=0A+=20=20=20= =20{=0A+=20=20=20=20=20=20message=20("Javascript=20is=20blocked=20by=20= 'CSP:=20sandbox'.");=0A+=20=20=20=20=20=20return;=0A+=20=20=20=20}=0A+=0A= +=20=20NSString=20*javascriptString=20=3D=20[NSString=20= stringWithUTF8String:script];=0A+=20=20[xwWebView=20= evaluateJavaScript:javascriptString=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20completionHandler:^(id=20result,=20NSError=20*error)=20{=0A+=20=20=20= =20=20=20if=20(error)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20NSLog=20(@"evaluateJavaScript=20error=20:=20%@",=20= error.localizedDescription);=0A+=20=20=20=20=20=20=20=20=20=20NSLog=20= (@"error=20script=3D%@",=20javascriptString);=0A+=20=20=20=20=20=20=20=20= }=0A+=20=20=20=20=20=20else=20if=20(result=20&&=20FUNCTIONP=20(fun))=0A+=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20//=20NSLog=20= (@"result=3D%@,=20type=3D%@",=20result,=20[result=20class]);=0A+=20=20=20= =20=20=20=20=20=20=20Lisp_Object=20lisp_value=20=3D=20js_to_lisp=20= (result);=0A+=20=20=20=20=20=20=20=20=20=20= store_xwidget_js_callback_event=20(xw,=20fun,=20lisp_value);=0A+=20=20=20= =20=20=20=20=20}=0A+=20=20=20=20}];=0A+}=0A+=0A+/*=20Window=20containing=20= an=20xwidget.=20=20*/=0A+=0A+@implementation=20XwWindow=0A+-=20= (BOOL)isFlipped=20{=20return=20YES;=20}=0A+@end=0A+=0A+/*=20Xwidget=20= model,=20macOS=20Cocoa=20part.=20=20*/=0A+=0A+void=0A= +nsxwidget_init(struct=20xwidget=20*xw)=0A+{=0A+=20=20block_input=20();=0A= +=20=20NSRect=20rect=20=3D=20NSMakeRect=20(0,=200,=20xw->width,=20= xw->height);=0A+=20=20xw->xwWidget=20=3D=20[[XwWebView=20alloc]=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20initWithFrame:rect=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= configuration:[[WKWebViewConfiguration=20alloc]=20init]=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=20xwidget:xw];=0A= +=20=20xw->xwWindow=20=3D=20[[XwWindow=20alloc]=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20initWithFrame:rect];=0A+=20=20= [xw->xwWindow=20addSubview:xw->xwWidget];=0A+=20=20xw->xv=20=3D=20NULL;=20= /*=20for=201=20to=201=20relationship=20of=20webkit2.=20=20*/=0A+=20=20= unblock_input=20();=0A+}=0A+=0A+void=0A+nsxwidget_kill=20(struct=20= xwidget=20*xw)=0A+{=0A+=20=20if=20(xw)=0A+=20=20=20=20{=0A+=20=20=20=20=20= =20WKUserContentController=20*scriptor=20=3D=0A+=20=20=20=20=20=20=20=20= ((XwWebView=20*)=20xw->xwWidget).configuration.userContentController;=0A= +=20=20=20=20=20=20[scriptor=20removeAllUserScripts];=0A+=20=20=20=20=20=20= [scriptor=20removeScriptMessageHandlerForName:@"keyDown"];=0A+=20=20=20=20= =20=20[scriptor=20release];=0A+=20=20=20=20=20=20if=20(xw->xv)=0A+=20=20=20= =20=20=20=20=20xw->xv->model=20=3D=20Qnil;=20/*=20Make=20sure=20related=20= view=20stale.=20=20*/=0A+=0A+=20=20=20=20=20=20/*=20This=20stops=20= playing=20audio=20when=20a=20xwidget-webkit=20buffer=20is=0A+=20=20=20=20= =20=20=20=20=20killed.=20=20I=20could=20not=20find=20other=20solution.=20= =20*/=0A+=20=20=20=20=20=20nsxwidget_webkit_goto_uri=20(xw,=20= "about:blank");=0A+=0A+=20=20=20=20=20=20[((XwWebView=20*)=20= xw->xwWidget).urlScriptBlocked=20release];=0A+=20=20=20=20=20=20= [xw->xwWidget=20removeFromSuperviewWithoutNeedingDisplay];=0A+=20=20=20=20= =20=20[xw->xwWidget=20release];=0A+=20=20=20=20=20=20[xw->xwWindow=20= removeFromSuperviewWithoutNeedingDisplay];=0A+=20=20=20=20=20=20= [xw->xwWindow=20release];=0A+=20=20=20=20=20=20xw->xwWidget=20=3D=20nil;=0A= +=20=20=20=20}=0A+}=0A+=0A+void=0A+nsxwidget_resize=20(struct=20xwidget=20= *xw)=0A+{=0A+=20=20if=20(xw->xwWidget)=0A+=20=20=20=20{=0A+=20=20=20=20=20= =20[xw->xwWindow=20setFrameSize:NSMakeSize(xw->width,=20xw->height)];=0A= +=20=20=20=20=20=20[xw->xwWidget=20setFrameSize:NSMakeSize(xw->width,=20= xw->height)];=0A+=20=20=20=20}=0A+}=0A+=0A+Lisp_Object=0A= +nsxwidget_get_size=20(struct=20xwidget=20*xw)=0A+{=0A+=20=20return=20= list2i=20(xw->xwWidget.frame.size.width,=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20xw->xwWidget.frame.size.height);=0A+}=0A+=0A+/*=20= Xwidget=20view,=20macOS=20Cocoa=20part.=20=20*/=0A+=0A+@implementation=20= XvWindow=20:=20NSView=0A+-=20(BOOL)isFlipped=20{=20return=20YES;=20}=0A= +@end=0A+=0A+void=0A+nsxwidget_init_view=20(struct=20xwidget_view=20*xv,=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20struct=20= xwidget=20*xw,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20struct=20glyph_string=20*s,=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20int=20x,=20int=20y)=0A+{=0A+=20=20/*=20= 'x_draw_xwidget_glyph_string'=20will=20calculate=20correct=20position=20= and=0A+=20=20=20=20=20size=20of=20clip=20to=20draw=20in=20emacs=20buffer=20= window.=20=20Thus,=20just=20begin=20at=0A+=20=20=20=20=20origin=20with=20= no=20crop.=20=20*/=0A+=20=20xv->x=20=3D=20x;=0A+=20=20xv->y=20=3D=20y;=0A= +=20=20xv->clip_left=20=3D=200;=0A+=20=20xv->clip_right=20=3D=20= xw->width;=0A+=20=20xv->clip_top=20=3D=200;=0A+=20=20xv->clip_bottom=20=3D= =20xw->height;=0A+=0A+=20=20xv->xvWindow=20=3D=20[[XvWindow=20alloc]=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= initWithFrame:NSMakeRect=20(x,=20y,=20xw->width,=20xw->height)];=0A+=20=20= xv->xvWindow.xw=20=3D=20xw;=0A+=20=20xv->xvWindow.xv=20=3D=20xv;=0A+=0A+=20= =20xw->xv=20=3D=20xv;=20/*=20For=201=20to=201=20relationship=20of=20= webkit2.=20=20*/=0A+=20=20[xv->xvWindow=20addSubview:xw->xwWindow];=0A+=0A= +=20=20xv->emacswindow=20=3D=20FRAME_NS_VIEW=20(s->f);=0A+=20=20= [xv->emacswindow=20addSubview:xv->xvWindow];=0A+}=0A+=0A+void=0A= +nsxwidget_delete_view=20(struct=20xwidget_view=20*xv)=0A+{=0A+=20=20if=20= (!EQ=20(xv->model,=20Qnil))=0A+=20=20=20=20{=0A+=20=20=20=20=20=20struct=20= xwidget=20*xw=20=3D=20XXWIDGET=20(xv->model);=0A+=20=20=20=20=20=20= [xw->xwWindow=20removeFromSuperviewWithoutNeedingDisplay];=0A+=20=20=20=20= =20=20xw->xv=20=3D=20NULL;=20/*=20Now=20model=20has=20no=20view.=20=20*/=0A= +=20=20=20=20}=0A+=20=20[xv->xvWindow=20= removeFromSuperviewWithoutNeedingDisplay];=0A+=20=20[xv->xvWindow=20= release];=0A+}=0A+=0A+void=0A+nsxwidget_show_view=20(struct=20= xwidget_view=20*xv)=0A+{=0A+=20=20xv->hidden=20=3D=20NO;=0A+=20=20= [xv->xvWindow=20setFrameOrigin:NSMakePoint(xv->x=20+=20xv->clip_left,=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=20=20=20=20=20=20=20=20=20=20=20=20=20=20xv->y=20+=20= xv->clip_top)];=0A+}=0A+=0A+void=0A+nsxwidget_hide_view=20(struct=20= xwidget_view=20*xv)=0A+{=0A+=20=20xv->hidden=20=3D=20YES;=0A+=20=20= [xv->xvWindow=20setFrameOrigin:NSMakePoint(10000,=2010000)];=0A+}=0A+=0A= +void=0A+nsxwidget_resize_view=20(struct=20xwidget_view=20*xv,=20int=20= width,=20int=20height)=0A+{=0A+=20=20[xv->xvWindow=20= setFrameSize:NSMakeSize(width,=20height)];=0A+}=0A+=0A+void=0A= +nsxwidget_move_view=20(struct=20xwidget_view=20*xv,=20int=20x,=20int=20= y)=0A+{=0A+=20=20[xv->xvWindow=20setFrameOrigin:NSMakePoint=20(x,=20y)];=0A= +}=0A+=0A+/*=20Move=20model=20window=20in=20container=20(view=20window).=20= =20*/=0A+void=0A+nsxwidget_move_widget_in_view=20(struct=20xwidget_view=20= *xv,=20int=20x,=20int=20y)=0A+{=0A+=20=20struct=20xwidget=20*xww=20=3D=20= xv->xvWindow.xw;=0A+=20=20[xww->xwWindow=20setFrameOrigin:NSMakePoint=20= (x,=20y)];=0A+}=0A+=0A+void=0A+nsxwidget_set_needsdisplay=20(struct=20= xwidget_view=20*xv)=0A+{=0A+=20=20xv->xvWindow.needsDisplay=20=3D=20YES;=0A= +}=0Adiff=20--git=20a/src/xwidget.c=20b/src/xwidget.c=0Aindex=20= 121510ebac..b841516c9f=20100644=0A---=20a/src/xwidget.c=0A+++=20= b/src/xwidget.c=0A@@=20-23,21=20+23,31=20@@=20Copyright=20(C)=20= 2011-2019=20Free=20Software=20Foundation,=20Inc.=0A=20=0A=20#include=20= "lisp.h"=0A=20#include=20"blockinput.h"=0A+#include=20"dispextern.h"=0A=20= #include=20"frame.h"=0A=20#include=20"keyboard.h"=0A=20#include=20= "gtkutil.h"=0A=20#include=20"sysstdio.h"=0A+#include=20"termhooks.h"=0A= +#include=20"window.h"=0A=20=0A+/*=20Include=20xwidget=20bottom=20end=20= headers.=20=20*/=0A+#ifdef=20USE_GTK=0A=20#include=20=0A= =20#include=20=0A+#elif=20defined=20= NS_IMPL_COCOA=0A+#include=20"nsxwidget.h"=0A+#endif=0A=20=0A=20/*=20= Suppress=20GCC=20deprecation=20warnings=20starting=20in=20WebKitGTK+=20= 2.21.1=20for=0A=20=20=20=20webkit_javascript_result_get_global_context=20= and=0A=20=20=20=20webkit_javascript_result_get_value=20(Bug#33679).=0A=20= =20=20=20FIXME:=20Use=20the=20JavaScriptCore=20GLib=20API=20instead,=20= and=20remove=20this=20hack.=20=20*/=0A+#ifdef=20USE_GTK=0A=20#if=20= WEBKIT_CHECK_VERSION=20(2,=2021,=201)=20&&=20GNUC_PREREQ=20(4,=202,=200)=0A= =20#=20pragma=20GCC=20diagnostic=20ignored=20"-Wdeprecated-declarations"=0A= =20#endif=0A+#endif=0A=20=0A=20static=20struct=20xwidget=20*=0A=20= allocate_xwidget=20(void)=0A@@=20-56,6=20+66,7=20@@=20#define=20= XSETXWIDGET_VIEW(a,=20b)=20XSETPSEUDOVECTOR=20(a,=20b,=20= PVEC_XWIDGET_VIEW)=0A=20=0A=20static=20struct=20xwidget_view=20= *xwidget_view_lookup=20(struct=20xwidget=20*,=0A=20=09=09=09=09=09=09=20= struct=20window=20*);=0A+#ifdef=20USE_GTK=0A=20static=20void=20= webkit_view_load_changed_cb=20(WebKitWebView=20*,=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=20=20=20= =20=20=20=20=20=20=20=20=20=20WebKitLoadEvent,=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=20=20=20=20= =20=20=20=20=20=20=20=20=20gpointer);=0A@@=20-69,6=20+80,7=20@@=20= webkit_decide_policy_cb=20(WebKitWebView=20*,=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=20WebKitPolicyDecision=20= *,=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=20WebKitPolicyDecisionType,=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=20gpointer);=0A+#endif=0A=20=0A=20= =0A=20DEFUN=20("make-xwidget",=0A@@=20-86,8=20+98,10=20@@=20DEFUN=20= ("make-xwidget",=0A=20=20=20=20Lisp_Object=20title,=20Lisp_Object=20= width,=20Lisp_Object=20height,=0A=20=20=20=20Lisp_Object=20arguments,=20= Lisp_Object=20buffer)=0A=20{=0A+#ifdef=20USE_GTK=0A=20=20=20if=20= (!xg_gtk_initialized)=0A=20=20=20=20=20error=20("make-xwidget:=20GTK=20= has=20not=20been=20initialized");=0A+#endif=0A=20=20=20CHECK_SYMBOL=20= (type);=0A=20=20=20CHECK_FIXNAT=20(width);=0A=20=20=20CHECK_FIXNAT=20= (height);=0A@@=20-102,10=20+116,11=20@@=20DEFUN=20("make-xwidget",=0A=20=20= =20xw->kill_without_query=20=3D=20false;=0A=20=20=20XSETXWIDGET=20(val,=20= xw);=0A=20=20=20Vxwidget_list=20=3D=20Fcons=20(val,=20Vxwidget_list);=0A= -=20=20xw->widgetwindow_osr=20=3D=20NULL;=0A-=20=20xw->widget_osr=20=3D=20= NULL;=0A=20=20=20xw->plist=20=3D=20Qnil;=0A=20=0A+#ifdef=20USE_GTK=0A+=20= =20xw->widgetwindow_osr=20=3D=20NULL;=0A+=20=20xw->widget_osr=20=3D=20= NULL;=0A=20=20=20if=20(EQ=20(xw->type,=20Qwebkit))=0A=20=20=20=20=20{=0A=20= =20=20=20=20=20=20block_input=20();=0A@@=20-160,6=20+175,9=20@@=20DEFUN=20= ("make-xwidget",=0A=20=0A=20=20=20=20=20=20=20unblock_input=20();=0A=20=20= =20=20=20}=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20=20nsxwidget_init=20= (xw);=0A+#endif=0A=20=0A=20=20=20return=20val;=0A=20}=0A@@=20-195,6=20= +213,7=20@@=20xwidget_hidden=20(struct=20xwidget_view=20*xv)=0A=20=20=20= return=20xv->hidden;=0A=20}=0A=20=0A+#ifdef=20USE_GTK=0A=20static=20void=0A= =20xwidget_show_view=20(struct=20xwidget_view=20*xv)=0A=20{=0A@@=20= -228,13=20+247,14=20@@=20offscreen_damage_event=20(GtkWidget=20*widget,=20= GdkEvent=20*event,=0A=20=20=20if=20(GTK_IS_WIDGET=20(xv_widget))=0A=20=20= =20=20=20gtk_widget_queue_draw=20(GTK_WIDGET=20(xv_widget));=0A=20=20=20= else=0A-=20=20=20=20printf=20("Warning,=20offscreen_damage_event=20= received=20invalid=20xv=20pointer:%p\n",=0A-=20=20=20=20=20=20=20=20=20=20= =20=20xv_widget);=0A+=20=20=20=20message=20("Warning,=20= offscreen_damage_event=20received=20invalid=20xv=20pointer:%p\n",=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20xv_widget);=0A=20=0A=20=20=20return=20= FALSE;=0A=20}=0A+#endif=20/*=20USE_GTK=20*/=0A=20=0A-static=20void=0A= +void=0A=20store_xwidget_event_string=20(struct=20xwidget=20*xw,=20const=20= char=20*eventname,=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=20const=20char=20*eventstr)=0A=20{=0A@@=20= -248,7=20+268,7=20@@=20store_xwidget_event_string=20(struct=20xwidget=20= *xw,=20const=20char=20*eventname,=0A=20=20=20kbd_buffer_store_event=20= (&event);=0A=20}=0A=20=0A-static=20void=0A+void=0A=20= store_xwidget_js_callback_event=20(struct=20xwidget=20*xw,=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= =20=20=20=20=20Lisp_Object=20proc,=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=20=20=20=20=20= Lisp_Object=20argument)=0A@@=20-264,6=20+284,7=20@@=20= store_xwidget_js_callback_event=20(struct=20xwidget=20*xw,=0A=20}=0A=20=0A= =20=0A+#ifdef=20USE_GTK=0A=20void=0A=20webkit_view_load_changed_cb=20= (WebKitWebView=20*webkitwebview,=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=20WebKitLoadEvent=20= load_event,=0A@@=20-521,6=20+542,7=20@@=20xwidget_osr_event_set_embedder=20= (GtkWidget=20*widget,=20GdkEvent=20*event,=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=20=20=20=20=20=20= =20=20=20gtk_widget_get_window=20(xv->widget));=0A=20=20=20return=20= FALSE;=0A=20}=0A+#endif=20/*=20USE_GTK=20*/=0A=20=0A=20=0A=20/*=20= Initializes=20and=20does=20initial=20placement=20of=20an=20xwidget=20= view=20on=20screen.=20=20*/=0A@@=20-530,8=20+552,10=20@@=20= xwidget_init_view=20(struct=20xwidget=20*xww,=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20int=20x,=20int=20y)=0A=20{=0A=20=0A= +#ifdef=20USE_GTK=0A=20=20=20if=20(!xg_gtk_initialized)=0A=20=20=20=20=20= error=20("xwidget_init_view:=20GTK=20has=20not=20been=20initialized");=0A= +#endif=0A=20=0A=20=20=20struct=20xwidget_view=20*xv=20=3D=20= allocate_xwidget_view=20();=0A=20=20=20Lisp_Object=20val;=0A@@=20-542,6=20= +566,7=20@@=20xwidget_init_view=20(struct=20xwidget=20*xww,=0A=20=20=20= XSETWINDOW=20(xv->w,=20s->w);=0A=20=20=20XSETXWIDGET=20(xv->model,=20= xww);=0A=20=0A+#ifdef=20USE_GTK=0A=20=20=20if=20(EQ=20(xww->type,=20= Qwebkit))=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20xv->widget=20=3D=20= gtk_drawing_area_new=20();=0A@@=20-599,6=20+624,10=20@@=20= xwidget_init_view=20(struct=20xwidget=20*xww,=0A=20=20=20xv->x=20=3D=20= x;=0A=20=20=20xv->y=20=3D=20y;=0A=20=20=20gtk_widget_show_all=20= (xv->widgetwindow);=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20=20= nsxwidget_init_view=20(xv,=20xww,=20s,=20x,=20y);=0A+=20=20= nsxwidget_resize_view(xv,=20xww->width,=20xww->height);=0A+#endif=0A=20=0A= =20=20=20return=20xv;=0A=20}=0A@@=20-611,6=20+640,7=20@@=20= x_draw_xwidget_glyph_string=20(struct=20glyph_string=20*s)=0A=20=20=20=20= =20=20initialization.=20=20*/=0A=20=20=20struct=20xwidget=20*xww=20=3D=20= s->xwidget;=0A=20=20=20struct=20xwidget_view=20*xv=20=3D=20= xwidget_view_lookup=20(xww,=20s->w);=0A+=20=20int=20text_area_x,=20= text_area_y,=20text_area_width,=20text_area_height;=0A=20=20=20int=20= clip_right;=0A=20=20=20int=20clip_bottom;=0A=20=20=20int=20clip_top;=0A= @@=20-622,13=20+652,47=20@@=20x_draw_xwidget_glyph_string=20(struct=20= glyph_string=20*s)=0A=20=20=20/*=20Do=20initialization=20here=20in=20the=20= display=20loop=20because=20there=20is=20no=0A=20=20=20=20=20=20other=20= time=20to=20know=20things=20like=20window=20placement=20etc.=20=20Do=20= not=0A=20=20=20=20=20=20create=20a=20new=20view=20if=20we=20have=20found=20= one=20that=20is=20usable.=20=20*/=0A+#ifdef=20USE_GTK=0A=20=20=20if=20= (!xv)=0A=20=20=20=20=20xv=20=3D=20xwidget_init_view=20(xww,=20s,=20x,=20= y);=0A-=0A-=20=20int=20text_area_x,=20text_area_y,=20text_area_width,=20= text_area_height;=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20=20if=20(!xv)=0A= +=20=20=20=20{=0A+=20=20=20=20=20=20/*=20Enforce=201=20to=201,=20model=20= and=20view=20for=20macOS=20Cocoa=20webkit2.=20=20*/=0A+=20=20=20=20=20=20= if=20(xww->xv)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20if=20(xwidget_hidden=20(xww->xv))=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=20Lisp_Object=20xvl;=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20XSETXWIDGET_VIEW=20(xvl,=20= xww->xv);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= Fdelete_xwidget_view=20(xvl);=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=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20message=20("You=20can't=20= share=20an=20xwidget=20(webkit2)=20among=20windows.");=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20return;=0A+=20=20=20=20=20=20=20=20=20=20=20=20= }=0A+=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20xv=20=3D=20= xwidget_init_view=20(xww,=20s,=20x,=20y);=0A+=20=20=20=20}=0A+#endif=0A=20= =0A=20=20=20window_box=20(s->w,=20TEXT_AREA,=20&text_area_x,=20= &text_area_y,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= &text_area_width,=20&text_area_height);=0A+=0A+=20=20/*=20Resize=20= xwidget=20webkit=20if=20its=20container=20window=20size=20is=20changed=20= in=0A+=20=20=20=20=20some=20ways,=20for=20example,=20a=20buffer=20became=20= hidden=20in=20small=20split=0A+=20=20=20=20=20window,=20then=20it=20can=20= appear=20front=20in=20merged=20whole=20window.=20=20*/=0A+=20=20if=20(EQ=20= (xww->type,=20Qwebkit)=0A+=20=20=20=20=20=20&&=20(xww->width=20!=3D=20= text_area_width=20||=20xww->height=20!=3D=20text_area_height))=0A+=20=20=20= =20{=0A+=20=20=20=20=20=20Lisp_Object=20xwl;=0A+=20=20=20=20=20=20= XSETXWIDGET=20(xwl,=20xww);=0A+=20=20=20=20=20=20Fxwidget_resize=20(xwl,=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= make_int=20(text_area_width),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20make_int=20(text_area_height));=0A+=20=20=20=20= }=0A+=0A=20=20=20clip_left=20=3D=20max=20(0,=20text_area_x=20-=20x);=0A=20= =20=20clip_right=20=3D=20max=20(clip_left,=0A=20=09=09=20=20=20=20min=20= (xww->width,=20text_area_x=20+=20text_area_width=20-=20x));=0A@@=20= -651,8=20+715,14=20@@=20x_draw_xwidget_glyph_string=20(struct=20= glyph_string=20*s)=0A=20=0A=20=20=20/*=20Has=20it=20moved?=20=20*/=0A=20=20= =20if=20(moved)=0A-=20=20=20=20gtk_fixed_move=20(GTK_FIXED=20= (FRAME_GTK_WIDGET=20(s->f)),=0A-=09=09=20=20=20=20xv->widgetwindow,=20x=20= +=20clip_left,=20y=20+=20clip_top);=0A+=20=20=20=20{=0A+#ifdef=20USE_GTK=0A= +=20=20=20=20=20=20gtk_fixed_move=20(GTK_FIXED=20(FRAME_GTK_WIDGET=20= (s->f)),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20xv->widgetwindow,=20x=20+=20clip_left,=20y=20+=20clip_top);=0A+#elif=20= defined=20NS_IMPL_COCOA=0A+=20=20=20=20=20=20nsxwidget_move_view=20(xv,=20= x=20+=20clip_left,=20y=20+=20clip_top);=0A+#endif=0A+=20=20=20=20}=0A=20=0A= =20=20=20/*=20Clip=20the=20widget=20window=20if=20some=20parts=20happen=20= to=20be=20outside=0A=20=20=20=20=20=20drawable=20area.=20=20An=20Emacs=20= window=20is=20not=20a=20gtk=20window.=20=20A=20gtk=20window=0A@@=20= -663,10=20+733,16=20@@=20x_draw_xwidget_glyph_string=20(struct=20= glyph_string=20*s)=0A=20=20=20=20=20=20=20||=20xv->clip_bottom=20!=3D=20= clip_bottom=0A=20=20=20=20=20=20=20||=20xv->clip_top=20!=3D=20clip_top=20= ||=20xv->clip_left=20!=3D=20clip_left)=0A=20=20=20=20=20{=0A+#ifdef=20= USE_GTK=0A=20=20=20=20=20=20=20gtk_widget_set_size_request=20= (xv->widgetwindow,=20clip_right=20-=20clip_left,=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=20=20=20=20= =20=20=20clip_bottom=20-=20clip_top);=0A=20=20=20=20=20=20=20= gtk_fixed_move=20(GTK_FIXED=20(xv->widgetwindow),=20xv->widget,=20= -clip_left,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20-clip_top);=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20=20=20=20=20= =20nsxwidget_resize_view=20(xv,=20clip_right=20-=20clip_left,=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= =20clip_bottom=20-=20clip_top);=0A+=20=20=20=20=20=20= nsxwidget_move_widget_in_view=20(xv,=20-clip_left,=20-clip_top);=0A= +#endif=0A=20=0A=20=20=20=20=20=20=20xv->clip_right=20=3D=20clip_right;=0A= =20=20=20=20=20=20=20xv->clip_bottom=20=3D=20clip_bottom;=0A@@=20-680,16=20= +756,30=20@@=20x_draw_xwidget_glyph_string=20(struct=20glyph_string=20= *s)=0A=20=20=20=20=20=20xwidgets=20background.=20=20It's=20just=20a=20= visual=20glitch=20though.=20=20*/=0A=20=20=20if=20(!xwidget_hidden=20= (xv))=0A=20=20=20=20=20{=0A+#ifdef=20USE_GTK=0A=20=20=20=20=20=20=20= gtk_widget_queue_draw=20(xv->widgetwindow);=0A=20=20=20=20=20=20=20= gtk_widget_queue_draw=20(xv->widget);=0A+#elif=20defined=20NS_IMPL_COCOA=0A= +=20=20=20=20=20=20nsxwidget_set_needsdisplay=20(xv);=0A+#endif=0A=20=20=20= =20=20}=0A=20}=0A=20=0A-/*=20Macro=20that=20checks=20WEBKIT_IS_WEB_VIEW=20= (xw->widget_osr)=20first.=20=20*/=0A+static=20bool=0A= +xwidget_is_web_view=20(struct=20xwidget=20*xw)=0A+{=0A+#ifdef=20USE_GTK=0A= +=20=20return=20xw->widget_osr=20!=3D=20NULL=20&&=20WEBKIT_IS_WEB_VIEW=20= (xw->widget_osr);=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20=20return=20= nsxwidget_is_web_view=20(xw);=0A+#endif=0A+}=0A+=0A+/*=20Macro=20that=20= checks=20xwidget=20hold=20webkit=20web=20view=20first.=20=20*/=0A=20= #define=20WEBKIT_FN_INIT()=09=09=09=09=09=09\=0A=20=20=20CHECK_XWIDGET=20= (xwidget);=09=09=09=09=09=09\=0A=20=20=20struct=20xwidget=20*xw=20=3D=20= XXWIDGET=20(xwidget);=09=09=09=09\=0A-=20=20if=20(!xw->widget_osr=20||=20= !WEBKIT_IS_WEB_VIEW=20(xw->widget_osr))=09=09\=0A+=20=20if=20= (!xwidget_is_web_view=20(xw))=09=09=09=09=09\=0A=20=20=20=20=20{=09=09=09= =09=09=09=09=09=09\=0A=20=20=20=20=20=20=20fputs=20("ERROR=20= xw->widget_osr=20does=20not=20hold=20a=20webkit=20instance\n",=09\=0A=20=09= =20=20=20=20=20stdout);=09=09=09=09=09=09=09\=0A@@=20-705,7=20+795,11=20= @@=20DEFUN=20("xwidget-webkit-goto-uri",=0A=20=20=20WEBKIT_FN_INIT=20();=0A= =20=20=20CHECK_STRING=20(uri);=0A=20=20=20uri=20=3D=20ENCODE_FILE=20= (uri);=0A+#ifdef=20USE_GTK=0A=20=20=20webkit_web_view_load_uri=20= (WEBKIT_WEB_VIEW=20(xw->widget_osr),=20SSDATA=20(uri));=0A+#elif=20= defined=20NS_IMPL_COCOA=0A+=20=20nsxwidget_webkit_goto_uri=20(xw,=20= SSDATA=20(uri));=0A+#endif=0A=20=20=20return=20Qnil;=0A=20}=0A=20=0A@@=20= -719,14=20+813,19=20@@=20DEFUN=20("xwidget-webkit-zoom",=0A=20=20=20if=20= (FLOATP=20(factor))=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20double=20= zoom_change=20=3D=20XFLOAT_DATA=20(factor);=0A+#ifdef=20USE_GTK=0A=20=20=20= =20=20=20=20webkit_web_view_set_zoom_level=0A=20=20=20=20=20=20=20=20=20= (WEBKIT_WEB_VIEW=20(xw->widget_osr),=0A=20=20=20=20=20=20=20=20=20=20= webkit_web_view_get_zoom_level=0A=20=20=20=20=20=20=20=20=20=20= (WEBKIT_WEB_VIEW=20(xw->widget_osr))=20+=20zoom_change);=0A+#elif=20= defined=20NS_IMPL_COCOA=0A+=20=20=20=20=20=20nsxwidget_webkit_zoom=20= (xw,=20zoom_change);=0A+#endif=0A=20=20=20=20=20}=0A=20=20=20return=20= Qnil;=0A=20}=0A=20=0A+#ifdef=20USE_GTK=0A=20/*=20Save=20script=20and=20= fun=20in=20the=20script/callback=20save=20vector=20and=20return=0A=20=20=20= =20its=20index.=20=20*/=0A=20static=20ptrdiff_t=0A@@=20-748,6=20+847,7=20= @@=20save_script_callback=20(struct=20xwidget=20*xw,=20Lisp_Object=20= script,=20Lisp_Object=20fun)=0A=20=20=20ASET=20(cbs,=20idx,=20Fcons=20= (make_mint_ptr=20(xlispstrdup=20(script)),=20fun));=0A=20=20=20return=20= idx;=0A=20}=0A+#endif=0A=20=0A=20DEFUN=20= ("xwidget-webkit-execute-script",=0A=20=20=20=20=20=20=20=20= Fxwidget_webkit_execute_script,=20Sxwidget_webkit_execute_script,=0A@@=20= -764,6=20+864,7=20@@=20DEFUN=20("xwidget-webkit-execute-script",=0A=20=0A= =20=20=20script=20=3D=20ENCODE_SYSTEM=20(script);=0A=20=0A+#ifdef=20= USE_GTK=0A=20=20=20/*=20Protect=20script=20and=20fun=20during=20GC.=20=20= */=0A=20=20=20intptr_t=20idx=20=3D=20save_script_callback=20(xw,=20= script,=20fun);=0A=20=0A@@=20-777,6=20+878,9=20@@=20DEFUN=20= ("xwidget-webkit-execute-script",=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=20=20=20=20=20=20NULL,=20= /*=20cancelable=20*/=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=20=20=20=20=20=20= webkit_javascript_finished_cb,=0A=20=09=09=09=09=20=20(gpointer)=20idx);=0A= +#elif=20defined=20NS_IMPL_COCOA=0A+=20=20= nsxwidget_webkit_execute_script=20(xw,=20SSDATA=20(script),=20fun);=0A= +#endif=0A=20=20=20return=20Qnil;=0A=20}=0A=20=0A@@=20-795,6=20+899,7=20= @@=20DEFUN=20("xwidget-resize",=20Fxwidget_resize,=20Sxwidget_resize,=20= 3,=203,=200,=0A=20=20=20xw->height=20=3D=20h;=0A=20=0A=20=20=20/*=20If=20= there=20is=20an=20offscreen=20widget=20resize=20it=20first.=20=20*/=0A= +#ifdef=20USE_GTK=0A=20=20=20if=20(xw->widget_osr)=0A=20=20=20=20=20{=0A=20= =20=20=20=20=20=20gtk_window_resize=20(GTK_WINDOW=20= (xw->widgetwindow_osr),=20xw->width,=0A@@=20-803,6=20+908,9=20@@=20DEFUN=20= ("xwidget-resize",=20Fxwidget_resize,=20Sxwidget_resize,=203,=203,=200,=0A= =20=20=20=20=20=20=20gtk_widget_set_size_request=20(GTK_WIDGET=20= (xw->widget_osr),=20xw->width,=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=20=20=20=20=20=20=20= xw->height);=0A=20=20=20=20=20}=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20= =20nsxwidget_resize=20(xw);=0A+#endif=0A=20=0A=20=20=20for=20= (Lisp_Object=20tail=20=3D=20Vxwidget_view_list;=20CONSP=20(tail);=20tail=20= =3D=20XCDR=20(tail))=0A=20=20=20=20=20{=0A@@=20-810,8=20+918,14=20@@=20= DEFUN=20("xwidget-resize",=20Fxwidget_resize,=20Sxwidget_resize,=203,=20= 3,=200,=0A=20=20=20=20=20=20=20=20=20{=0A=20=20=20=20=20=20=20=20=20=20=20= struct=20xwidget_view=20*xv=20=3D=20XXWIDGET_VIEW=20(XCAR=20(tail));=0A=20= =20=20=20=20=20=20=20=20=20=20if=20(XXWIDGET=20(xv->model)=20=3D=3D=20= xw)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+#ifdef=20USE_GTK=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20gtk_widget_set_size_request=20= (GTK_WIDGET=20(xv->widget),=20xw->width,=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=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20xw->height);=0A+#elif=20defined=20= NS_IMPL_COCOA=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= nsxwidget_resize_view(xv,=20xw->width,=20xw->height);=0A+#endif=0A+=20=20= =20=20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20=20=20}=0A=20=20=20= =20=20}=0A=20=0A@@=20-830,9=20+944,13=20@@=20DEFUN=20= ("xwidget-size-request",=0A=20=20=20(Lisp_Object=20xwidget)=0A=20{=0A=20=20= =20CHECK_XWIDGET=20(xwidget);=0A+#ifdef=20USE_GTK=0A=20=20=20= GtkRequisition=20requisition;=0A=20=20=20gtk_widget_size_request=20= (XXWIDGET=20(xwidget)->widget_osr,=20&requisition);=0A=20=20=20return=20= list2i=20(requisition.width,=20requisition.height);=0A+#elif=20defined=20= NS_IMPL_COCOA=0A+=20=20return=20nsxwidget_get_size=20(XXWIDGET=20= (xwidget));=0A+#endif=0A=20}=0A=20=0A=20DEFUN=20("xwidgetp",=0A@@=20= -909,14=20+1027,19=20@@=20DEFUN=20("delete-xwidget-view",=0A=20{=0A=20=20= =20CHECK_XWIDGET_VIEW=20(xwidget_view);=0A=20=20=20struct=20xwidget_view=20= *xv=20=3D=20XXWIDGET_VIEW=20(xwidget_view);=0A+#ifdef=20USE_GTK=0A=20=20=20= gtk_widget_destroy=20(xv->widgetwindow);=0A-=20=20Vxwidget_view_list=20=3D= =20Fdelq=20(xwidget_view,=20Vxwidget_view_list);=0A=20=20=20/*=20= xv->model=20still=20has=20signals=20pointing=20to=20the=20view.=20=20= There=20can=20be=0A=20=20=20=20=20=20several=20views.=20=20Find=20the=20= matching=20signals=20and=20delete=20them=20all.=20=20*/=0A=20=20=20= g_signal_handlers_disconnect_matched=20=20(XXWIDGET=20= (xv->model)->widgetwindow_osr,=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=20=20=20=20=20=20=20=20=20=20= =20=20=20G_SIGNAL_MATCH_DATA,=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=20=20=20=20=20=20=20=20=20=20= =20=20=200,=200,=200,=200,=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=20=20=20=20=20=20=20=20=20=20=20= =20=20xv->widget);=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20=20= nsxwidget_delete_view=20(xv);=0A+#endif=0A+=0A+=20=20Vxwidget_view_list=20= =3D=20Fdelq=20(xwidget_view,=20Vxwidget_view_list);=0A=20=20=20return=20= Qnil;=0A=20}=0A=20=0A@@=20-1193,11=20+1316,19=20@@=20= xwidget_end_redisplay=20(struct=20window=20*w,=20struct=20glyph_matrix=20= *matrix)=0A=20=09=09=20=20=20=20=20xwidget_end_redisplay=20= (w->current_matrix);=20=20*/=0A=20=09=09=20=20struct=20xwidget_view=20= *xv=0A=20=09=09=20=20=20=20=3D=20xwidget_view_lookup=20= (glyph->u.xwidget,=20w);=0A+#ifdef=20USE_GTK=0A=20=09=09=20=20/*=20= FIXME:=20Is=20it=20safe=20to=20assume=20xwidget_view_lookup=0A=20=09=09=20= =20=20=20=20always=20succeeds=20here?=20=20If=20so,=20this=20comment=20= can=20be=20removed.=0A=20=09=09=20=20=20=20=20If=20not,=20the=20code=20= probably=20needs=20fixing.=20=20*/=0A=20=09=09=20=20eassume=20(xv);=0A=20= =09=09=20=20xwidget_touch=20(xv);=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20/*=20In=20NS=20= xwidget,=20xv=20can=20be=20NULL=20for=20the=20second=20or=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20later=20views=20for=20= a=20model,=20the=20result=20of=201=20to=201=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20model=20view=20relation=20= enforcement.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20if=20(xv)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20xwidget_touch=20(xv);=0A+#endif=0A=20=09=09}=0A=20=09=20=20}=0A=20=20=20= =20=20}=0A@@=20-1214,9=20+1345,21=20@@=20xwidget_end_redisplay=20(struct=20= window=20*w,=20struct=20glyph_matrix=20*matrix)=0A=20=20=20=20=20=20=20=20= =20=20=20if=20(XWINDOW=20(xv->w)=20=3D=3D=20w)=0A=20=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=20=20if=20= (xwidget_touched=20(xv))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20xwidget_show_view=20(xv);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20{=0A+#ifdef=20USE_GTK=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20xwidget_show_view=20(xv);=0A+#elif=20defined=20NS_IMPL_COCOA=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= nsxwidget_show_view=20(xv);=0A+#endif=0A+=20=20=20=20=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=20=20else=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20xwidget_hide_view=20(xv);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+#ifdef=20USE_GTK=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20xwidget_hide_view=20= (xv);=0A+#elif=20defined=20NS_IMPL_COCOA=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20nsxwidget_hide_view=20(xv);=0A+#endif=0A+=20=20=20= =20=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}=0A=20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A@@=20= -1235,6=20+1378,7=20@@=20kill_buffer_xwidgets=20(Lisp_Object=20buffer)=0A= =20=20=20=20=20=20=20{=0A=20=20=20=20=20=20=20=20=20CHECK_XWIDGET=20= (xwidget);=0A=20=20=20=20=20=20=20=20=20struct=20xwidget=20*xw=20=3D=20= XXWIDGET=20(xwidget);=0A+#ifdef=20USE_GTK=0A=20=20=20=20=20=20=20=20=20= if=20(xw->widget_osr=20&&=20xw->widgetwindow_osr)=0A=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= gtk_widget_destroy=20(xw->widget_osr);=0A@@=20-1248,6=20+1392,9=20@@=20= kill_buffer_xwidgets=20(Lisp_Object=20buffer)=0A=20=09=09xfree=20= (xmint_pointer=20(XCAR=20(cb)));=0A=20=09=20=20=20=20=20=20ASET=20= (xw->script_callbacks,=20idx,=20Qnil);=0A=20=09=20=20=20=20}=0A+#elif=20= defined=20NS_IMPL_COCOA=0A+=20=20=20=20=20=20=20=20nsxwidget_kill=20= (xw);=0A+#endif=0A=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20}=0A= diff=20--git=20a/src/xwidget.h=20b/src/xwidget.h=0Aindex=20= 1b6368daab..73d8bbd540=20100644=0A---=20a/src/xwidget.h=0A+++=20= b/src/xwidget.h=0A@@=20-29,7=20+29,13=20@@=20#define=20= XWIDGET_H_INCLUDED=0A=20struct=20window;=0A=20=0A=20#ifdef=20= HAVE_XWIDGETS=0A-#=20include=20=0A+=0A+#if=20defined=20= (USE_GTK)=0A+#include=20=0A+#elif=20defined=20(NS_IMPL_COCOA)=20= &&=20defined=20(__OBJC__)=0A+#import=20=0A+#import=20= "nsxwidget.h"=0A+#endif=0A=20=0A=20struct=20xwidget=0A=20{=0A@@=20-54,9=20= +60,25=20@@=20#define=20XWIDGET_H_INCLUDED=0A=20=20=20int=20height;=0A=20= =20=20int=20width;=0A=20=0A+#if=20defined=20(USE_GTK)=0A=20=20=20/*=20= For=20offscreen=20widgets,=20unused=20if=20not=20osr.=20=20*/=0A=20=20=20= GtkWidget=20*widget_osr;=0A=20=20=20GtkWidget=20*widgetwindow_osr;=0A= +#elif=20defined=20(NS_IMPL_COCOA)=0A+#=20ifdef=20__OBJC__=0A+=20=20/*=20= For=20offscreen=20widgets,=20unused=20if=20not=20osr.=20=20*/=0A+=20=20= NSView=20*xwWidget;=0A+=20=20XwWindow=20*xwWindow;=0A+=0A+=20=20/*=20= Used=20only=20for=20xwidget=20types=20(such=20as=20webkit2)=20enforcing=20= 1=20to=201=0A+=20=20=20=20=20relationship=20between=20model=20and=20= view.=20=20*/=0A+=20=20struct=20xwidget_view=20*xv;=0A+#=20else=0A+=20=20= void=20*xwWidget;=0A+=20=20void=20*xwWindow;=0A+=20=20struct=20= xwidget_view=20*xv;=0A+#=20endif=0A+#endif=0A=20=0A=20=20=20/*=20Kill=20= silently=20if=20Emacs=20is=20exited.=20=20*/=0A=20=20=20bool_bf=20= kill_without_query=20:=201;=0A@@=20-75,9=20+97,20=20@@=20#define=20= XWIDGET_H_INCLUDED=0A=20=20=20/*=20The=20"live"=20instance=20isn't=20= drawn.=20=20*/=0A=20=20=20bool=20hidden;=0A=20=0A+#if=20defined=20= (USE_GTK)=0A=20=20=20GtkWidget=20*widget;=0A=20=20=20GtkWidget=20= *widgetwindow;=0A=20=20=20GtkWidget=20*emacswindow;=0A+#elif=20defined=20= (NS_IMPL_COCOA)=0A+#=20ifdef=20__OBJC__=0A+=20=20XvWindow=20*xvWindow;=0A= +=20=20NSView=20*emacswindow;=0A+#=20else=0A+=20=20void=20*xvWindow;=0A+=20= =20void=20*emacswindow;=0A+#=20endif=0A+#endif=0A+=0A=20=20=20int=20x;=0A= =20=20=20int=20y;=0A=20=20=20int=20clip_right;=0A@@=20-116,6=20+149,16=20= @@=20#define=20XG_XWIDGET_VIEW=20"emacs_xwidget_view"=0A=20struct=20= xwidget=20*lookup_xwidget=20(Lisp_Object=20spec);=0A=20void=20= xwidget_end_redisplay=20(struct=20window=20*,=20struct=20glyph_matrix=20= *);=0A=20void=20kill_buffer_xwidgets=20(Lisp_Object);=0A+#ifdef=20= NS_IMPL_COCOA=0A+/*=20Defined=20in=20'xwidget.c'.=20=20*/=0A+void=20= store_xwidget_event_string=20(struct=20xwidget=20*xw,=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=20=20= =20=20const=20char=20*eventname,=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=20=20=20=20const=20char=20= *eventstr);=0A+=0A+void=20store_xwidget_js_callback_event=20(struct=20= xwidget=20*xw,=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=20=20=20=20=20=20=20=20=20Lisp_Object=20= proc,=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=20=20=20=20=20=20=20=20=20Lisp_Object=20argument);=0A= +#endif=0A=20#else=0A=20INLINE_HEADER_BEGIN=0A=20INLINE=20void=20= syms_of_xwidget=20(void)=20{}=0A--=20=0A2.17.2=20(Apple=20Git-113)=0A=0A= --Apple-Mail=_AA24E5D7-D128-4230-9BB5-4ABD010C3AB8 Content-Disposition: attachment; filename=0002-Various-small-enhancements-in-xwidget-webkit.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0002-Various-small-enhancements-in-xwidget-webkit.patch" Content-Transfer-Encoding: quoted-printable =46rom=2078af5a869493a797764c3e847c1c3ccbf641d891=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Sungbin=20Jo=20=0ADate:=20= Fri,=2026=20Jul=202019=2002:51:55=20+0900=0ASubject:=20[PATCH=202/3]=20= Various=20small=20enhancements=20in=20xwidget-webkit=0A=0A= Co-authored-by:=20Jaesup=20Kwak=20=0A=0A*=20etc/NEWS:=20= Announce=20new=20functions=20and=20options.=0A*=20lisp/xwidget.el=20= (xwidget):=20New=20defgroup.=0A(xwidget-webkit-mode-map):=20Add=20new=20= keybindings.=0A(xwidget-webkit-scroll-up,=20xwidget-webkit-scroll-down)=0A= (xwidget-webkit-scroll-forward,=20xwidget-webkit-scroll-backward):=0AAdd=20= optional=20argument=20to=20specify=20specific=20amounts=20to=20scroll=20= down.=0A(xwidget-webkit-scroll-up-line,=20= xwidget-webkit-scroll-down-line):=20New=0Afunctions.=0A= (xwidget-webkit-scroll-bottom):=20Fix=20function=20to=20scroll=20to=20= the=20bottom=0Aof=20the=20document.=0A(xwidget-webkit-callback):=20Use=20= new=20function=20to=20update=20buffer=20title=0Aeven=20when=20Javascript=20= is=20disabled.=0A(xwidget-webkit-bookmark-jump-new-session):=20New=20= variable.=0A(xwidget-webkit-bookmark-make-record):=20Modify=20to=20use=20= xwidget-webkit=20to=0Aopen=20bookmark=20that=20is=20created=20in=20= xwidget-webkit.=0A(xwidget-webkit-insert-string):=20Fix=20Javascript=20= snippet=20to=20not=20throw=0AJavsscript=20exceptions.=0A= (xwidget-webkit-inside-pixel-width)=0A= (xwidget-window-inside-pixel-height):=20New=20functions.=0A= (xwidget-webkit-adjust-size-to-window):=20Use=20new=20functions.=0A= (xwidget-webkit-new-session):=20Insert=20invisible=20URL=20instead=20of=20= an=20empty=0Astring=20to=20achieve=20better=20default=20behavior.=0A= (xwidget-webkit-back,=20xwidget-webkit-forward,=20xwidget-webkit-reload)=0A= (xwidget-webkit-current-url):=20Use=20new=20functions=20to=20enable=20= scrolling=0Aeven=20when=20Javascript=20is=20disabled.=0A= (xwidget-webkit-copy-selection-as-kill):=20Remove=20unnecessary=20= lambda.=0A*=20src/nsxwidget.h=20src/nsxwidget.m=20(nsxwidget_webkit_uri)=0A= (nsxwidget_webkit_title,=20nsxwidget_webkit_goto_history):=20Add=20new=0A= functions.=0A*=20src/xwidget.c=20(Fxwidget_webkit_uri,=20= Fxwidget_webkit_title)=0A(Fxwidget_webkit_goto_history):=20Add=20new=20= functions.=0A(syms_of_xwidget):=20Define=20new=20functions.=0A---=0A=20= etc/NEWS=20=20=20=20=20=20=20=20|=20=2018=20+++++=0A=20lisp/xwidget.el=20= |=20206=20++++++++++++++++++++++++++++++++----------------=0A=20= src/nsxwidget.h=20|=20=20=203=20+=0A=20src/nsxwidget.m=20|=20=2026=20= ++++++=0A=20src/xwidget.c=20=20=20|=20=2054=20+++++++++++++=0A=205=20= files=20changed,=20238=20insertions(+),=2069=20deletions(-)=0A=0Adiff=20= --git=20a/etc/NEWS=20b/etc/NEWS=0Aindex=2052b49bab75..f9a42f73be=20= 100644=0A---=20a/etc/NEWS=0A+++=20b/etc/NEWS=0A@@=20-1735,6=20+1735,24=20= @@=20particular=20when=20the=20end=20of=20the=20buffer=20is=20visible=20= in=20the=20window.=0A=20Use=20'mouse-wheel-mode'=20instead.=20=20Note=20= that=20'mouse-wheel-mode'=20is=0A=20already=20enabled=20by=20default=20= on=20most=20graphical=20displays.=0A=20=0A+**=20xwidget-webkit=20mode=0A= +=0A+***=20New=20functions=20'xwidget-webkit-uri',=20= 'xwidget-webkit-title',=0A+and=20'xwidget-webkit-goto-history'.=0A+=0A= +***=20Functions=20'xwidget-webkit-scroll-up',=20= 'xwidget-webkit-scroll-down'=0A+now=20supports=20scrolling=20arbitrary=20= pixel=20values.=20=20It=20now=20treats=20the=0A+optional=202nd=20= argument=20as=20the=20pixel=20values=20to=20scroll.=0A+=0A+***=20New=20= functions=20'xwidget-webkit-scroll-up-line',=0A= +'xwidget-webkit-scroll-down-line',=20'xwidget-webkit-scroll-forward',=0A= +'xwidget-webkit-scroll-backward'.=0A+Use=20them=20to=20scroll=20webkit=20= by=20the=20height=20of=20lines=20or=20width=20of=20chars.=0A+=0A+***=20= New=20user=20option=20'xwidget-webkit-bookmark-jump-new-session'.=0A= +When=20non-nil,=20use=20a=20new=20xwidget=20webkit=20session=20after=20= bookmark=20jump.=0A+Otherwise,=20it=20will=20use=20= 'xwidget-webkit-last-session'.=0A+=0A=20=0C=0A=20*=20New=20Modes=20and=20= Packages=20in=20Emacs=2027.1=0A=20=0Adiff=20--git=20a/lisp/xwidget.el=20= b/lisp/xwidget.el=0Aindex=20f01822c792..584a894148=20100644=0A---=20= a/lisp/xwidget.el=0A+++=20b/lisp/xwidget.el=0A@@=20-41,7=20+41,10=20@@=0A= =20(declare-function=20xwidget-resize=20"xwidget.c"=20(xwidget=20= new-width=20new-height))=0A=20(declare-function=20= xwidget-webkit-execute-script=20"xwidget.c"=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(xwidget=20script=20&optional=20callback))=0A= +(declare-function=20xwidget-webkit-uri=20"xwidget.c"=20(xwidget))=0A= +(declare-function=20xwidget-webkit-title=20"xwidget.c"=20(xwidget))=0A=20= (declare-function=20xwidget-webkit-goto-uri=20"xwidget.c"=20(xwidget=20= uri))=0A+(declare-function=20xwidget-webkit-goto-history=20"xwidget.c"=20= (xwidget=20rel-pos))=0A=20(declare-function=20xwidget-webkit-zoom=20= "xwidget.c"=20(xwidget=20factor))=0A=20(declare-function=20xwidget-plist=20= "xwidget.c"=20(xwidget))=0A=20(declare-function=20set-xwidget-plist=20= "xwidget.c"=20(xwidget=20plist))=0A@@=20-51,6=20+54,10=20@@=0A=20= (declare-function=20get-buffer-xwidgets=20"xwidget.c"=20(buffer))=0A=20= (declare-function=20xwidget-query-on-exit-flag=20"xwidget.c"=20= (xwidget))=0A=20=0A+(defgroup=20xwidget=20nil=0A+=20=20"Displaying=20= native=20widgets=20in=20Emacs=20buffers."=0A+=20=20:group=20'widgets)=0A= +=0A=20(defun=20xwidget-insert=20(pos=20type=20title=20width=20height=20= &optional=20args)=0A=20=20=20"Insert=20an=20xwidget=20at=20position=20= POS.=0A=20Supply=20the=20xwidget's=20TYPE,=20TITLE,=20WIDTH,=20and=20= HEIGHT.=0A@@=20-78,6=20+85,8=20@@=20xwidget-at=0A=20;;;=20webkit=20= support=0A=20(require=20'browse-url)=0A=20(require=20'image-mode);;for=20= some=20image-mode=20alike=20functionality=0A+(require=20'seq)=0A= +(require=20'url-handlers)=0A=20=0A=20;;;###autoload=0A=20(defun=20= xwidget-webkit-browse-url=20(url=20&optional=20new-session)=0A@@=20= -121,6=20+130,7=20@@=20xwidget-webkit-mode-map=0A=20=20=20=20=20= (define-key=20map=20"g"=20'xwidget-webkit-browse-url)=0A=20=20=20=20=20= (define-key=20map=20"a"=20'xwidget-webkit-adjust-size-dispatch)=0A=20=20=20= =20=20(define-key=20map=20"b"=20'xwidget-webkit-back)=0A+=20=20=20=20= (define-key=20map=20"f"=20'xwidget-webkit-forward)=0A=20=20=20=20=20= (define-key=20map=20"r"=20'xwidget-webkit-reload)=0A=20=20=20=20=20= (define-key=20map=20"t"=20(lambda=20()=20(interactive)=20(message=20= "o")))=20;FIXME:=20?!?=0A=20=20=20=20=20(define-key=20map=20"\C-m"=20= 'xwidget-webkit-insert-string)=0A@@=20-130,20=20+140,21=20@@=20= xwidget-webkit-mode-map=0A=20=0A=20=20=20=20=20;;similar=20to=20image=20= mode=20bindings=0A=20=20=20=20=20(define-key=20map=20(kbd=20"SPC")=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20'xwidget-webkit-scroll-up)=0A+=20= =20=20=20(define-key=20map=20(kbd=20"S-SPC")=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20'xwidget-webkit-scroll-down)=0A=20=20=20=20=20(define-key=20= map=20(kbd=20"DEL")=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-down)=0A=20=0A-=20=20=20=20(define-key=20map=20= [remap=20scroll-up]=20=20=20=20=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-up)=0A+=20=20=20=20(define-key=20map=20[remap=20= scroll-up]=20=20=20=20=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-up-line)=0A=20=20=20=20=20(define-key=20map=20= [remap=20scroll-up-command]=20=20=20'xwidget-webkit-scroll-up)=0A=20=0A-=20= =20=20=20(define-key=20map=20[remap=20scroll-down]=20=20=20=20=20=20=20=20= =20'xwidget-webkit-scroll-down)=0A+=20=20=20=20(define-key=20map=20= [remap=20scroll-down]=20=20=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-down-line)=0A=20=20=20=20=20(define-key=20map=20= [remap=20scroll-down-command]=20'xwidget-webkit-scroll-down)=0A=20=0A=20=20= =20=20=20(define-key=20map=20[remap=20forward-char]=20=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-forward)=0A=20=20=20=20=20(define-key=20map=20= [remap=20backward-char]=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-backward)=0A=20=20=20=20=20(define-key=20map=20= [remap=20right-char]=20=20=20=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-forward)=0A=20=20=20=20=20(define-key=20map=20= [remap=20left-char]=20=20=20=20=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-backward)=0A-=20=20=20=20(define-key=20map=20= [remap=20previous-line]=20=20=20=20=20=20=20'xwidget-webkit-scroll-down)=0A= -=20=20=20=20(define-key=20map=20[remap=20next-line]=20=20=20=20=20=20=20= =20=20=20=20'xwidget-webkit-scroll-up)=0A+=20=20=20=20(define-key=20map=20= [remap=20previous-line]=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-down-line)=0A+=20=20=20=20(define-key=20map=20= [remap=20next-line]=20=20=20=20=20=20=20=20=20=20=20= 'xwidget-webkit-scroll-up-line)=0A=20=0A=20=20=20=20=20;;=20(define-key=20= map=20[remap=20move-beginning-of-line]=20'image-bol)=0A=20=20=20=20=20;;=20= (define-key=20map=20[remap=20move-end-of-line]=20=20=20=20=20=20=20= 'image-eol)=0A@@=20-162,33=20+173,63=20@@=20xwidget-webkit-zoom-out=0A=20= =20=20(interactive)=0A=20=20=20(xwidget-webkit-zoom=20= (xwidget-webkit-current-session)=20-0.1))=0A=20=0A-(defun=20= xwidget-webkit-scroll-up=20()=0A-=20=20"Scroll=20webkit=20up."=0A-=20=20= (interactive)=0A+(defun=20xwidget-webkit-scroll-up=20(&optional=20arg)=0A= +=20=20"Scroll=20webkit=20up=20by=20ARG=20pixels;=20or=20full=20window=20= height=20if=20no=20ARG.=0A+Stop=20if=20bottom=20of=20page=20is=20= reached.=0A+Interactively,=20ARG=20is=20the=20prefix=20numeric=20= argument.=0A+Negative=20ARG=20scrolls=20down."=0A+=20=20(interactive=20= "P")=0A=20=20=20(xwidget-webkit-execute-script=0A=20=20=20=20= (xwidget-webkit-current-session)=0A-=20=20=20"window.scrollBy(0,=20= 50);"))=0A-=0A-(defun=20xwidget-webkit-scroll-down=20()=0A-=20=20"Scroll=20= webkit=20down."=0A-=20=20(interactive)=0A+=20=20=20(format=20= "window.scrollBy(0,=20%d);"=0A+=20=20=20=20=20=20=20=20=20=20=20(or=20= arg=20(xwidget-window-inside-pixel-height=20(selected-window))))))=0A+=0A= +(defun=20xwidget-webkit-scroll-down=20(&optional=20arg)=0A+=20=20= "Scroll=20webkit=20down=20by=20ARG=20pixels;=20or=20full=20window=20= height=20if=20no=20ARG.=0A+Stop=20if=20top=20of=20page=20is=20reached.=0A= +Interactively,=20ARG=20is=20the=20prefix=20numeric=20argument.=0A= +Negative=20ARG=20scrolls=20up."=0A+=20=20(interactive=20"P")=0A=20=20=20= (xwidget-webkit-execute-script=0A=20=20=20=20= (xwidget-webkit-current-session)=0A-=20=20=20"window.scrollBy(0,=20= -50);"))=0A-=0A-(defun=20xwidget-webkit-scroll-forward=20()=0A-=20=20= "Scroll=20webkit=20forwards."=0A-=20=20(interactive)=0A+=20=20=20(format=20= "window.scrollBy(0,=20-%d);"=0A+=20=20=20=20=20=20=20=20=20=20=20(or=20= arg=20(xwidget-window-inside-pixel-height=20(selected-window))))))=0A+=0A= +(defun=20xwidget-webkit-scroll-up-line=20(&optional=20n)=0A+=20=20= "Scroll=20webkit=20up=20by=20N=20lines.=0A+The=20height=20of=20line=20is=20= calculated=20with=20`window-font-height'.=0A+Stop=20if=20the=20bottom=20= edge=20of=20the=20page=20is=20reached.=0A+If=20N=20is=20omitted=20or=20= nil,=20scroll=20up=20by=20one=20line."=0A+=20=20(interactive=20"p")=0A+=20= =20(xwidget-webkit-scroll-up=20(*=20n=20(window-font-height))))=0A+=0A= +(defun=20xwidget-webkit-scroll-down-line=20(&optional=20n)=0A+=20=20= "Scroll=20webkit=20down=20by=20N=20lines.=0A+The=20height=20of=20line=20= is=20calculated=20with=20`window-font-height'.=0A+Stop=20if=20the=20top=20= edge=20of=20the=20page=20is=20reached.=0A+If=20N=20is=20omitted=20or=20= nil,=20scroll=20down=20by=20one=20line."=0A+=20=20(interactive=20"p")=0A= +=20=20(xwidget-webkit-scroll-down=20(*=20n=20(window-font-height))))=0A= +=0A+(defun=20xwidget-webkit-scroll-forward=20(&optional=20n)=0A+=20=20= "Scroll=20webkit=20horizontally=20by=20N=20chars.=0A+The=20width=20of=20= char=20is=20calculated=20with=20`window-font-width'.=0A+If=20N=20is=20= ommited=20or=20nil,=20scroll=20forwards=20by=20one=20char."=0A+=20=20= (interactive=20"p")=0A=20=20=20(xwidget-webkit-execute-script=0A=20=20=20= =20(xwidget-webkit-current-session)=0A-=20=20=20"window.scrollBy(50,=20= 0);"))=0A-=0A-(defun=20xwidget-webkit-scroll-backward=20()=0A-=20=20= "Scroll=20webkit=20backwards."=0A-=20=20(interactive)=0A+=20=20=20= (format=20"window.scrollBy(%d,=200);"=0A+=20=20=20=20=20=20=20=20=20=20=20= (*=20n=20(window-font-width)))))=0A+=0A+(defun=20= xwidget-webkit-scroll-backward=20(&optional=20n)=0A+=20=20"Scroll=20= webkit=20back=20by=20N=20chars.=0A+The=20width=20of=20char=20is=20= calculated=20with=20`window-font-width'.=0A+If=20N=20is=20ommited=20or=20= nil,=20scroll=20backwards=20by=20one=20char."=0A+=20=20(interactive=20= "p")=0A=20=20=20(xwidget-webkit-execute-script=0A=20=20=20=20= (xwidget-webkit-current-session)=0A-=20=20=20"window.scrollBy(-50,=20= 0);"))=0A+=20=20=20(format=20"window.scrollBy(-%d,=200);"=0A+=20=20=20=20= =20=20=20=20=20=20=20(*=20n=20(window-font-width)))))=0A=20=0A=20(defun=20= xwidget-webkit-scroll-top=20()=0A=20=20=20"Scroll=20webkit=20to=20the=20= very=20top."=0A@@=20-202,7=20+243,7=20@@=20xwidget-webkit-scroll-bottom=0A= =20=20=20(interactive)=0A=20=20=20(xwidget-webkit-execute-script=0A=20=20= =20=20(xwidget-webkit-current-session)=0A-=20=20=20= "window.scrollTo(pageXOffset,=20window.document.body.clientHeight);"))=0A= +=20=20=20"window.scrollTo(pageXOffset,=20= window.document.body.scrollHeight);"))=0A=20=0A=20;;=20The=20xwidget=20= event=20needs=20to=20go=20into=20a=20higher=20level=20handler=0A=20;;=20= since=20the=20xwidget=20can=20generate=20an=20event=20even=20if=20it's=20= offscreen.=0A@@=20-226,7=20+267,6=20@@=20xwidget-event-handler=0A=20=20=20= =20=20=20=20=20;;TODO=20stopped=20working=20for=20some=20reason=0A=20=20=20= =20=20=20=20=20)=0A=20=20=20=20=20;;(funcall=20=20xwidget-callback=20= xwidget=20xwidget-event-type)=0A-=20=20=20=20(message=20"xw=20callback=20= %s"=20xwidget)=0A=20=20=20=20=20(funcall=20=20'xwidget-webkit-callback=20= xwidget=20xwidget-event-type)))=0A=20=0A=20(defun=20= xwidget-webkit-callback=20(xwidget=20xwidget-event-type)=0A@@=20-237,14=20= +277,11=20@@=20xwidget-webkit-callback=0A=20=20=20=20=20=20=20=20"error:=20= callback=20called=20for=20xwidget=20with=20dead=20buffer")=0A=20=20=20=20= =20(with-current-buffer=20(xwidget-buffer=20xwidget)=0A=20=20=20=20=20=20= =20(cond=20((eq=20xwidget-event-type=20'load-changed)=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20(xwidget-webkit-execute-script=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20=20xwidget=20"document.title"=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(lambda=20(title)=0A-=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(xwidget-log=20"webkit=20finished=20loading:=20'%s'"=20= title)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Do=20not=20= adjust=20webkit=20size=20to=20window=20here,=20the=20selected=20window=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20can=20be=20the=20= mini-buffer=20window=20unwantedly.=0A-=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(rename-buffer=20(format=20"*xwidget=20webkit:=20%s=20*"=20= title))))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(pop-to-buffer=20= (current-buffer)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20= ((title=20(xwidget-webkit-title=20xwidget)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(xwidget-log=20"webkit=20finished=20loading:=20%s"=20= title)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Do=20not=20= adjust=20webkit=20size=20to=20window=20here,=20the=20selected=20window=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20can=20be=20the=20= mini-buffer=20window=20unwantedly.=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(rename-buffer=20(format=20"*xwidget=20webkit:=20%s=20*"=20= title)=20t)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20((eq=20= xwidget-event-type=20'decide-policy)=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(let=20((strarg=20=20(nth=203=20last-input-event)))=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(if=20(string-match=20".*#\\(.*\\)"=20= strarg)=0A@@=20-264,20=20+301,34=20@@=20bookmark-make-record-function=0A=20= If=20non-nil,=20plugins=20are=20enabled.=20=20Otherwise,=20disabled."))=0A= =20=0A=20(define-derived-mode=20xwidget-webkit-mode=0A-=20=20=20=20= special-mode=20"xwidget-webkit"=20"Xwidget=20webkit=20view=20mode."=0A-=20= =20=20=20(setq=20buffer-read-only=20t)=0A-=20=20=20=20(setq-local=20= bookmark-make-record-function=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20#'xwidget-webkit-bookmark-make-record)=0A-=20=20=20=20;;=20Keep=20= track=20of=20[vh]scroll=20when=20switching=20buffers=0A-=20=20=20=20= (image-mode-setup-winprops))=0A+=20=20special-mode=20"xwidget-webkit"=20= "Xwidget=20webkit=20view=20mode."=0A+=20=20(setq=20buffer-read-only=20t)=0A= +=20=20(setq-local=20bookmark-make-record-function=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20#'xwidget-webkit-bookmark-make-record)=0A+=20=20;;=20= Keep=20track=20of=20[vh]scroll=20when=20switching=20buffers=0A+=20=20= (image-mode-setup-winprops))=0A+=0A+;;;=20Bookmarks=20integration=0A+=0A= +(defcustom=20xwidget-webkit-bookmark-jump-new-session=20nil=0A+=20=20= "Control=20bookmark=20jump=20to=20use=20new=20session=20or=20not.=0A+If=20= non-nil,=20use=20a=20new=20xwidget=20webkit=20session=20after=20bookmark=20= jump.=0A+Otherwise,=20it=20will=20use=20`xwidget-webkit-last-session'.=0A= +When=20you=20set=20this=20variable=20to=20nil,=20consider=20further=20= customization=20with=0A+`xwidget-webkit-last-session-buffer'."=0A+=20=20= :version=20"27.1"=0A+=20=20:type=20'boolean)=0A=20=0A=20(defun=20= xwidget-webkit-bookmark-make-record=20()=0A-=20=20"Integrate=20Emacs=20= bookmarks=20with=20the=20webkit=20xwidget."=0A+=20=20"Create=20bookmark=20= record=20in=20webkit=20xwidget."=0A=20=20=20(nconc=20= (bookmark-make-record-default=20t=20t)=0A-=20=20=20=20=20=20=20=20=20= `((page=20=20=20=20=20.=20,(xwidget-webkit-current-url))=0A-=20=20=20=20=20= =20=20=20=20=20=20(handler=20=20.=20(lambda=20(bmk)=20(browse-url=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=20=20=20=20(bookmark-prop-get=20bmk=20'page)))))))=0A+=20=20=20=20= =20=20=20=20=20`((page=20.=20,(xwidget-webkit-uri=20= (xwidget-webkit-current-session)))=0A+=20=20=20=20=20=20=20=20=20=20=20= (handler=20=20.=20(lambda=20(bmk)=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(xwidget-webkit-browse-url=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= (bookmark-prop-get=20bmk=20'page)=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= xwidget-webkit-bookmark-jump-new-session))))))=0A=20=0A+;;;=20xwidget=20= webkit=20session=0A=20=0A=20(defvar=20xwidget-webkit-last-session-buffer=20= nil)=0A=20=0A@@=20-325,7=20+376,7=20@@=20= xwidget-webkit-activeelement-js"=0A=20=0A=20"=0A=20=0A-=20=20"javascript=20= that=20finds=20the=20active=20element."=0A+=20=20"Javascript=20that=20= finds=20the=20active=20element."=0A=20=20=20;;=20Yes=20it's=20ugly,=20= because:=0A=20=20=20;;=20-=20there=20is=20apparently=20no=20way=20to=20= find=20the=20active=20frame=20other=20than=20recursion=0A=20=20=20;;=20-=20= the=20js=20"for=20each"=20construct=20misbehaved=20on=20the=20"frames"=20= collection=0A@@=20-335,19=20+386,22=20@@=20= xwidget-webkit-activeelement-js"=0A=20=20=20)=0A=20=0A=20(defun=20= xwidget-webkit-insert-string=20()=0A-=20=20"Prompt=20for=20a=20string=20= and=20insert=20it=20in=20the=20active=20field=20in=20the=0A-current=20= webkit=20widget."=0A+=20=20"Insert=20string=20into=20the=20active=20= field=20in=20the=20current=20webkit=20widget."=0A=20=20=20;;=20Read=20= out=20the=20string=20in=20the=20field=20first=20and=20provide=20for=20= edit.=0A=20=20=20(interactive)=0A+=20=20;;=20As=20the=20prompt=20differs=20= on=20JavaScript=20execution=20results,=0A+=20=20;;=20the=20function=20= must=20handle=20the=20prompt=20itself.=0A=20=20=20(let=20((xww=20= (xwidget-webkit-current-session)))=0A=20=20=20=20=20= (xwidget-webkit-execute-script=0A=20=20=20=20=20=20xww=0A=20=20=20=20=20=20= (concat=20xwidget-webkit-activeelement-js=20"=0A=20(function=20()=20{=0A=20= =20=20var=20res=20=3D=20findactiveelement(document);=0A-=20=20return=20= [res.value,=20res.type];=0A+=20=20if=20(res)=0A+=20=20=20=20return=20= [res.value,=20res.type];=0A=20})();")=0A=20=20=20=20=20=20(lambda=20= (field)=0A+=20=20=20=20=20=20=20"Prompt=20a=20string=20for=20the=20FIELD=20= and=20insert=20in=20the=20active=20input."=0A=20=20=20=20=20=20=20=20= (let=20((str=20(pcase=20field=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(`[,val=20"text"]=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(read-string=20"Text:=20"=20val))=0A@@=20= -466,11=20+520,23=20@@=20xwidget-webkit-adjust-size-dispatch=0A=20=20=20= (ignore-errors=0A=20=20=20=20=20(recenter-top-bottom)))=0A=20=0A+;;=20= Utility=20functions=0A+=0A+(defun=20xwidget-window-inside-pixel-width=20= (window)=0A+=20=20"Return=20Emacs=20WINDOW=20body=20width=20in=20pixel."=0A= +=20=20(let=20((edges=20(window-inside-pixel-edges=20window)))=0A+=20=20=20= =20(-=20(nth=202=20edges)=20(nth=200=20edges))))=0A+=0A+(defun=20= xwidget-window-inside-pixel-height=20(window)=0A+=20=20"Return=20Emacs=20= WINDOW=20body=20height=20in=20pixel."=0A+=20=20(let=20((edges=20= (window-inside-pixel-edges=20window)))=0A+=20=20=20=20(-=20(nth=203=20= edges)=20(nth=201=20edges))))=0A+=0A=20(defun=20= xwidget-webkit-adjust-size-to-window=20(xwidget=20&optional=20window)=0A=20= =20=20"Adjust=20the=20size=20of=20the=20webkit=20XWIDGET=20to=20fit=20= the=20WINDOW."=0A=20=20=20(xwidget-resize=20xwidget=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(window-pixel-width=20window)=0A-=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(window-pixel-height=20= window)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (xwidget-window-inside-pixel-width=20window)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(xwidget-window-inside-pixel-height=20= window)))=0A=20=0A=20(defun=20xwidget-webkit-adjust-size=20(w=20h)=0A=20=20= =20"Manually=20set=20webkit=20size=20to=20width=20W,=20height=20H."=0A@@=20= -509,42=20+575,45=20@@=20xwidget-webkit-new-session=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=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(get-buffer-create=20= bufname)))=0A=20=20=20=20=20;;=20The=20xwidget=20id=20is=20stored=20in=20= a=20text=20property,=20so=20we=20need=20to=20have=0A=20=20=20=20=20;;=20= at=20least=20character=20in=20this=20buffer.=0A-=20=20=20=20(insert=20"=20= ")=0A-=20=20=20=20(setq=20xw=20(xwidget-insert=201=20'webkit=20bufname=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(window-pixel-width)=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= (window-pixel-height)))=0A+=20=20=20=20;;=20Insert=20invisible=20url,=20= good=20default=20for=20next=20`g'=20to=20browse=20url.=0A+=20=20=20=20= (let=20((start=20(point)))=0A+=20=20=20=20=20=20(insert=20url)=0A+=20=20=20= =20=20=20(put-text-property=20start=20(+=20start=20(length=20url))=20= 'invisible=20t)=0A+=20=20=20=20=20=20(setq=20xw=20(xwidget-insert=20= start=20'webkit=20bufname=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=20=20= (xwidget-window-inside-pixel-width=20(selected-window))=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=20= =20(xwidget-window-inside-pixel-height=20(selected-window)))))=0A=20=20=20= =20=20(xwidget-put=20xw=20'callback=20'xwidget-webkit-callback)=0A=20=20=20= =20=20(xwidget-webkit-mode)=0A=20=20=20=20=20(xwidget-webkit-goto-uri=20= (xwidget-webkit-last-session)=20url)))=0A=20=0A=20=0A=20(defun=20= xwidget-webkit-goto-url=20(url)=0A-=20=20"Goto=20URL."=0A+=20=20"Goto=20= URL=20with=20xwidget=20webkit."=0A=20=20=20(if=20= (xwidget-webkit-current-session)=0A=20=20=20=20=20=20=20(progn=0A=20=20=20= =20=20=20=20=20=20(xwidget-webkit-goto-uri=20= (xwidget-webkit-current-session)=20url))=0A=20=20=20=20=20= (xwidget-webkit-new-session=20url)))=0A=20=0A=20(defun=20= xwidget-webkit-back=20()=0A-=20=20"Go=20back=20in=20history."=0A+=20=20= "Go=20back=20to=20previous=20URL=20in=20xwidget=20webkit=20buffer."=0A+=20= =20(interactive)=0A+=20=20(xwidget-webkit-goto-history=20= (xwidget-webkit-current-session)=20-1))=0A+=0A+(defun=20= xwidget-webkit-forward=20()=0A+=20=20"Go=20forward=20in=20history."=0A=20= =20=20(interactive)=0A-=20=20(xwidget-webkit-execute-script=20= (xwidget-webkit-current-session)=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=20=20=20=20= "history.go(-1);"))=0A+=20=20(xwidget-webkit-goto-history=20= (xwidget-webkit-current-session)=201))=0A=20=0A=20(defun=20= xwidget-webkit-reload=20()=0A-=20=20"Reload=20current=20url."=0A+=20=20= "Reload=20current=20URL."=0A=20=20=20(interactive)=0A-=20=20= (xwidget-webkit-execute-script=20(xwidget-webkit-current-session)=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=20=20=20=20"history.go(0);"))=0A+=20=20= (xwidget-webkit-goto-history=20(xwidget-webkit-current-session)=200))=0A=20= =0A=20(defun=20xwidget-webkit-current-url=20()=0A-=20=20"Get=20the=20= webkit=20url=20and=20place=20it=20on=20the=20kill-ring."=0A+=20=20= "Display=20the=20current=20xwidget=20webkit=20URL=20and=20place=20it=20= on=20the=20`kill-ring'."=0A=20=20=20(interactive)=0A-=20=20= (xwidget-webkit-execute-script=0A-=20=20=20= (xwidget-webkit-current-session)=0A-=20=20=20"document.URL"=20(lambda=20= (rv)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20= ((url=20(kill-new=20(or=20rv=20""))))=0A-=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(message=20"url:=20%s"=20url)))))=0A+=20= =20(let=20((url=20(xwidget-webkit-uri=20= (xwidget-webkit-current-session))))=0A+=20=20=20=20(message=20"URL:=20= %s"=20(kill-new=20(or=20url=20"")))))=0A=20=0A=20= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A=20(defun=20= xwidget-webkit-get-selection=20(proc)=0A@@=20-555,10=20+624,9=20@@=20= xwidget-webkit-get-selection=0A=20=20=20=20proc))=0A=20=0A=20(defun=20= xwidget-webkit-copy-selection-as-kill=20()=0A-=20=20"Get=20the=20webkit=20= selection=20and=20put=20it=20on=20the=20kill-ring."=0A+=20=20"Get=20the=20= webkit=20selection=20and=20put=20it=20on=20the=20`kill-ring'."=0A=20=20=20= (interactive)=0A-=20=20(xwidget-webkit-get-selection=20(lambda=20= (selection)=20(kill-new=20selection))))=0A-=0A+=20=20= (xwidget-webkit-get-selection=20#'kill-new))=0A=20=0A=20= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A=20;;=20= Xwidget=20plist=20management=20(similar=20to=20the=20process=20plist=20= functions)=0Adiff=20--git=20a/src/nsxwidget.h=20b/src/nsxwidget.h=0A= index=207e2a3e0c40..521601922f=20100644=0A---=20a/src/nsxwidget.h=0A+++=20= b/src/nsxwidget.h=0A@@=20-32,7=20+32,10=20@@=20#define=20= NSXWIDGET_H_INCLUDED=0A=20/*=20Functions=20for=20xwidget=20webkit.=20=20= */=0A=20=0A=20bool=20nsxwidget_is_web_view=20(struct=20xwidget=20*xw);=0A= +Lisp_Object=20nsxwidget_webkit_uri=20(struct=20xwidget=20*xw);=0A= +Lisp_Object=20nsxwidget_webkit_title=20(struct=20xwidget=20*xw);=0A=20= void=20nsxwidget_webkit_goto_uri=20(struct=20xwidget=20*xw,=20const=20= char=20*uri);=0A+void=20nsxwidget_webkit_goto_history=20(struct=20= xwidget=20*xw,=20int=20rel_pos);=0A=20void=20nsxwidget_webkit_zoom=20= (struct=20xwidget=20*xw,=20double=20zoom_change);=0A=20void=20= nsxwidget_webkit_execute_script=20(struct=20xwidget=20*xw,=20const=20= char=20*script,=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=20=20=20=20=20=20=20=20=20=20Lisp_Object=20= fun);=0Adiff=20--git=20a/src/nsxwidget.m=20b/src/nsxwidget.m=0Aindex=20= df6c06f59a..87a10e34e0=20100644=0A---=20a/src/nsxwidget.m=0A+++=20= b/src/nsxwidget.m=0A@@=20-293,6=20+293,21=20@@=20-=20= (void)userContentController:(WKUserContentController=20= *)userContentController=0A=20=20=20return=20xw->xwWidget=20!=3D=20NULL=20= &&=0A=20=20=20=20=20[xw->xwWidget=20isKindOfClass:WKWebView.class];=0A=20= }=0A+=0A+Lisp_Object=0A+nsxwidget_webkit_uri=20(struct=20xwidget=20*xw)=0A= +{=0A+=20=20XwWebView=20*xwWebView=20=3D=20(XwWebView=20*)=20= xw->xwWidget;=0A+=20=20return=20build_string_with_nsstr=20= (xwWebView.URL.absoluteString);=0A+}=0A+=0A+Lisp_Object=0A= +nsxwidget_webkit_title=20(struct=20xwidget=20*xw)=0A+{=0A+=20=20= XwWebView=20*xwWebView=20=3D=20(XwWebView=20*)=20xw->xwWidget;=0A+=20=20= return=20build_string_with_nsstr=20(xwWebView.title);=0A+}=0A+=0A=20/*=20= @Note=20ATS=20-=20Need=20application=20transport=20security=20in=20= 'Info.plist'=20or=0A=20=20=20=20remote=20pages=20will=20not=20loaded.=20=20= */=0A=20void=0A@@=20-305,6=20+320,17=20@@=20-=20= (void)userContentController:(WKUserContentController=20= *)userContentController=0A=20=20=20[xwWebView=20loadRequest:urlRequest];=0A= =20}=0A=20=0A+void=0A+nsxwidget_webkit_goto_history=20(struct=20xwidget=20= *xw,=20int=20rel_pos)=0A+{=0A+=20=20XwWebView=20*xwWebView=20=3D=20= (XwWebView=20*)=20xw->xwWidget;=0A+=20=20switch=20(rel_pos)=20{=0A+=20=20= case=20-1:=20[xwWebView=20goBack];=20break;=0A+=20=20case=200:=20= [xwWebView=20reload];=20break;=0A+=20=20case=201:=20[xwWebView=20= goForward];=20break;=0A+=20=20}=0A+}=0A+=0A=20void=0A=20= nsxwidget_webkit_zoom=20(struct=20xwidget=20*xw,=20double=20zoom_change)=0A= =20{=0Adiff=20--git=20a/src/xwidget.c=20b/src/xwidget.c=0Aindex=20= b841516c9f..15d909f51c=20100644=0A---=20a/src/xwidget.c=0A+++=20= b/src/xwidget.c=0A@@=20-786,6=20+786,36=20@@=20#define=20= WEBKIT_FN_INIT()=09=09=09=09=09=09\=0A=20=20=20=20=20=20=20return=20= Qnil;=09=09=09=09=09=09=09\=0A=20=20=20=20=20}=0A=20=0A+DEFUN=20= ("xwidget-webkit-uri",=0A+=20=20=20=20=20=20=20Fxwidget_webkit_uri,=20= Sxwidget_webkit_uri,=0A+=20=20=20=20=20=20=201,=201,=200,=0A+=20=20=20=20= =20=20=20doc:=20/*=20Get=20the=20current=20URL=20of=20XWIDGET=20webkit.=20= =20*/)=0A+=20=20(Lisp_Object=20xwidget)=0A+{=0A+=20=20WEBKIT_FN_INIT=20= ();=0A+#ifdef=20USE_GTK=0A+=20=20WebKitWebView=20*wkwv=20=3D=20= WEBKIT_WEB_VIEW=20(xw->widget_osr);=0A+=20=20return=20build_string=20= (webkit_web_view_get_uri=20(wkwv));=0A+#elif=20defined=20NS_IMPL_COCOA=0A= +=20=20return=20nsxwidget_webkit_uri=20(xw);=0A+#endif=0A+}=0A+=0A+DEFUN=20= ("xwidget-webkit-title",=0A+=20=20=20=20=20=20=20Fxwidget_webkit_title,=20= Sxwidget_webkit_title,=0A+=20=20=20=20=20=20=201,=201,=200,=0A+=20=20=20=20= =20=20=20doc:=20/*=20Get=20the=20current=20title=20of=20XWIDGET=20= webkit.=20=20*/)=0A+=20=20(Lisp_Object=20xwidget)=0A+{=0A+=20=20= WEBKIT_FN_INIT=20();=0A+#ifdef=20USE_GTK=0A+=20=20WebKitWebView=20*wkwv=20= =3D=20WEBKIT_WEB_VIEW=20(xw->widget_osr);=0A+=20=20return=20build_string=20= (webkit_web_view_get_title=20(wkwv));=0A+#elif=20defined=20NS_IMPL_COCOA=0A= +=20=20return=20nsxwidget_webkit_title=20(xw);=0A+#endif=0A+}=0A+=0A=20= DEFUN=20("xwidget-webkit-goto-uri",=0A=20=20=20=20=20=20=20=20= Fxwidget_webkit_goto_uri,=20Sxwidget_webkit_goto_uri,=0A=20=20=20=20=20=20= =20=202,=202,=200,=0A@@=20-803,6=20+833,27=20@@=20DEFUN=20= ("xwidget-webkit-goto-uri",=0A=20=20=20return=20Qnil;=0A=20}=0A=20=0A= +DEFUN=20("xwidget-webkit-goto-history",=0A+=20=20=20=20=20=20=20= Fxwidget_webkit_goto_history,=20Sxwidget_webkit_goto_history,=0A+=20=20=20= =20=20=20=202,=202,=200,=0A+=20=20=20=20=20=20=20doc:=20/*=20Make=20the=20= XWIDGET=20webkit=20load=20REL-POS=20(-1,=200,=201)=20page=20in=20browse=20= history.=20=20*/)=0A+=20=20(Lisp_Object=20xwidget,=20Lisp_Object=20= rel_pos)=0A+{=0A+=20=20WEBKIT_FN_INIT=20();=0A+=20=20= CHECK_RANGED_INTEGER=20(rel_pos,=20-1,=201);=20/*=20-1,=200,=201=20*/=0A= +#ifdef=20USE_GTK=0A+=20=20WebKitWebView=20*wkwv=20=3D=20WEBKIT_WEB_VIEW=20= (xw->widget_osr);=0A+=20=20switch=20(XFIXNAT=20(rel_pos))=20{=0A+=20=20= case=20-1:=20webkit_web_view_go_back=20(wkwv);=20break;=0A+=20=20case=20= 0:=20webkit_web_view_reload=20(wkwv);=20break;=0A+=20=20case=201:=20= webkit_web_view_go_forward=20(wkwv);=20break;=0A+=20=20}=0A+#elif=20= defined=20NS_IMPL_COCOA=0A+=20=20nsxwidget_webkit_goto_history=20(xw,=20= XFIXNAT=20(rel_pos));=0A+#endif=0A+=20=20return=20Qnil;=0A+}=0A+=0A=20= DEFUN=20("xwidget-webkit-zoom",=0A=20=20=20=20=20=20=20=20= Fxwidget_webkit_zoom,=20Sxwidget_webkit_zoom,=0A=20=20=20=20=20=20=20=20= 2,=202,=200,=0A@@=20-1145,7=20+1196,10=20@@=20syms_of_xwidget=20(void)=0A= =20=20=20defsubr=20(&Sxwidget_query_on_exit_flag);=0A=20=20=20defsubr=20= (&Sset_xwidget_query_on_exit_flag);=0A=20=0A+=20=20defsubr=20= (&Sxwidget_webkit_uri);=0A+=20=20defsubr=20(&Sxwidget_webkit_title);=0A=20= =20=20defsubr=20(&Sxwidget_webkit_goto_uri);=0A+=20=20defsubr=20= (&Sxwidget_webkit_goto_history);=0A=20=20=20defsubr=20= (&Sxwidget_webkit_zoom);=0A=20=20=20defsubr=20= (&Sxwidget_webkit_execute_script);=0A=20=20=20DEFSYM=20(Qwebkit,=20= "webkit");=0A--=20=0A2.17.2=20(Apple=20Git-113)=0A=0A= --Apple-Mail=_AA24E5D7-D128-4230-9BB5-4ABD010C3AB8 Content-Disposition: attachment; filename=0003-Add-support-for-file-downloading-in-macOS-xwidget-we.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0003-Add-support-for-file-downloading-in-macOS-xwidget-we.patch" Content-Transfer-Encoding: quoted-printable =46rom=207ea8c3184b5343ea177dc516d6fab0d98c9c57d9=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Sungbin=20Jo=20=0ADate:=20= Fri,=2026=20Jul=202019=2003:41:10=20+0900=0ASubject:=20[PATCH=203/3]=20= Add=20support=20for=20file=20downloading=20in=20macOS=20xwidget-webkit=0A= =0ACo-authored-by:=20Jaesup=20Kwak=20=0A=0A*=20= lisp/xwidget.el=20(xwidget-webkit-callback):=20Add=20case=20for=0A= 'response-callback'=20event.=0A(xwidget-webkit-download-dir):=20New=20= variable.=0A(xwidget-webkit-save-as-file):=20New=20function.=0A*=20= src/nsxwidget.m=20(XwWebView::decidePolicyForNavigationResponse):=0A= Store=20download=20event.=0A*=20src/xwidget.c=20src/xwidget.h=20= (store_xwidget_download_callback_event):=0ANew=20function.=0A---=0A=20= etc/NEWS=20=20=20=20=20=20=20=20|=20=204=20++++=0A=20lisp/xwidget.el=20|=20= 31=20+++++++++++++++++++++++++++++++=0A=20src/nsxwidget.m=20|=2012=20= ++++++++++++=0A=20src/xwidget.c=20=20=20|=2020=20++++++++++++++++++++=0A=20= src/xwidget.h=20=20=20|=20=205=20+++++=0A=205=20files=20changed,=2072=20= insertions(+)=0A=0Adiff=20--git=20a/etc/NEWS=20b/etc/NEWS=0Aindex=20= f9a42f73be..c7f980f212=20100644=0A---=20a/etc/NEWS=0A+++=20b/etc/NEWS=0A= @@=20-2469,6=20+2469,10=20@@=20instances=20of=20xwidget=20webkit=20is=20= not=20supported.=0A=20=0A=20***=20New=20variable=20= 'xwidget-webkit-enable-plugins'.=0A=20=0A+**=20On=20macOS,=20downloading=20= files=20from=20xwidget-webkit=20is=20supported.=0A+=0A+***=20New=20= variable=20'xwidget-webkit-download-dir'.=0A+=0A=20=0A=20=0C=0A=20= ----------------------------------------------------------------------=0A= diff=20--git=20a/lisp/xwidget.el=20b/lisp/xwidget.el=0Aindex=20= 584a894148..2e8bfa3a98=20100644=0A---=20a/lisp/xwidget.el=0A+++=20= b/lisp/xwidget.el=0A@@=20-288,6=20+288,12=20@@=20xwidget-webkit-callback=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (xwidget-webkit-show-id-or-named-element=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20xwidget=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(match-string=201=20strarg)))))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20;;=20TODO:=20Response=20handling=20other=20= than=20download.=0A+=20=20=20=20=20=20=20=20=20=20=20=20((eq=20= xwidget-event-type=20'download-callback)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20(let=20((url=20=20(nth=203=20last-input-event))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(mime-type=20(nth=204=20= last-input-event))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(file-name=20(nth=205=20last-input-event)))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(xwidget-webkit-save-as-file=20url=20mime-type=20= file-name)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20((eq=20= xwidget-event-type=20'javascript-callback)=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(let=20((proc=20(nth=203=20last-input-event))=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(arg=20=20(nth=204=20= last-input-event)))=0A@@=20-308,6=20+314,31=20@@=20xwidget-webkit-mode=0A= =20=20=20;;=20Keep=20track=20of=20[vh]scroll=20when=20switching=20= buffers=0A=20=20=20(image-mode-setup-winprops))=0A=20=0A+;;;=20Download,=20= save=20as=20file.=0A+=0A+(defcustom=20xwidget-webkit-download-dir=20= "~/Downloads/"=0A+=20=20"Directory=20where=20download=20file=20saved."=0A= +=20=20:version=20"27.1"=0A+=20=20:type=20'file)=0A+=0A+(defun=20= xwidget-webkit-save-as-file=20(url=20mime-type=20file-name)=0A+=20=20= "For=20XWIDGET=20webkit,=20save=20URL=20of=20MIME-TYPE=20to=20location=20= specified=20by=20user.=0A+FILE-NAME=20combined=20with=20= `xwidget-webkit-download-dir'=20is=20the=20default=20file=20name=0A+of=20= the=20prompt=20when=20reading.=20=20When=20the=20file=20name=20the=20= user=20specified=20is=20a=0A+directory,=20URL=20is=20saved=20at=20the=20= specified=20directory=20as=20FILE-NAME."=0A+=20=20(let=20((save-name=20= (read-file-name=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(format=20"Save=20URL=20`%s'=20of=20type=20`%s'=20in=20= file/directory:=20"=20url=20mime-type)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20xwidget-webkit-download-dir=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(when=20file-name=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (expand-file-name=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20file-name=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20xwidget-webkit-download-dir)))))=0A+=20=20=20=20= (if=20(file-directory-p=20save-name)=0A+=20=20=20=20=20=20=20=20(setq=20= save-name=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20(expand-file-name=20= (file-name-nondirectory=20file-name)=20save-name)))=0A+=20=20=20=20(setq=20= xwidget-webkit-download-dir=20(file-name-directory=20save-name))=0A+=20=20= =20=20(url-copy-file=20url=20save-name=20t)))=0A+=0A=20;;;=20Bookmarks=20= integration=0A=20=0A=20(defcustom=20= xwidget-webkit-bookmark-jump-new-session=20nil=0Adiff=20--git=20= a/src/nsxwidget.m=20b/src/nsxwidget.m=0Aindex=2087a10e34e0..8cac4b49ec=20= 100644=0A---=20a/src/nsxwidget.m=0A+++=20b/src/nsxwidget.m=0A@@=20-122,6=20= +122,18=20@@=20-=20(void)webView:(WKWebView=20*)webView=0A=20= decidePolicyForNavigationResponse:(WKNavigationResponse=20= *)navigationResponse=0A=20decisionHandler:(void=20= (^)(WKNavigationResponsePolicy))decisionHandler=0A=20{=0A+=20=20if=20= (!navigationResponse.canShowMIMEType)=0A+=20=20=20=20{=0A+=20=20=20=20=20= =20NSString=20*url=20=3D=20= navigationResponse.response.URL.absoluteString;=0A+=20=20=20=20=20=20= NSString=20*mimetype=20=3D=20navigationResponse.response.MIMEType;=0A+=20= =20=20=20=20=20NSString=20*filename=20=3D=20= navigationResponse.response.suggestedFilename;=0A+=20=20=20=20=20=20= decisionHandler=20(WKNavigationResponsePolicyCancel);=0A+=20=20=20=20=20=20= store_xwidget_download_callback_event=20(self.xw,=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=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20url.UTF8String,=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=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20mimetype.UTF8String,=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=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= filename.UTF8String);=0A+=20=20=20=20=20=20return;=0A+=20=20=20=20}=0A=20= =20=20decisionHandler=20(WKNavigationResponsePolicyAllow);=0A=20=0A=20=20= =20self.urlScriptBlocked[navigationResponse.response.URL]=20=3D=0Adiff=20= --git=20a/src/xwidget.c=20b/src/xwidget.c=0Aindex=20= 15d909f51c..aa5470a419=20100644=0A---=20a/src/xwidget.c=0A+++=20= b/src/xwidget.c=0A@@=20-268,6=20+268,26=20@@=20= store_xwidget_event_string=20(struct=20xwidget=20*xw,=20const=20char=20= *eventname,=0A=20=20=20kbd_buffer_store_event=20(&event);=0A=20}=0A=20=0A= +void=0A+store_xwidget_download_callback_event=20(struct=20xwidget=20= *xw,=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=20=20=20=20=20=20=20=20=20=20const=20char=20*url,=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=20=20=20=20=20=20=20=20=20=20const=20char=20*mimetype,=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=20=20=20=20=20=20=20=20=20=20const=20char=20*filename)=0A= +{=0A+=20=20struct=20input_event=20event;=0A+=20=20Lisp_Object=20xwl;=0A= +=20=20XSETXWIDGET=20(xwl,=20xw);=0A+=20=20EVENT_INIT=20(event);=0A+=20=20= event.kind=20=3D=20XWIDGET_EVENT;=0A+=20=20event.frame_or_window=20=3D=20= Qnil;=0A+=20=20event.arg=20=3D=20list5=20(intern=20= ("download-callback"),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20xwl,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20build_string=20(url),=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20build_string=20(mimetype),=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20build_string=20(filename));=0A= +=20=20kbd_buffer_store_event=20(&event);=0A+}=0A+=0A=20void=0A=20= store_xwidget_js_callback_event=20(struct=20xwidget=20*xw,=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= =20=20=20=20=20Lisp_Object=20proc,=0Adiff=20--git=20a/src/xwidget.h=20= b/src/xwidget.h=0Aindex=2073d8bbd540..11260f98b1=20100644=0A---=20= a/src/xwidget.h=0A+++=20b/src/xwidget.h=0A@@=20-155,6=20+155,11=20@@=20= #define=20XG_XWIDGET_VIEW=20"emacs_xwidget_view"=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=20=20=20=20= =20const=20char=20*eventname,=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=20=20=20=20=20const=20char=20= *eventstr);=0A=20=0A+void=20store_xwidget_download_callback_event=20= (struct=20xwidget=20*xw,=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=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20const=20char=20*url,=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=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20const=20char=20*mimetype,=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=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20const=20char=20*filename);=0A+=0A=20void=20= store_xwidget_js_callback_event=20(struct=20xwidget=20*xw,=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= =20=20=20=20=20=20=20=20=20=20Lisp_Object=20proc,=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=20=20=20= =20=20=20=20=20=20=20Lisp_Object=20argument);=0A--=20=0A2.17.2=20(Apple=20= Git-113)=0A=0A= --Apple-Mail=_AA24E5D7-D128-4230-9BB5-4ABD010C3AB8--