diff --git a/example/index.html b/example/index.html index 6c2232d..4162fed 100644 --- a/example/index.html +++ b/example/index.html @@ -3,15 +3,21 @@ Example of racket webview - + -

Example

+

Example

Please press this for something to happen.

Some input text:

+
+

Hi there!

+
+

Ja

+Ja +

Nou...

diff --git a/example/styles.css b/example/styles.css index 68be6c5..f7eebca 100644 --- a/example/styles.css +++ b/example/styles.css @@ -1,4 +1,23 @@ body { - font-family: Arial; + font-family: sans-serif; font-size: 11pt; -} \ No newline at end of file +} + +.yellow, div.yellow { + background: yellow; + color: blue; +} + +.flop, div.flop { + font-weight: bold; +} + +h1.yellow { + background: green; +} + +h1.blue { + color: red; +} + + diff --git a/js/boilerplate.js b/js/boilerplate.js index 02cfe22..87ec3dd 100644 --- a/js/boilerplate.js +++ b/js/boilerplate.js @@ -48,7 +48,7 @@ window.rkt_bind_evt_ids = function(win_nr, selector, event_kind) { try { let nodelist = document.querySelectorAll(selector); if (nodelist === undefined || nodelist === null) { - return 'json:[]'; + return []; } let ids = []; nodelist.forEach(function(el) { @@ -68,9 +68,27 @@ window.rkt_bind_evt_ids = function(win_nr, selector, event_kind) { ids.push(info); } }); - return 'json:' + JSON.stringify(ids); + return ids; } catch(e) { - return 'json:[]'; + return []; } }; +window.rkt_with_selector = function(selector, func) { + let nodelist = document.querySelectorAll(selector); + if (nodelist === undefined || nodelist === null) { + return []; + } + let results = []; + let applier = function(el) { + let id = el.getAttribute('id'); + results.push(func(id, el)); + } + nodelist.forEach(applier); + let c = results.length; + let r = { 'applied-to-elements': c, 'with-ids': results.filter((id) => id !== null) }; + return r; +} + + + diff --git a/lib/dll/webview.dll b/lib/dll/webview.dll deleted file mode 100644 index 9343d55..0000000 Binary files a/lib/dll/webview.dll and /dev/null differ diff --git a/private/lib/linux/librktwebview_qt.so b/private/lib/linux/librktwebview_qt.so new file mode 100755 index 0000000..c8170bf Binary files /dev/null and b/private/lib/linux/librktwebview_qt.so differ diff --git a/private/mimetypes.rkt b/private/mimetypes.rkt new file mode 100644 index 0000000..f6e9aca --- /dev/null +++ b/private/mimetypes.rkt @@ -0,0 +1,725 @@ +#lang racket/base + +(require racket/contract) + +(provide mimetype-for-ext) + +(define/contract (mimetype-for-ext ext) + (-> (or/c string? symbol?) string?) + (hash-ref mimetypes + (if (string? ext) (string->symbol ext) ext) + "application/octet-stream")) + +(define mimetypes (make-hash)) + +(define-syntax addMimeType + (syntax-rules () + ((_ description http-mimetype extensions description2) + (for-each (λ (mimetype) + (unless (hash-has-key? mimetypes mimetype) + (hash-set! mimetypes mimetype http-mimetype))) + extensions)))) + +(addMimeType "3D Crossword Plugin" "application/vnd.hzn-3d-crossword" '(x3d) "IANA: 3D Crossword Plugin") +(addMimeType "3GP" "video/3gpp" '(3gp) "Wikipedia: 3GP") +(addMimeType "3GP2" "video/3gpp2" '(3g2) "Wikipedia: 3G2") +(addMimeType "3GPP MSEQ File" "application/vnd.mseq" '(mseq) "IANA: 3GPP MSEQ File") +(addMimeType "3M Post It Notes" "application/vnd.3m.post-it-notes" '(pwn) "IANA: 3M Post It Notes") +(addMimeType "3rd Generation Partnership Project - Pic Large" "application/vnd.3gpp.pic-bw-large" '(plb) "3GPP") +(addMimeType "3rd Generation Partnership Project - Pic Small" "application/vnd.3gpp.pic-bw-small" '(psb) "3GPP") +(addMimeType "3rd Generation Partnership Project - Pic Var" "application/vnd.3gpp.pic-bw-var" '(pvb) "3GPP") +(addMimeType "3rd Generation Partnership Project - Transaction Capabilities Application Part" "application/vnd.3gpp2.tcap" '(tcap) "3GPP") +(addMimeType "7-Zip" "application/x-7z-compressed" '(7z) "Wikipedia: 7-Zip") +(addMimeType "AbiWord" "application/x-abiword" '(abw) "Wikipedia: AbiWord") +(addMimeType "Ace Archive" "application/x-ace-compressed" '(ace) "Wikipedia: ACE") +(addMimeType "Active Content Compression" "application/vnd.americandynamics.acc" '(acc) "IANA: Active Content Compression") +(addMimeType "ACU Cobol" "application/vnd.acucobol" '(acu) "IANA: ACU Cobol") +(addMimeType "ACU Cobol" "application/vnd.acucorp" '(atc) "IANA: ACU Cobol") +(addMimeType "Adaptive differential pulse-code modulation" "audio/adpcm" '(adp) "Wikipedia: ADPCM") +(addMimeType "Adobe (Macropedia) Authorware - Binary File" "application/x-authorware-bin" '(aab) "Wikipedia: Authorware") +(addMimeType "Adobe (Macropedia) Authorware - Map" "application/x-authorware-map" '(aam) "Wikipedia: Authorware") +(addMimeType "Adobe (Macropedia) Authorware - Segment File" "application/x-authorware-seg" '(aas) "Wikipedia: Authorware") +(addMimeType "Adobe AIR Application" "application/vnd.adobe.air-application-installer-package+zip" '(air) "Building AIR Applications") +(addMimeType "Adobe Flash" "application/x-shockwave-flash" '(swf) "Wikipedia: Adobe Flash") +(addMimeType "Adobe Flex Project" "application/vnd.adobe.fxp" '(fxp) "IANA: Adobe Flex Project") +(addMimeType "Adobe Portable Document Format" "application/pdf" '(pdf) "Adobe PDF") +(addMimeType "Adobe PostScript Printer Description File Format" "application/vnd.cups-ppd" '(ppd) "IANA: Cups") +(addMimeType "Adobe Shockwave Player" "application/x-director" '(dir) "Wikipedia: Adobe Shockwave Player") +(addMimeType "Adobe XML Data Package" "application/vnd.adobe.xdp+xml" '(xdp) "Wikipedia: XML Data Package") +(addMimeType "Adobe XML Forms Data Format" "application/vnd.adobe.xfdf" '(xfdf) "Wikipedia: XML Portable Document Format") +(addMimeType "Advanced Audio Coding (AAC)" "audio/x-aac" '(aac) "Wikipedia: AAC") +(addMimeType "Ahead AIR Application" "application/vnd.ahead.space" '(ahead) "IANA: Ahead AIR Application") +(addMimeType "AirZip FileSECURE" "application/vnd.airzip.filesecure.azf" '(azf) "IANA: AirZip") +(addMimeType "AirZip FileSECURE" "application/vnd.airzip.filesecure.azs" '(azs) "IANA: AirZip") +(addMimeType "Amazon Kindle eBook format" "application/vnd.amazon.ebook" '(azw) "Kindle Direct Publishing") +(addMimeType "AmigaDE" "application/vnd.amiga.ami" '(ami) "IANA: Amiga") +(addMimeType "Andrew Toolkit" "application/andrew-inset" '(N/A) "IANA - Andrew Inset") +(addMimeType "Android Package Archive" "application/vnd.android.package-archive" '(apk) "Wikipedia: APK File Format") +(addMimeType "ANSER-WEB Terminal Client - Certificate Issue" "application/vnd.anser-web-certificate-issue-initiation" '(cii) "IANA: ANSWER-WEB") +(addMimeType "ANSER-WEB Terminal Client - Web Funds Transfer" "application/vnd.anser-web-funds-transfer-initiation" '(fti) "IANA: ANSWER-WEB") +(addMimeType "Antix Game Player" "application/vnd.antix.game-component" '(atx) "IANA: Antix Game Component") +(addMimeType "Apple Disk Image" "application/x-apple-diskimage" '(dmg) "Apple Disk Image") +(addMimeType "Apple Installer Package" "application/vnd.apple.installer+xml" '(mpkg) "IANA: Apple Installer") +(addMimeType "Applixware" "application/applixware" '(aw) "Vistasource") +(addMimeType "Archipelago Lesson Player" "application/vnd.hhe.lesson-player" '(les) "IANA: Archipelago Lesson Player") +(addMimeType "Archive document - Multiple Fils Embedded" "application/x-freearc" '(arc) "FreeArc") +(addMimeType "Arista Networks Software Image" "application/vnd.aristanetworks.swi" '(swi) "IANA: Arista Networks Software Image") +(addMimeType "Assembler Source File" "text/x-asm" '(s) "Wikipedia: Assembly") +(addMimeType "Atom Publishing Protocol" "application/atomcat+xml" '(atomcat) "RFC 5023") +(addMimeType "Atom Publishing Protocol Service Document" "application/atomsvc+xml" '(atomsvc) "RFC 5023") +(addMimeType "Atom Syndication Format" "application/atom+xml" '(atom xml) "RFC 4287") +(addMimeType "Attribute Certificate" "application/pkix-attr-cert" '(ac) "RFC 5877") +(addMimeType "Audio Interchange File Format" "audio/x-aiff" '(aif) "Wikipedia: Audio Interchange File Format") +(addMimeType "Audio Video Interleave (AVI)" "video/x-msvideo" '(avi) "Wikipedia: AVI") +(addMimeType "Audiograph" "application/vnd.audiograph" '(aep) "IANA: Audiograph") +(addMimeType "AutoCAD DXF" "image/vnd.dxf" '(dxf) "Wikipedia: AutoCAD DXF") +(addMimeType "Autodesk Design Web Format (DWF)" "model/vnd.dwf" '(dwf) "Wikipedia: Design Web Format") +(addMimeType "AV1 Image File" "image/avif" '(avif) "AV1 Image File Format") +(addMimeType "BAS Partitur Format" "text/plain-bas" '(par) "Phonetik BAS") +(addMimeType "Binary CPIO Archive" "application/x-bcpio" '(bcpio) "Wikipedia: cpio") +(addMimeType "Binary Data" "application/octet-stream" '(bin) "") +(addMimeType "Bitmap Image File" "image/bmp" '(bmp) "Wikipedia: BMP File Format") +(addMimeType "BitTorrent" "application/x-bittorrent" '(torrent) "Wikipedia: BitTorrent") +(addMimeType "Blackberry COD File" "application/vnd.rim.cod" '(cod) "") +(addMimeType "Blueice Research Multipass" "application/vnd.blueice.multipass" '(mpm) "IANA: Multipass") +(addMimeType "BMI Drawing Data Interchange" "application/vnd.bmi" '(bmi) "IANA: BMI") +(addMimeType "Bourne Shell Script" "application/x-sh" '(sh) "Wikipedia: Bourne Shell") +(addMimeType "BTIF" "image/prs.btif" '(btif) "IANA: BTIF") +(addMimeType "BusinessObjects" "application/vnd.businessobjects" '(rep) "IANA: BusinessObjects") +(addMimeType "Bzip Archive" "application/x-bzip" '(bz) "Wikipedia: Bzip") +(addMimeType "Bzip2 Archive" "application/x-bzip2" '(bz2) "Wikipedia: Bzip") +(addMimeType "C Shell Script" "application/x-csh" '(csh) "Wikipedia: C Shell") +(addMimeType "C Source File" "text/x-c" '(c) "Wikipedia: C Programming Language") +(addMimeType "CambridgeSoft Chem Draw" "application/vnd.chemdraw+xml" '(cdxml) "IANA: Chem Draw") +(addMimeType "Cascading Style Sheets (CSS)" "text/css" '(css) "Wikipedia: CSS") +(addMimeType "CD Audio" "application/x-cdf" '(cda) "Wikipedia: CDA File") +(addMimeType "ChemDraw eXchange file" "chemical/x-cdx" '(cdx) "ChemDraw eXchange file") +(addMimeType "Chemical Markup Language" "chemical/x-cml" '(cml) "Wikipedia: Chemical Markup Language") +(addMimeType "Chemical Style Markup Language" "chemical/x-csml" '(csml) "Wikipedia: Chemical Style Markup Language") +(addMimeType "CIM Database" "application/vnd.contact.cmsg" '(cdbcmsg) "IANA: CIM Database") +(addMimeType "Claymore Data Files" "application/vnd.claymore" '(cla) "IANA: Claymore") +(addMimeType "Clonk Game" "application/vnd.clonk.c4group" '(c4g) "IANA: Clonk") +(addMimeType "Close Captioning - Subtitle" "image/vnd.dvb.subtitle" '(sub) "Wikipedia: Closed Captioning") +(addMimeType "Cloud Data Management Interface (CDMI) - Capability" "application/cdmi-capability" '(cdmia) "RFC 6208") +(addMimeType "Cloud Data Management Interface (CDMI) - Contaimer" "application/cdmi-container" '(cdmic) "RFC 6209") +(addMimeType "Cloud Data Management Interface (CDMI) - Domain" "application/cdmi-domain" '(cdmid) "RFC 6210") +(addMimeType "Cloud Data Management Interface (CDMI) - Object" "application/cdmi-object" '(cdmio) "RFC 6211") +(addMimeType "Cloud Data Management Interface (CDMI) - Queue" "application/cdmi-queue" '(cdmiq) "RFC 6212") +(addMimeType "ClueTrust CartoMobile - Config" "application/vnd.cluetrust.cartomobile-config" '(c11amc) "IANA: CartoMobile") +(addMimeType "ClueTrust CartoMobile - Config Package" "application/vnd.cluetrust.cartomobile-config-pkg" '(c11amz) "IANA: CartoMobile") +(addMimeType "CMU Image" "image/x-cmu-raster" '(ras) "") +(addMimeType "COLLADA" "model/vnd.collada+xml" '(dae) "IANA: COLLADA") +(addMimeType "Comma-Seperated Values" "text/csv" '(csv) "Wikipedia: CSV") +(addMimeType "Compact Pro" "application/mac-compactpro" '(cpt) "Compact Pro") +(addMimeType "Compiled Wireless Markup Language (WMLC)" "application/vnd.wap.wmlc" '(wmlc) "IANA: WMLC") +(addMimeType "Computer Graphics Metafile" "image/cgm" '(cgm) "Wikipedia: Computer Graphics Metafile") +(addMimeType "CoolTalk" "x-conference/x-cooltalk" '(ice) "Wikipedia: CoolTalk") +(addMimeType "Corel Metafile Exchange (CMX)" "image/x-cmx" '(cmx) "Wikipedia: CorelDRAW") +(addMimeType "CorelXARA" "application/vnd.xara" '(xar) "IANA: CorelXARA") +(addMimeType "CosmoCaller" "application/vnd.cosmocaller" '(cmc) "IANA: CosmoCaller") +(addMimeType "CPIO Archive" "application/x-cpio" '(cpio) "Wikipedia: cpio") +(addMimeType "CrickSoftware - Clicker" "application/vnd.crick.clicker" '(clkx) "IANA: Clicker") +(addMimeType "CrickSoftware - Clicker - Keyboard" "application/vnd.crick.clicker.keyboard" '(clkk) "IANA: Clicker") +(addMimeType "CrickSoftware - Clicker - Palette" "application/vnd.crick.clicker.palette" '(clkp) "IANA: Clicker") +(addMimeType "CrickSoftware - Clicker - Template" "application/vnd.crick.clicker.template" '(clkt) "IANA: Clicker") +(addMimeType "CrickSoftware - Clicker - Wordbank" "application/vnd.crick.clicker.wordbank" '(clkw) "IANA: Clicker") +(addMimeType "Critical Tools - PERT Chart EXPERT" "application/vnd.criticaltools.wbs+xml" '(wbs) "IANA: Critical Tools") +(addMimeType "CryptoNote" "application/vnd.rig.cryptonote" '(cryptonote) "IANA: CryptoNote") +(addMimeType "Crystallographic Interchange Format" "chemical/x-cif" '(cif) "Crystallographic Interchange Format") +(addMimeType "CrystalMaker Data Format" "chemical/x-cmdf" '(cmdf) "CrystalMaker Data Format") +(addMimeType "CU-SeeMe" "application/cu-seeme" '(cu) "White Pine") +(addMimeType "CU-Writer" "application/prs.cww" '(cww) "") +(addMimeType "Curl - Applet" "text/vnd.curl" '(curl) "Curl Applet") +(addMimeType "Curl - Detached Applet" "text/vnd.curl.dcurl" '(dcurl) "Curl Detached Applet") +(addMimeType "Curl - Manifest File" "text/vnd.curl.mcurl" '(mcurl) "Curl Manifest File") +(addMimeType "Curl - Source Code" "text/vnd.curl.scurl" '(scurl) "Curl Source Code") +(addMimeType "CURL Applet" "application/vnd.curl.car" '(car) "IANA: CURL Applet") +(addMimeType "CURL Applet" "application/vnd.curl.pcurl" '(pcurl) "IANA: CURL Applet") +(addMimeType "CustomMenu" "application/vnd.yellowriver-custom-menu" '(cmp) "IANA: CustomMenu") +(addMimeType "Data Structure for the Security Suitability of Cryptographic Algorithms" "application/dssc+der" '(dssc) "RFC 5698") +(addMimeType "Data Structure for the Security Suitability of Cryptographic Algorithms" "application/dssc+xml" '(xdssc) "RFC 5698") +(addMimeType "Debian Package" "application/x-debian-package" '(deb) "Wikipedia: Debian Package") +(addMimeType "DECE Audio" "audio/vnd.dece.audio" '(uva) "IANA: Dece Audio") +(addMimeType "DECE Graphic" "image/vnd.dece.graphic" '(uvi) "IANA: DECE Graphic") +(addMimeType "DECE High Definition Video" "video/vnd.dece.hd" '(uvh) "IANA: DECE HD Video") +(addMimeType "DECE Mobile Video" "video/vnd.dece.mobile" '(uvm) "IANA: DECE Mobile Video") +(addMimeType "DECE MP4" "video/vnd.uvvu.mp4" '(uvu) "IANA: DECE MP4") +(addMimeType "DECE PD Video" "video/vnd.dece.pd" '(uvp) "IANA: DECE PD Video") +(addMimeType "DECE SD Video" "video/vnd.dece.sd" '(uvs) "IANA: DECE SD Video") +(addMimeType "DECE Video" "video/vnd.dece.video" '(uvv) "IANA: DECE Video") +(addMimeType "Device Independent File Format (DVI)" "application/x-dvi" '(dvi) "Wikipedia: DVI") +(addMimeType "Digital Siesmograph Networks - SEED Datafiles" "application/vnd.fdsn.seed" '(seed) "IANA: SEED") +(addMimeType "Digital Talking Book" "application/x-dtbook+xml" '(dtb) "Wikipedia: EPUB") +(addMimeType "Digital Talking Book - Resource File" "application/x-dtbresource+xml" '(res) "Digital Talking Book") +(addMimeType "Digital Video Broadcasting" "application/vnd.dvb.ait" '(ait) "IANA: Digital Video Broadcasting") +(addMimeType "Digital Video Broadcasting" "application/vnd.dvb.service" '(svc) "IANA: Digital Video Broadcasting") +(addMimeType "Digital Winds Music" "audio/vnd.digital-winds" '(eol) "IANA: Digital Winds") +(addMimeType "DjVu" "image/vnd.djvu" '(djvu) "Wikipedia: DjVu") +(addMimeType "Document Type Definition" "application/xml-dtd" '(dtd) "W3C DTD") +(addMimeType "Dolby Meridian Lossless Packing" "application/vnd.dolby.mlp" '(mlp) "IANA: Dolby Meridian Lossless Packing") +(addMimeType "Doom Video Game" "application/x-doom" '(wad) "Wikipedia: Doom WAD") +(addMimeType "DPGraph" "application/vnd.dpgraph" '(dpg) "IANA: DPGraph") +(addMimeType "DRA Audio" "audio/vnd.dra" '(dra) "IANA: DRA") +(addMimeType "DreamFactory" "application/vnd.dreamfactory" '(dfac) "IANA: DreamFactory") +(addMimeType "DTS Audio" "audio/vnd.dts" '(dts) "IANA: DTS") +(addMimeType "DTS High Definition Audio" "audio/vnd.dts.hd" '(dtshd) "IANA: DTS HD") +(addMimeType "DWG Drawing" "image/vnd.dwg" '(dwg) "Wikipedia: DWG") +(addMimeType "DynaGeo" "application/vnd.dynageo" '(geo) "IANA: DynaGeo") +(addMimeType "ECMAScript" "application/ecmascript" '(es) "ECMA-357") +(addMimeType "EcoWin Chart" "application/vnd.ecowin.chart" '(mag) "IANA: EcoWin Chart") +(addMimeType "EDMICS 2000" "image/vnd.fujixerox.edmics-mmr" '(mmr) "IANA: EDMICS 2000") +(addMimeType "EDMICS 2000" "image/vnd.fujixerox.edmics-rlc" '(rlc) "IANA: EDMICS 2000") +(addMimeType "Efficient XML Interchange" "application/exi" '(exi) "Efficient XML Interchange (EXI) Best Practices") +(addMimeType "EFI Proteus" "application/vnd.proteus.magazine" '(mgz) "IANA: EFI Proteus") +(addMimeType "Electronic Publication" "application/epub+zip" '(epub) "Wikipedia: EPUB") +(addMimeType "Email Message" "message/rfc822" '(eml) "RFC 2822") +(addMimeType "Enliven Viewer" "application/vnd.enliven" '(nml) "IANA: Enliven Viewer") +(addMimeType "Express by Infoseek" "application/vnd.is-xpr" '(xpr) "IANA: Express by Infoseek") +(addMimeType "eXtended Image File Format (XIFF)" "image/vnd.xiff" '(xif) "IANA: XIFF") +(addMimeType "Extensible Forms Description Language" "application/vnd.xfdl" '(xfdl) "IANA: Extensible Forms Description Language") +(addMimeType "Extensible MultiModal Annotation" "application/emma+xml" '(emma) "EMMA: Extensible MultiModal Annotation markup language") +(addMimeType "EZPix Secure Photo Album" "application/vnd.ezpix-album" '(ez2) "IANA: EZPix Secure Photo Album") +(addMimeType "EZPix Secure Photo Album" "application/vnd.ezpix-package" '(ez3) "IANA: EZPix Secure Photo Album") +(addMimeType "FAST Search & Transfer ASA" "image/vnd.fst" '(fst) "IANA: FAST Search & Transfer ASA") +(addMimeType "FAST Search & Transfer ASA" "video/vnd.fvt" '(fvt) "IANA: FVT") +(addMimeType "FastBid Sheet" "image/vnd.fastbidsheet" '(fbs) "IANA: FastBid Sheet") +(addMimeType "FCS Express Layout Link" "application/vnd.denovo.fcselayout-link" '(fe_launch) "IANA: FCS Express Layout Link") +(addMimeType "Flash Video" "video/x-f4v" '(f4v) "Wikipedia: Flash Video") +(addMimeType "Flash Video" "video/x-flv" '(flv) "Wikipedia: Flash Video") +(addMimeType "FlashPix" "image/vnd.fpx" '(fpx) "IANA: FPX") +(addMimeType "FlashPix" "image/vnd.net-fpx" '(npx) "IANA: FPX") +(addMimeType "FLEXSTOR" "text/vnd.fmi.flexstor" '(flx) "IANA: FLEXSTOR") +(addMimeType "FLI/FLC Animation Format" "video/x-fli" '(fli) "FLI/FLC Animation Format") +(addMimeType "FluxTime Clip" "application/vnd.fluxtime.clip" '(ftc) "IANA: FluxTime Clip") +(addMimeType "Forms Data Format" "application/vnd.fdf" '(fdf) "IANA: Forms Data Format") +(addMimeType "Fortran Source File" "text/x-fortran" '(f) "Wikipedia: Fortran") +(addMimeType "FrameMaker Interchange Format" "application/vnd.mif" '(mif) "IANA: FrameMaker Interchange Format") +(addMimeType "FrameMaker Normal Format" "application/vnd.framemaker" '(fm) "IANA: FrameMaker") +(addMimeType "FreeHand MX" "image/x-freehand" '(fh) "Wikipedia: Macromedia Freehand") +(addMimeType "Friendly Software Corporation" "application/vnd.fsc.weblaunch" '(fsc) "IANA: Friendly Software Corporation") +(addMimeType "Frogans Player" "application/vnd.frogans.fnc" '(fnc) "IANA: Frogans Player") +(addMimeType "Frogans Player" "application/vnd.frogans.ltf" '(ltf) "IANA: Frogans Player") +(addMimeType "Fujitsu - Xerox 2D CAD Data" "application/vnd.fujixerox.ddd" '(ddd) "IANA: Fujitsu DDD") +(addMimeType "Fujitsu - Xerox DocuWorks" "application/vnd.fujixerox.docuworks" '(xdw) "IANA: Docuworks") +(addMimeType "Fujitsu - Xerox DocuWorks Binder" "application/vnd.fujixerox.docuworks.binder" '(xbd) "IANA: Docuworks Binder") +(addMimeType "Fujitsu Oasys" "application/vnd.fujitsu.oasys" '(oas) "IANA: Fujitsu Oasys") +(addMimeType "Fujitsu Oasys" "application/vnd.fujitsu.oasys2" '(oa2) "IANA: Fujitsu Oasys") +(addMimeType "Fujitsu Oasys" "application/vnd.fujitsu.oasys3" '(oa3) "IANA: Fujitsu Oasys") +(addMimeType "Fujitsu Oasys" "application/vnd.fujitsu.oasysgp" '(fg5) "IANA: Fujitsu Oasys") +(addMimeType "Fujitsu Oasys" "application/vnd.fujitsu.oasysprs" '(bh2) "IANA: Fujitsu Oasys") +(addMimeType "FutureSplash Animator" "application/x-futuresplash" '(spl) "Wikipedia: FutureSplash Animator") +(addMimeType "FuzzySheet" "application/vnd.fuzzysheet" '(fzs) "IANA: FuzySheet") +(addMimeType "G3 Fax Image" "image/g3fax" '(g3) "Wikipedia: G3 Fax Image") +(addMimeType "GameMaker ActiveX" "application/vnd.gmx" '(gmx) "IANA: GameMaker ActiveX") +(addMimeType "Gen-Trix Studio" "model/vnd.gtw" '(gtw) "IANA: GTW") +(addMimeType "Genomatix Tuxedo Framework" "application/vnd.genomatix.tuxedo" '(txd) "IANA: Genomatix Tuxedo Framework") +(addMimeType "GeoGebra" "application/vnd.geogebra.file" '(ggb) "IANA: GeoGebra") +(addMimeType "GeoGebra" "application/vnd.geogebra.tool" '(ggt) "IANA: GeoGebra") +(addMimeType "Geometric Description Language (GDL)" "model/vnd.gdl" '(gdl) "IANA: GDL") +(addMimeType "GeoMetry Explorer" "application/vnd.geometry-explorer" '(gex) "IANA: GeoMetry Explorer") +(addMimeType "GEONExT and JSXGraph" "application/vnd.geonext" '(gxt) "IANA: GEONExT and JSXGraph") +(addMimeType "GeoplanW" "application/vnd.geoplan" '(g2w) "IANA: GeoplanW") +(addMimeType "GeospacW" "application/vnd.geospace" '(g3w) "IANA: GeospacW") +(addMimeType "Ghostscript Font" "application/x-font-ghostscript" '(gsf) "Wikipedia: Ghostscript") +(addMimeType "Glyph Bitmap Distribution Format" "application/x-font-bdf" '(bdf) "Wikipedia: Glyph Bitmap Distribution Format") +(addMimeType "GNU Tar Files" "application/x-gtar" '(gtar) "GNU Tar") +(addMimeType "GNU Texinfo Document" "application/x-texinfo" '(texinfo) "Wikipedia: Texinfo") +(addMimeType "Gnumeric" "application/x-gnumeric" '(gnumeric) "Wikipedia: Gnumeric") +(addMimeType "Google Earth - KML" "application/vnd.google-earth.kml+xml" '(kml) "IANA: Google Earth") +(addMimeType "Google Earth - Zipped KML" "application/vnd.google-earth.kmz" '(kmz) "IANA: Google Earth") +(addMimeType "GPS eXchange Format" "application/gpx+xml" '(gpx) "GPS eXchange Format") +(addMimeType "GrafEq" "application/vnd.grafeq" '(gqf) "IANA: GrafEq") +(addMimeType "Graphics Interchange Format" "image/gif" '(gif) "Wikipedia: Graphics Interchange Format") +(addMimeType "Graphviz" "text/vnd.graphviz" '(gv) "IANA: Graphviz") +(addMimeType "Groove - Account" "application/vnd.groove-account" '(gac) "IANA: Groove") +(addMimeType "Groove - Help" "application/vnd.groove-help" '(ghf) "IANA: Groove") +(addMimeType "Groove - Identity Message" "application/vnd.groove-identity-message" '(gim) "IANA: Groove") +(addMimeType "Groove - Injector" "application/vnd.groove-injector" '(grv) "IANA: Groove") +(addMimeType "Groove - Tool Message" "application/vnd.groove-tool-message" '(gtm) "IANA: Groove") +(addMimeType "Groove - Tool Template" "application/vnd.groove-tool-template" '(tpl) "IANA: Groove") +(addMimeType "Groove - Vcard" "application/vnd.groove-vcard" '(vcg) "IANA: Groove") +(addMimeType "GZip" "application/gzip" '(gz) "Wikipedia: GZip") +(addMimeType "H.261" "video/h261" '(h261) "Wikipedia: H.261") +(addMimeType "H.263" "video/h263" '(h263) "Wikipedia: H.263") +(addMimeType "H.264" "video/h264" '(h264) "Wikipedia: H.264") +(addMimeType "Hewlett Packard Instant Delivery" "application/vnd.hp-hpid" '(hpid) "IANA: Hewlett Packard Instant Delivery") +(addMimeType "Hewlett-Packard's WebPrintSmart" "application/vnd.hp-hps" '(hps) "IANA: Hewlett-Packard's WebPrintSmart") +(addMimeType "Hierarchical Data Format" "application/x-hdf" '(hdf) "Wikipedia: Hierarchical Data Format") +(addMimeType "Hit'n'Mix" "audio/vnd.rip" '(rip) "IANA: Hit'n'Mix") +(addMimeType "Homebanking Computer Interface (HBCI)" "application/vnd.hbci" '(hbci) "IANA: HBCI") +(addMimeType "HP Indigo Digital Press - Job Layout Languate" "application/vnd.hp-jlyt" '(jlt) "IANA: HP Job Layout Language") +(addMimeType "HP Printer Command Language" "application/vnd.hp-pcl" '(pcl) "IANA: HP Printer Command Language") +(addMimeType "HP-GL/2 and HP RTL" "application/vnd.hp-hpgl" '(hpgl) "IANA: HP-GL/2 and HP RTL") +(addMimeType "HV Script" "application/vnd.yamaha.hv-script" '(hvs) "IANA: HV Script") +(addMimeType "HV Voice Dictionary" "application/vnd.yamaha.hv-dic" '(hvd) "IANA: HV Voice Dictionary") +(addMimeType "HV Voice Parameter" "application/vnd.yamaha.hv-voice" '(hvp) "IANA: HV Voice Parameter") +(addMimeType "Hydrostatix Master Suite" "application/vnd.hydrostatix.sof-data" '(sfd-hdstx) "IANA: Hydrostatix Master Suite") +(addMimeType "Hyperstudio" "application/hyperstudio" '(stk) "IANA - Hyperstudio") +(addMimeType "Hypertext Application Language" "application/vnd.hal+xml" '(hal) "IANA: HAL") +(addMimeType "HyperText Markup Language (HTML)" "text/html" '(html) "Wikipedia: HTML") +(addMimeType "IBM DB2 Rights Manager" "application/vnd.ibm.rights-management" '(irm) "IANA: IBM DB2 Rights Manager") +(addMimeType "IBM Electronic Media Management System - Secure Container" "application/vnd.ibm.secure-container" '(sc) "IANA: EMMS") +(addMimeType "iCalendar" "text/calendar" '(ics) "Wikipedia: iCalendar") +(addMimeType "ICC profile" "application/vnd.iccprofile" '(icc) "IANA: ICC profile") +(addMimeType "Icon Image" "image/x-icon" '(ico) "Wikipedia: ICO File Format") +(addMimeType "igLoader" "application/vnd.igloader" '(igl) "IANA: igLoader") +(addMimeType "Image Exchange Format" "image/ief" '(ief) "RFC 1314") +(addMimeType "ImmerVision PURE Players" "application/vnd.immervision-ivp" '(ivp) "IANA: ImmerVision PURE Players") +(addMimeType "ImmerVision PURE Players" "application/vnd.immervision-ivu" '(ivu) "IANA: ImmerVision PURE Players") +(addMimeType "IMS Networks" "application/reginfo+xml" '(rif) "") +(addMimeType "In3D - 3DML" "text/vnd.in3d.3dml" '(3dml) "IANA: In3D") +(addMimeType "In3D - 3DML" "text/vnd.in3d.spot" '(spot) "IANA: In3D") +(addMimeType "Initial Graphics Exchange Specification (IGES)" "model/iges" '(igs) "Wikipedia: IGES") +(addMimeType "Interactive Geometry Software" "application/vnd.intergeo" '(i2g) "IANA: Interactive Geometry Software") +(addMimeType "Interactive Geometry Software Cinderella" "application/vnd.cinderella" '(cdy) "IANA: Cinderella") +(addMimeType "Intercon FormNet" "application/vnd.intercon.formnet" '(xpw) "IANA: Intercon FormNet") +(addMimeType "International Society for Advancement of Cytometry" "application/vnd.isac.fcs" '(fcs) "IANA: International Society for Advancement of Cytometry") +(addMimeType "Internet Protocol Flow Information Export" "application/ipfix" '(ipfix) "RFC 3917") +(addMimeType "Internet Public Key Infrastructure - Certificate" "application/pkix-cert" '(cer) "RFC 2585") +(addMimeType "Internet Public Key Infrastructure - Certificate Management Protocole" "application/pkixcmp" '(pki) "RFC 2585") +(addMimeType "Internet Public Key Infrastructure - Certificate Revocation Lists" "application/pkix-crl" '(crl) "RFC 2585") +(addMimeType "Internet Public Key Infrastructure - Certification Path" "application/pkix-pkipath" '(pkipath) "RFC 2585") +(addMimeType "IOCOM Visimeet" "application/vnd.insors.igm" '(igm) "IANA: IOCOM Visimeet") +(addMimeType "IP Unplugged Roaming Client" "application/vnd.ipunplugged.rcprofile" '(rcprofile) "IANA: IP Unplugged Roaming Client") +(addMimeType "iRepository / Lucidoc Editor" "application/vnd.irepository.package+xml" '(irp) "IANA: iRepository / Lucidoc Editor") +(addMimeType "J2ME App Descriptor" "text/vnd.sun.j2me.app-descriptor" '(jad) "IANA: J2ME App Descriptor") +(addMimeType "Java Archive" "application/java-archive" '(jar) "Wikipedia: JAR file format") +(addMimeType "Java Bytecode File" "application/java-vm" '(class) "Wikipedia: Java Bytecode") +(addMimeType "Java Network Launching Protocol" "application/x-java-jnlp-file" '(jnlp) "Wikipedia: Java Web Start") +(addMimeType "Java Serialized Object" "application/java-serialized-object" '(ser) "Java Serialization API") +(addMimeType "Java Source File" "text/x-java-source,java" '(java) "Wikipedia: Java") +(addMimeType "JavaScript" "application/javascript" '(js) "JavaScript") +(addMimeType "JavaScript Module" "text/javascript" '(mjs) "Wikipedia: Javascript") +(addMimeType "JavaScript Module" "text/javascript" '(mjs) "ECMAScript modules") +(addMimeType "JavaScript Object Notation (JSON)" "application/json" '(json) "Wikipedia: JSON") +(addMimeType "Joda Archive" "application/vnd.joost.joda-archive" '(joda) "IANA: Joda Archive") +(addMimeType "JPEG Image" "image/jpeg" '(jpeg jpg) "RFC 1314") +(addMimeType "JPEG 2000 Compound Image File Format" "video/jpm" '(jpm) "IANA: JPM") +(addMimeType "JPEG Image (Citrix client)" "image/x-citrix-jpeg" '(jpeg jpg) "RFC 1314") +(addMimeType "JPEG Image (Progressive)" "image/pjpeg" '(pjpeg) "JPEG image compression FAQ") +(addMimeType "JPGVideo" "video/jpeg" '(jpgv) "RFC 3555") +(addMimeType "JSON - Linked Data" "application/ld+json" '(jsonld) "Wikipedia: JSON-LD") +(addMimeType "Kahootz" "application/vnd.kahootz" '(ktz) "IANA: Kahootz") +(addMimeType "Karaoke on Chipnuts Chipsets" "application/vnd.chipnuts.karaoke-mmd" '(mmd) "IANA: Chipnuts Karaoke") +(addMimeType "KDE KOffice Office Suite - Karbon" "application/vnd.kde.karbon" '(karbon) "IANA: KDE KOffice Office Suite") +(addMimeType "KDE KOffice Office Suite - KChart" "application/vnd.kde.kchart" '(chrt) "IANA: KDE KOffice Office Suite") +(addMimeType "KDE KOffice Office Suite - Kformula" "application/vnd.kde.kformula" '(kfo) "IANA: KDE KOffice Office Suite") +(addMimeType "KDE KOffice Office Suite - Kivio" "application/vnd.kde.kivio" '(flw) "IANA: KDE KOffice Office Suite") +(addMimeType "KDE KOffice Office Suite - Kontour" "application/vnd.kde.kontour" '(kon) "IANA: KDE KOffice Office Suite") +(addMimeType "KDE KOffice Office Suite - Kpresenter" "application/vnd.kde.kpresenter" '(kpr) "IANA: KDE KOffice Office Suite") +(addMimeType "KDE KOffice Office Suite - Kspread" "application/vnd.kde.kspread" '(ksp) "IANA: KDE KOffice Office Suite") +(addMimeType "KDE KOffice Office Suite - Kword" "application/vnd.kde.kword" '(kwd) "IANA: KDE KOffice Office Suite") +(addMimeType "Kenamea App" "application/vnd.kenameaapp" '(htke) "IANA: Kenamea App") +(addMimeType "Kidspiration" "application/vnd.kidspiration" '(kia) "IANA: Kidspiration") +(addMimeType "Kinar Applications" "application/vnd.kinar" '(kne) "IANA: Kina Applications") +(addMimeType "Kodak Storyshare" "application/vnd.kodak-descriptor" '(sse) "IANA: Kodak Storyshare") +(addMimeType "Laser App Enterprise" "application/vnd.las.las+xml" '(lasxml) "IANA: Laser App Enterprise") +(addMimeType "LaTeX" "application/x-latex" '(latex) "Wikipedia: LaTeX") +(addMimeType "Life Balance - Desktop Edition" "application/vnd.llamagraphics.life-balance.desktop" '(lbd) "IANA: Life Balance") +(addMimeType "Life Balance - Exchange Format" "application/vnd.llamagraphics.life-balance.exchange+xml" '(lbe) "IANA: Life Balance") +(addMimeType "Lightspeed Audio Lab" "application/vnd.jam" '(jam) "IANA: Lightspeed Audio Lab") +(addMimeType "Lotus 1-2-3" "application/vnd.lotus-1-2-3" '(123) "IANA: Lotus 1-2-3") +(addMimeType "Lotus Approach" "application/vnd.lotus-approach" '(apr) "IANA: Lotus Approach") +(addMimeType "Lotus Freelance" "application/vnd.lotus-freelance" '(pre) "IANA: Lotus Freelance") +(addMimeType "Lotus Notes" "application/vnd.lotus-notes" '(nsf) "IANA: Lotus Notes") +(addMimeType "Lotus Organizer" "application/vnd.lotus-organizer" '(org) "IANA: Lotus Organizer") +(addMimeType "Lotus Screencam" "application/vnd.lotus-screencam" '(scm) "IANA: Lotus Screencam") +(addMimeType "Lotus Wordpro" "application/vnd.lotus-wordpro" '(lwp) "IANA: Lotus Wordpro") +(addMimeType "Lucent Voice" "audio/vnd.lucent.voice" '(lvp) "IANA: Lucent Voice") +(addMimeType "M3U (Multimedia Playlist)" "audio/x-mpegurl" '(m3u) "Wikipedia: M3U") +(addMimeType "M4v" "video/x-m4v" '(m4v) "Wikipedia: M4v") +(addMimeType "Macintosh BinHex 4.0" "application/mac-binhex40" '(hqx) "MacMIME") +(addMimeType "MacPorts Port System" "application/vnd.macports.portpkg" '(portpkg) "IANA: MacPorts Port System") +(addMimeType "MapGuide DBXML" "application/vnd.osgeo.mapguide.package" '(mgp) "IANA: MapGuide DBXML") +(addMimeType "MARC Formats" "application/marc" '(mrc) "RFC 2220") +(addMimeType "MARC21 XML Schema" "application/marcxml+xml" '(mrcx) "RFC 6207") +(addMimeType "Material Exchange Format" "application/mxf" '(mxf) "RFC 4539") +(addMimeType "Mathematica Notebook Player" "application/vnd.wolfram.player" '(nbp) "IANA: Mathematica Notebook Player") +(addMimeType "Mathematica Notebooks" "application/mathematica" '(ma) "IANA - Mathematica") +(addMimeType "Mathematical Markup Language" "application/mathml+xml" '(mathml) "W3C Math Home") +(addMimeType "Mbox database files" "application/mbox" '(mbox) "RFC 4155") +(addMimeType "MedCalc" "application/vnd.medcalcdata" '(mc1) "IANA: MedCalc") +(addMimeType "Media Server Control Markup Language" "application/mediaservercontrol+xml" '(mscml) "RFC 5022") +(addMimeType "MediaRemote" "application/vnd.mediastation.cdkey" '(cdkey) "IANA: MediaRemote") +(addMimeType "Medical Waveform Encoding Format" "application/vnd.mfer" '(mwf) "IANA: Medical Waveform Encoding Format") +(addMimeType "Melody Format for Mobile Platform" "application/vnd.mfmp" '(mfm) "IANA: Melody Format for Mobile Platform") +(addMimeType "Mesh Data Type" "model/mesh" '(msh) "RFC 2077") +(addMimeType "Metadata Authority Description Schema" "application/mads+xml" '(mads) "RFC 6207") +(addMimeType "Metadata Encoding and Transmission Standard" "application/mets+xml" '(mets) "RFC 6207") +(addMimeType "Metadata Object Description Schema" "application/mods+xml" '(mods) "RFC 6207") +(addMimeType "Metalink" "application/metalink4+xml" '(meta4) "Wikipedia: Metalink") +(addMimeType "Micro CADAM Helix D&D" "application/vnd.mcd" '(mcd) "IANA: Micro CADAM Helix D&D") +(addMimeType "Micrografx" "application/vnd.micrografx.flo" '(flo) "IANA: Micrografx") +(addMimeType "Micrografx iGrafx Professional" "application/vnd.micrografx.igx" '(igx) "IANA: Micrografx") +(addMimeType "MICROSEC e-Szign?" "application/vnd.eszigno3+xml" '(es3) "IANA: MICROSEC e-Szign?") +(addMimeType "Microsoft Access" "application/x-msaccess" '(mdb) "Wikipedia: Microsoft Access") +(addMimeType "Microsoft Advanced Systems Format (ASF)" "video/x-ms-asf" '(asf) "Wikipedia: Advanced Systems Format (ASF)") +(addMimeType "Microsoft Application" "application/x-msdownload" '(exe) "Wikipedia: EXE") +(addMimeType "Microsoft Artgalry" "application/vnd.ms-artgalry" '(cil) "IANA: MS Artgalry") +(addMimeType "Microsoft Cabinet File" "application/vnd.ms-cab-compressed" '(cab) "IANA: MS Cabinet File") +(addMimeType "Microsoft Class Server" "application/vnd.ms-ims" '(ims) "IANA: MS Class Server") +(addMimeType "Microsoft ClickOnce" "application/x-ms-application" '(application) "Wikipedia: ClickOnce") +(addMimeType "Microsoft Clipboard Clip" "application/x-msclip" '(clp) "Wikipedia: Clipboard") +(addMimeType "Microsoft Document Imaging Format" "image/vnd.ms-modi" '(mdi) "Wikipedia: Microsoft Document Image Format") +(addMimeType "Microsoft Embedded OpenType" "application/vnd.ms-fontobject" '(eot) "IANA: MS Embedded OpenType") +(addMimeType "Microsoft Excel" "application/vnd.ms-excel" '(xls) "IANA: MS Excel") +(addMimeType "Microsoft Excel - Add-In File" "application/vnd.ms-excel.addin.macroenabled.12" '(xlam) "IANA: MS Excel") +(addMimeType "Microsoft Excel - Binary Workbook" "application/vnd.ms-excel.sheet.binary.macroenabled.12" '(xlsb) "IANA: MS Excel") +(addMimeType "Microsoft Excel - Macro-Enabled Template File" "application/vnd.ms-excel.template.macroenabled.12" '(xltm) "IANA: MS Excel") +(addMimeType "Microsoft Excel - Macro-Enabled Workbook" "application/vnd.ms-excel.sheet.macroenabled.12" '(xlsm) "IANA: MS Excel") +(addMimeType "Microsoft Html Help File" "application/vnd.ms-htmlhelp" '(chm) "IANA:MS Html Help File") +(addMimeType "Microsoft Information Card" "application/x-mscardfile" '(crd) "Wikipedia: Information Card") +(addMimeType "Microsoft Learning Resource Module" "application/vnd.ms-lrm" '(lrm) "IANA: MS Learning Resource Module") +(addMimeType "Microsoft MediaView" "application/x-msmediaview" '(mvb) "Windows Help") +(addMimeType "Microsoft Money" "application/x-msmoney" '(mny) "Wikipedia: Microsoft Money") +(addMimeType "Microsoft Office - OOXML - Presentation" "application/vnd.openxmlformats-officedocument.presentationml.presentation" '(pptx) "IANA: OOXML - Presentation") +(addMimeType "Microsoft Office - OOXML - Presentation (Slide)" "application/vnd.openxmlformats-officedocument.presentationml.slide" '(sldx) "IANA: OOXML - Presentation") +(addMimeType "Microsoft Office - OOXML - Presentation (Slideshow)" "application/vnd.openxmlformats-officedocument.presentationml.slideshow" '(ppsx) "IANA: OOXML - Presentation") +(addMimeType "Microsoft Office - OOXML - Presentation Template" "application/vnd.openxmlformats-officedocument.presentationml.template" '(potx) "IANA: OOXML - Presentation Template") +(addMimeType "Microsoft Office - OOXML - Spreadsheet" "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" '(xlsx) "IANA: OOXML - Spreadsheet") +(addMimeType "Microsoft Office - OOXML - Spreadsheet Template" "application/vnd.openxmlformats-officedocument.spreadsheetml.template" '(xltx) "IANA: OOXML - Spreadsheet Template") +(addMimeType "Microsoft Office - OOXML - Word Document" "application/vnd.openxmlformats-officedocument.wordprocessingml.document" '(docx) "IANA: OOXML - Word Document") +(addMimeType "Microsoft Office - OOXML - Word Document Template" "application/vnd.openxmlformats-officedocument.wordprocessingml.template" '(dotx) "IANA: OOXML - Word Document Template") +(addMimeType "Microsoft Office Binder" "application/x-msbinder" '(obd) "Wikipedia: Microsoft Shared Tools") +(addMimeType "Microsoft Office System Release Theme" "application/vnd.ms-officetheme" '(thmx) "IANA: MS Office System Release Theme") +(addMimeType "Microsoft OneNote" "application/onenote" '(onetoc) "MS OneNote 2010") +(addMimeType "Microsoft PlayReady Ecosystem" "audio/vnd.ms-playready.media.pya" '(pya) "IANA: Microsoft PlayReady Ecosystem") +(addMimeType "Microsoft PlayReady Ecosystem Video" "video/vnd.ms-playready.media.pyv" '(pyv) "IANA: Microsoft PlayReady Ecosystem") +(addMimeType "Microsoft PowerPoint" "application/vnd.ms-powerpoint" '(ppt) "IANA: MS PowerPoint") +(addMimeType "Microsoft PowerPoint - Add-in file" "application/vnd.ms-powerpoint.addin.macroenabled.12" '(ppam) "IANA: MS PowerPoint") +(addMimeType "Microsoft PowerPoint - Macro-Enabled Open XML Slide" "application/vnd.ms-powerpoint.slide.macroenabled.12" '(sldm) "IANA: MS PowerPoint") +(addMimeType "Microsoft PowerPoint - Macro-Enabled Presentation File" "application/vnd.ms-powerpoint.presentation.macroenabled.12" '(pptm) "IANA: MS PowerPoint") +(addMimeType "Microsoft PowerPoint - Macro-Enabled Slide Show File" "application/vnd.ms-powerpoint.slideshow.macroenabled.12" '(ppsm) "IANA: MS PowerPoint") +(addMimeType "Microsoft PowerPoint - Macro-Enabled Template File" "application/vnd.ms-powerpoint.template.macroenabled.12" '(potm) "IANA: MS PowerPoint") +(addMimeType "Microsoft Project" "application/vnd.ms-project" '(mpp) "IANA: MS PowerPoint") +(addMimeType "Microsoft Publisher" "application/x-mspublisher" '(pub) "Wikipedia: Microsoft Publisher") +(addMimeType "Microsoft Schedule+" "application/x-msschedule" '(scd) "Wikipedia: Microsoft Schedule Plus") +(addMimeType "Microsoft Silverlight" "application/x-silverlight-app" '(xap) "Wikipedia: Silverlight") +(addMimeType "Microsoft Trust UI Provider - Certificate Trust Link" "application/vnd.ms-pki.stl" '(stl) "IANA: MS Trust UI Provider") +(addMimeType "Microsoft Trust UI Provider - Security Catalog" "application/vnd.ms-pki.seccat" '(cat) "IANA: MS Trust UI Provider") +(addMimeType "Microsoft Visio" "application/vnd.visio" '(vsd) "IANA: Visio") +(addMimeType "Microsoft Visio 2013" "application/vnd.visio2013" '(vsdx) "IANA: Visio") +(addMimeType "Microsoft Windows Media" "video/x-ms-wm" '(wm) "Wikipedia: Advanced Systems Format (ASF)") +(addMimeType "Microsoft Windows Media Audio" "audio/x-ms-wma" '(wma) "Wikipedia: Windows Media Audio") +(addMimeType "Microsoft Windows Media Audio Redirector" "audio/x-ms-wax" '(wax) "Windows Media Metafiles") +(addMimeType "Microsoft Windows Media Audio/Video Playlist" "video/x-ms-wmx" '(wmx) "Wikipedia: Advanced Systems Format (ASF)") +(addMimeType "Microsoft Windows Media Player Download Package" "application/x-ms-wmd" '(wmd) "Wikipedia: Windows Media Player") +(addMimeType "Microsoft Windows Media Player Playlist" "application/vnd.ms-wpl" '(wpl) "IANA: MS Windows Media Player Playlist") +(addMimeType "Microsoft Windows Media Player Skin Package" "application/x-ms-wmz" '(wmz) "Wikipedia: Windows Media Player") +(addMimeType "Microsoft Windows Media Video" "video/x-ms-wmv" '(wmv) "Wikipedia: Advanced Systems Format (ASF)") +(addMimeType "Microsoft Windows Media Video Playlist" "video/x-ms-wvx" '(wvx) "Wikipedia: Advanced Systems Format (ASF)") +(addMimeType "Microsoft Windows Metafile" "application/x-msmetafile" '(wmf) "Wikipedia: Windows Metafile") +(addMimeType "Microsoft Windows Terminal Services" "application/x-msterminal" '(trm) "Wikipedia: Terminal Server") +(addMimeType "Microsoft Word" "application/msword" '(doc) "Wikipedia: Microsoft Word") +(addMimeType "Microsoft Word - Macro-Enabled Document" "application/vnd.ms-word.document.macroenabled.12" '(docm) "IANA: MS Word") +(addMimeType "Microsoft Word - Macro-Enabled Template" "application/vnd.ms-word.template.macroenabled.12" '(dotm) "IANA: MS Word") +(addMimeType "Microsoft Wordpad" "application/x-mswrite" '(wri) "Wikipedia: Wordpad") +(addMimeType "Microsoft Works" "application/vnd.ms-works" '(wps) "IANA: MS Works") +(addMimeType "Microsoft XAML Browser Application" "application/x-ms-xbap" '(xbap) "Wikipedia: XAML Browser") +(addMimeType "Microsoft XML Paper Specification" "application/vnd.ms-xpsdocument" '(xps) "IANA: MS XML Paper Specification") +(addMimeType "MIDI" "audio/midi" '(midi) "Wikipedia: MIDI") +(addMimeType "MIDI - Musical Instrument Digital Interface" "audio/midi" '(mid) "Wikipedia: MIDI") +(addMimeType "MiniPay" "application/vnd.ibm.minipay" '(mpy) "IANA: MiniPay") +(addMimeType "MO:DCA-P" "application/vnd.ibm.modcap" '(afp) "IANA: MO:DCA-P") +(addMimeType "Mobile Information Device Profile" "application/vnd.jcp.javame.midlet-rms" '(rms) "IANA: Mobile Information Device Profile") +(addMimeType "MobileTV" "application/vnd.tmobile-livetv" '(tmo) "IANA: MobileTV") +(addMimeType "Mobipocket" "application/x-mobipocket-ebook" '(prc) "Wikipedia: Mobipocket") +(addMimeType "Mobius Management Systems - Basket file" "application/vnd.mobius.mbk" '(mbk) "IANA: Mobius Management Systems") +(addMimeType "Mobius Management Systems - Distribution Database" "application/vnd.mobius.dis" '(dis) "IANA: Mobius Management Systems") +(addMimeType "Mobius Management Systems - Policy Definition Language File" "application/vnd.mobius.plc" '(plc) "IANA: Mobius Management Systems") +(addMimeType "Mobius Management Systems - Query File" "application/vnd.mobius.mqy" '(mqy) "IANA: Mobius Management Systems") +(addMimeType "Mobius Management Systems - Script Language" "application/vnd.mobius.msl" '(msl) "IANA: Mobius Management Systems") +(addMimeType "Mobius Management Systems - Topic Index File" "application/vnd.mobius.txf" '(txf) "IANA: Mobius Management Systems") +(addMimeType "Mobius Management Systems - UniversalArchive" "application/vnd.mobius.daf" '(daf) "IANA: Mobius Management Systems") +(addMimeType "mod_fly / fly.cgi" "text/vnd.fly" '(fly) "IANA: Fly") +(addMimeType "Mophun Certificate" "application/vnd.mophun.certificate" '(mpc) "IANA: Mophun Certificate") +(addMimeType "Mophun VM" "application/vnd.mophun.application" '(mpn) "IANA: Mophun VM") +(addMimeType "Motion JPEG 2000" "video/mj2" '(mj2) "IANA: MJ2") +(addMimeType "MPEG Audio" "audio/mpeg" '(mpga) "Wikipedia: MPGA") +(addMimeType "MPEG Transport Stream" "video/mp2t" '(ts) "Wikipedia: MPEG Transport Stream") +(addMimeType "MPEG Url" "video/vnd.mpegurl" '(mxu) "IANA: MPEG Url") +(addMimeType "MPEG Video" "video/mpeg" '(mpeg) "Wikipedia: MPEG") +(addMimeType "MPEG-21" "application/mp21" '(m21) "Wikipedia: MPEG-21") +(addMimeType "MPEG-4 Audio" "audio/mp4" '(mp4a) "Wikipedia: MP4A") +(addMimeType "MPEG-4 Video" "video/mp4" '(mp4) "Wikipedia: MP4") +(addMimeType "MPEG4" "application/mp4" '(mp4) "RFC 4337") +(addMimeType "Multimedia Playlist Unicode" "application/vnd.apple.mpegurl" '(m3u8) "Wikipedia: M3U") +(addMimeType "MUsical Score Interpreted Code Invented for the ASCII designation of Notation" "application/vnd.musician" '(mus) "IANA: MUSICIAN") +(addMimeType "Muvee Automatic Video Editing" "application/vnd.muvee.style" '(msty) "IANA: Muvee") +(addMimeType "MXML" "application/xv+xml" '(mxml) "Wikipedia: MXML") +(addMimeType "N-Gage Game Data" "application/vnd.nokia.n-gage.data" '(ngdat) "IANA: N-Gage Game Data") +(addMimeType "N-Gage Game Installer" "application/vnd.nokia.n-gage.symbian.install" '(n-gage) "IANA: N-Gage Game Installer") +(addMimeType "Navigation Control file for XML (for ePub)" "application/x-dtbncx+xml" '(ncx) "Wikipedia: EPUB") +(addMimeType "Network Common Data Form (NetCDF)" "application/x-netcdf" '(nc) "Wikipedia: NetCDF") +(addMimeType "neuroLanguage" "application/vnd.neurolanguage.nlu" '(nlu) "IANA: neuroLanguage") +(addMimeType "New Moon Liftoff/DNA" "application/vnd.dna" '(dna) "IANA: New Moon Liftoff/DNA") +(addMimeType "NobleNet Directory" "application/vnd.noblenet-directory" '(nnd) "IANA: NobleNet Directory") +(addMimeType "NobleNet Sealer" "application/vnd.noblenet-sealer" '(nns) "IANA: NobleNet Sealer") +(addMimeType "NobleNet Web" "application/vnd.noblenet-web" '(nnw) "IANA: NobleNet Web") +(addMimeType "Nokia Radio Application - Preset" "application/vnd.nokia.radio-preset" '(rpst) "IANA: Nokia Radio Application") +(addMimeType "Nokia Radio Application - Preset" "application/vnd.nokia.radio-presets" '(rpss) "IANA: Nokia Radio Application") +(addMimeType "Notation3" "text/n3" '(n3) "Wikipedia: Notation3") +(addMimeType "Novadigm's RADIA and EDM products" "application/vnd.novadigm.edm" '(edm) "IANA: Novadigm's RADIA and EDM products") +(addMimeType "Novadigm's RADIA and EDM products" "application/vnd.novadigm.edx" '(edx) "IANA: Novadigm's RADIA and EDM products") +(addMimeType "Novadigm's RADIA and EDM products" "application/vnd.novadigm.ext" '(ext) "IANA: Novadigm's RADIA and EDM products") +(addMimeType "NpGraphIt" "application/vnd.flographit" '(gph) "IANA: FloGraphIt") +(addMimeType "Nuera ECELP 4800" "audio/vnd.nuera.ecelp4800" '(ecelp4800) "IANA: ECELP 4800") +(addMimeType "Nuera ECELP 7470" "audio/vnd.nuera.ecelp7470" '(ecelp7470) "IANA: ECELP 7470") +(addMimeType "Nuera ECELP 9600" "audio/vnd.nuera.ecelp9600" '(ecelp9600) "IANA: ECELP 9600") +(addMimeType "Office Document Architecture" "application/oda" '(oda) "RFC 2161") +(addMimeType "Ogg" "application/ogg" '(ogx) "Wikipedia: Ogg") +(addMimeType "Ogg Audio" "audio/ogg" '(oga) "Wikipedia: Ogg") +(addMimeType "Ogg Video" "video/ogg" '(ogv) "Wikipedia: Ogg") +(addMimeType "OMA Download Agents" "application/vnd.oma.dd2+xml" '(dd2) "IANA: OMA Download Agents") +(addMimeType "Open Document Text Web" "application/vnd.oasis.opendocument.text-web" '(oth) "IANA: OpenDocument Text Web") +(addMimeType "Open eBook Publication Structure" "application/oebps-package+xml" '(opf) "Wikipedia: Open eBook") +(addMimeType "Open Financial Exchange" "application/vnd.intu.qbo" '(qbo) "IANA: Open Financial Exchange") +(addMimeType "Open Office Extension" "application/vnd.openofficeorg.extension" '(oxt) "IANA: Open Office Extension") +(addMimeType "Open Score Format" "application/vnd.yamaha.openscoreformat" '(osf) "IANA: Open Score Format") +(addMimeType "Open Web Media Project - Audio" "audio/webm" '(weba) "WebM Project") +(addMimeType "Open Web Media Project - Video" "video/webm" '(webm) "WebM Project") +(addMimeType "OpenDocument Chart" "application/vnd.oasis.opendocument.chart" '(odc) "IANA: OpenDocument Chart") +(addMimeType "OpenDocument Chart Template" "application/vnd.oasis.opendocument.chart-template" '(otc) "IANA: OpenDocument Chart Template") +(addMimeType "OpenDocument Database" "application/vnd.oasis.opendocument.database" '(odb) "IANA: OpenDocument Database") +(addMimeType "OpenDocument Formula" "application/vnd.oasis.opendocument.formula" '(odf) "IANA: OpenDocument Formula") +(addMimeType "OpenDocument Formula Template" "application/vnd.oasis.opendocument.formula-template" '(odft) "IANA: OpenDocument Formula Template") +(addMimeType "OpenDocument Graphics" "application/vnd.oasis.opendocument.graphics" '(odg) "IANA: OpenDocument Graphics") +(addMimeType "OpenDocument Graphics Template" "application/vnd.oasis.opendocument.graphics-template" '(otg) "IANA: OpenDocument Graphics Template") +(addMimeType "OpenDocument Image" "application/vnd.oasis.opendocument.image" '(odi) "IANA: OpenDocument Image") +(addMimeType "OpenDocument Image Template" "application/vnd.oasis.opendocument.image-template" '(oti) "IANA: OpenDocument Image Template") +(addMimeType "OpenDocument Presentation" "application/vnd.oasis.opendocument.presentation" '(odp) "IANA: OpenDocument Presentation") +(addMimeType "OpenDocument Presentation Template" "application/vnd.oasis.opendocument.presentation-template" '(otp) "IANA: OpenDocument Presentation Template") +(addMimeType "OpenDocument Spreadsheet" "application/vnd.oasis.opendocument.spreadsheet" '(ods) "IANA: OpenDocument Spreadsheet") +(addMimeType "OpenDocument Spreadsheet Template" "application/vnd.oasis.opendocument.spreadsheet-template" '(ots) "IANA: OpenDocument Spreadsheet Template") +(addMimeType "OpenDocument Text" "application/vnd.oasis.opendocument.text" '(odt) "IANA: OpenDocument Text") +(addMimeType "OpenDocument Text Master" "application/vnd.oasis.opendocument.text-master" '(odm) "IANA: OpenDocument Text Master") +(addMimeType "OpenDocument Text Template" "application/vnd.oasis.opendocument.text-template" '(ott) "IANA: OpenDocument Text Template") +(addMimeType "OpenGL Textures (KTX)" "image/ktx" '(ktx) "KTX File Format") +(addMimeType "OpenOffice - Calc (Spreadsheet)" "application/vnd.sun.xml.calc" '(sxc) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Calc Template (Spreadsheet)" "application/vnd.sun.xml.calc.template" '(stc) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Draw (Graphics)" "application/vnd.sun.xml.draw" '(sxd) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Draw Template (Graphics)" "application/vnd.sun.xml.draw.template" '(std) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Impress (Presentation)" "application/vnd.sun.xml.impress" '(sxi) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Impress Template (Presentation)" "application/vnd.sun.xml.impress.template" '(sti) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Math (Formula)" "application/vnd.sun.xml.math" '(sxm) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Writer (Text - HTML)" "application/vnd.sun.xml.writer" '(sxw) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Writer (Text - HTML)" "application/vnd.sun.xml.writer.global" '(sxg) "Wikipedia: OpenOffice") +(addMimeType "OpenOffice - Writer Template (Text - HTML)" "application/vnd.sun.xml.writer.template" '(stw) "Wikipedia: OpenOffice") +(addMimeType "OpenType Font File" "application/x-font-otf" '(otf) "OpenType Font File") +(addMimeType "Opus Audio" "audio/opus" '(opus) "Wikipedia: Opus Audio") +(addMimeType "OSFPVG" "application/vnd.yamaha.openscoreformat.osfpvg+xml" '(osfpvg) "IANA: OSFPVG") +(addMimeType "OSGi Deployment Package" "application/vnd.osgi.dp" '(dp) "IANA: OSGi Deployment Package") +(addMimeType "PalmOS Data" "application/vnd.palm" '(pdb) "IANA: PalmOS Data") +(addMimeType "Pascal Source File" "text/x-pascal" '(p) "Wikipedia: Pascal") +(addMimeType "PawaaFILE" "application/vnd.pawaafile" '(paw) "IANA: PawaaFILE") +(addMimeType "PCL 6 Enhanced (Formely PCL XL)" "application/vnd.hp-pclxl" '(pclxl) "IANA: HP PCL XL") +(addMimeType "Pcsel eFIF File" "application/vnd.picsel" '(efif) "IANA: Picsel eFIF File") +(addMimeType "PCX Image" "image/x-pcx" '(pcx) "Wikipedia: PCX") +(addMimeType "Photoshop Document" "image/vnd.adobe.photoshop" '(psd) "Wikipedia: Photoshop Document") +(addMimeType "PICSRules" "application/pics-rules" '(prf) "W3C PICSRules") +(addMimeType "PICT Image" "image/x-pict" '(pic) "Wikipedia: PICT") +(addMimeType "pIRCh" "application/x-chat" '(chat) "Wikipedia: pIRCh") +(addMimeType "PKCS #10 - Certification Request Standard" "application/pkcs10" '(p10) "RFC 2986") +(addMimeType "PKCS #12 - Personal Information Exchange Syntax Standard" "application/x-pkcs12" '(p12) "RFC 2986") +(addMimeType "PKCS #7 - Cryptographic Message Syntax Standard" "application/pkcs7-mime" '(p7m) "RFC 2315") +(addMimeType "PKCS #7 - Cryptographic Message Syntax Standard" "application/pkcs7-signature" '(p7s) "RFC 2315") +(addMimeType "PKCS #7 - Cryptographic Message Syntax Standard (Certificate Request Response)" "application/x-pkcs7-certreqresp" '(p7r) "RFC 2986") +(addMimeType "PKCS #7 - Cryptographic Message Syntax Standard (Certificates)" "application/x-pkcs7-certificates" '(p7b) "RFC 2986") +(addMimeType "PKCS #8 - Private-Key Information Syntax Standard" "application/pkcs8" '(p8) "RFC 5208") +(addMimeType "PocketLearn Viewers" "application/vnd.pocketlearn" '(plf) "IANA: PocketLearn Viewers") +(addMimeType "Portable Anymap Image" "image/x-portable-anymap" '(pnm) "Wikipedia: Netpbm Format") +(addMimeType "Portable Bitmap Format" "image/x-portable-bitmap" '(pbm) "Wikipedia: Netpbm Format") +(addMimeType "Portable Compiled Format" "application/x-font-pcf" '(pcf) "Wikipedia: Portable Compiled Format") +(addMimeType "Portable Font Resource" "application/font-tdpfr" '(pfr) "RFC 3073") +(addMimeType "Portable Game Notation (Chess Games)" "application/x-chess-pgn" '(pgn) "Wikipedia: Portable Game Notationb") +(addMimeType "Portable Graymap Format" "image/x-portable-graymap" '(pgm) "Wikipedia: Netpbm Format") +(addMimeType "Portable Network Graphics (PNG)" "image/png" '(png) "RFC 2083") +(addMimeType "Portable Network Graphics (PNG) (Citrix client)" "image/x-citrix-png" '(png) "RFC 2083") +(addMimeType "Portable Network Graphics (PNG) (x-token)" "image/x-png" '(png) "RFC 2083") +(addMimeType "Portable Pixmap Format" "image/x-portable-pixmap" '(ppm) "Wikipedia: Netpbm Format") +(addMimeType "Portable Symmetric Key Container" "application/pskc+xml" '(pskcxml) "RFC 6030") +(addMimeType "PosML" "application/vnd.ctc-posml" '(pml) "IANA: PosML") +(addMimeType "PostScript" "application/postscript" '(ai) "Wikipedia: PostScript") +(addMimeType "PostScript Fonts" "application/x-font-type1" '(pfa) "Wikipedia: PostScript Fonts") +(addMimeType "PowerBuilder" "application/vnd.powerbuilder6" '(pbd) "IANA: PowerBuilder") +(addMimeType "Pretty Good Privacy" "application/pgp-encrypted" '(pgp) "RFC 2015") +(addMimeType "Pretty Good Privacy - Signature" "application/pgp-signature" '(pgp) "RFC 2015") +(addMimeType "Preview Systems ZipLock/VBox" "application/vnd.previewsystems.box" '(box) "IANA: Preview Systems ZipLock/Vbox") +(addMimeType "Princeton Video Image" "application/vnd.pvi.ptid1" '(ptid) "IANA: Princeton Video Image") +(addMimeType "Pronunciation Lexicon Specification" "application/pls+xml" '(pls) "RFC 4267") +(addMimeType "Proprietary P&G Standard Reporting System" "application/vnd.pg.format" '(str) "IANA: Proprietary P&G Standard Reporting System") +(addMimeType "Proprietary P&G Standard Reporting System" "application/vnd.pg.osasli" '(ei6) "IANA: Proprietary P&G Standard Reporting System") +(addMimeType "PRS Lines Tag" "text/prs.lines.tag" '(dsc) "IANA: PRS Lines Tag") +(addMimeType "PSF Fonts" "application/x-font-linux-psf" '(psf) "PSF Fonts") +(addMimeType "PubliShare Objects" "application/vnd.publishare-delta-tree" '(qps) "IANA: PubliShare Objects") +(addMimeType "Qualcomm's Plaza Mobile Internet" "application/vnd.pmi.widget" '(wg) "IANA: Qualcomm's Plaza Mobile Internet") +(addMimeType "QuarkXpress" "application/vnd.quark.quarkxpress" '(qxd) "IANA: QuarkXPress") +(addMimeType "QUASS Stream Player" "application/vnd.epson.esf" '(esf) "IANA: QUASS Stream Player") +(addMimeType "QUASS Stream Player" "application/vnd.epson.msf" '(msf) "IANA: QUASS Stream Player") +(addMimeType "QUASS Stream Player" "application/vnd.epson.ssf" '(ssf) "IANA: QUASS Stream Player") +(addMimeType "QuickAnime Player" "application/vnd.epson.quickanime" '(qam) "IANA: QuickAnime Player") +(addMimeType "Quicken" "application/vnd.intu.qfx" '(qfx) "IANA: Quicken") +(addMimeType "Quicktime Video" "video/quicktime" '(qt) "Wikipedia: Quicktime") +(addMimeType "RAR Archive" "application/x-rar-compressed" '(rar) "Wikipedia: RAR") +(addMimeType "Real Audio Sound" "audio/x-pn-realaudio" '(ram) "Wikipedia: RealPlayer") +(addMimeType "Real Audio Sound" "audio/x-pn-realaudio-plugin" '(rmp) "Wikipedia: RealPlayer") +(addMimeType "Really Simple Discovery" "application/rsd+xml" '(rsd) "Wikipedia: Really Simple Discovery") +(addMimeType "RealMedia" "application/vnd.rn-realmedia" '(rm) "") +(addMimeType "RealVNC" "application/vnd.realvnc.bed" '(bed) "IANA: RealVNC") +(addMimeType "Recordare Applications" "application/vnd.recordare.musicxml" '(mxl) "IANA: Recordare Apps") +(addMimeType "Recordare Applications" "application/vnd.recordare.musicxml+xml" '(musicxml) "IANA: Recordare Apps") +(addMimeType "Relax NG Compact Syntax" "application/relax-ng-compact-syntax" '(rnc) "Relax NG") +(addMimeType "RemoteDocs R-Viewer" "application/vnd.data-vision.rdz" '(rdz) "IANA: Data-Vision") +(addMimeType "Resource Description Framework" "application/rdf+xml" '(rdf) "RFC 3870") +(addMimeType "RetroPlatform Player" "application/vnd.cloanto.rp9" '(rp9) "IANA: RetroPlatform Player") +(addMimeType "RhymBox" "application/vnd.jisp" '(jisp) "IANA: RhymBox") +(addMimeType "Rich Text Format" "application/rtf" '(rtf) "Wikipedia: Rich Text Format") +(addMimeType "Rich Text Format (RTF)" "text/richtext" '(rtx) "Wikipedia: Rich Text Format") +(addMimeType "ROUTE 66 Location Based Services" "application/vnd.route66.link66+xml" '(link66) "IANA: ROUTE 66") +(addMimeType "RSS - Really Simple Syndication" "application/rss+xml" '(rss xml) "Wikipedia: RSS") +(addMimeType "S Hexdump Format" "application/shf+xml" '(shf) "RFC 4194") +(addMimeType "SailingTracker" "application/vnd.sailingtracker.track" '(st) "IANA: SailingTracker") +(addMimeType "Scalable Vector Graphics (SVG)" "image/svg+xml" '(svg) "Wikipedia: SVG") +(addMimeType "ScheduleUs" "application/vnd.sus-calendar" '(sus) "IANA: ScheduleUs") +(addMimeType "Search/Retrieve via URL Response Format" "application/sru+xml" '(sru) "RFC 6207") +(addMimeType "Secure Electronic Transaction - Payment" "application/set-payment-initiation" '(setpay) "IANA: SET Payment") +(addMimeType "Secure Electronic Transaction - Registration" "application/set-registration-initiation" '(setreg) "IANA: SET Registration") +(addMimeType "Secured eMail" "application/vnd.sema" '(sema) "IANA: Secured eMail") +(addMimeType "Secured eMail" "application/vnd.semd" '(semd) "IANA: Secured eMail") +(addMimeType "Secured eMail" "application/vnd.semf" '(semf) "IANA: Secured eMail") +(addMimeType "SeeMail" "application/vnd.seemail" '(see) "IANA: SeeMail") +(addMimeType "Server Normal Format" "application/x-font-snf" '(snf) "Wikipedia: Server Normal Format") +(addMimeType "Server-Based Certificate Validation Protocol - Validation Policies - Request" "application/scvp-vp-request" '(spq) "RFC 5055") +(addMimeType "Server-Based Certificate Validation Protocol - Validation Policies - Response" "application/scvp-vp-response" '(spp) "RFC 5055") +(addMimeType "Server-Based Certificate Validation Protocol - Validation Request" "application/scvp-cv-request" '(scq) "RFC 5055") +(addMimeType "Server-Based Certificate Validation Protocol - Validation Response" "application/scvp-cv-response" '(scs) "RFC 5055") +(addMimeType "Session Description Protocol" "application/sdp" '(sdp) "RFC 2327") +(addMimeType "Setext" "text/x-setext" '(etx) "Wikipedia: Setext") +(addMimeType "SGI Movie" "video/x-sgi-movie" '(movie) "SGI Facts") +(addMimeType "Shana Informed Filler" "application/vnd.shana.informed.formdata" '(ifm) "IANA: Shana Informed Filler") +(addMimeType "Shana Informed Filler" "application/vnd.shana.informed.formtemplate" '(itp) "IANA: Shana Informed Filler") +(addMimeType "Shana Informed Filler" "application/vnd.shana.informed.interchange" '(iif) "IANA: Shana Informed Filler") +(addMimeType "Shana Informed Filler" "application/vnd.shana.informed.package" '(ipk) "IANA: Shana Informed Filler") +(addMimeType "Sharing Transaction Fraud Data" "application/thraud+xml" '(tfi) "RFC 5941") +(addMimeType "Shell Archive" "application/x-shar" '(shar) "Wikipedia: Shell Archie") +(addMimeType "Silicon Graphics RGB Bitmap" "image/x-rgb" '(rgb) "RGB Image Format") +(addMimeType "SimpleAnimeLite Player" "application/vnd.epson.salt" '(slt) "IANA: SimpleAnimeLite Player") +(addMimeType "Simply Accounting" "application/vnd.accpac.simply.aso" '(aso) "IANA: Simply Accounting") +(addMimeType "Simply Accounting - Data Import" "application/vnd.accpac.simply.imp" '(imp) "IANA: Simply Accounting") +(addMimeType "SimTech MindMapper" "application/vnd.simtech-mindmapper" '(twd) "IANA: SimTech MindMapper") +(addMimeType "Sixth Floor Media - CommonSpace" "application/vnd.commonspace" '(csp) "IANA: CommonSpace") +(addMimeType "SMAF Audio" "application/vnd.yamaha.smaf-audio" '(saf) "IANA: SMAF Audio") +(addMimeType "SMAF File" "application/vnd.smaf" '(mmf) "IANA: SMAF File") +(addMimeType "SMAF Phrase" "application/vnd.yamaha.smaf-phrase" '(spf) "IANA: SMAF Phrase") +(addMimeType "SMART Technologies Apps" "application/vnd.smart.teacher" '(teacher) "IANA: SMART Technologies Apps") +(addMimeType "SourceView Document" "application/vnd.svd" '(svd) "IANA: SourceView Document") +(addMimeType "SPARQL - Query" "application/sparql-query" '(rq) "W3C SPARQL") +(addMimeType "SPARQL - Results" "application/sparql-results+xml" '(srx) "W3C SPARQL") +(addMimeType "Speech Recognition Grammar Specification" "application/srgs" '(gram) "W3C Speech Grammar") +(addMimeType "Speech Recognition Grammar Specification - XML" "application/srgs+xml" '(grxml) "W3C Speech Grammar") +(addMimeType "Speech Synthesis Markup Language" "application/ssml+xml" '(ssml) "W3C Speech Synthesis") +(addMimeType "SSEYO Koan Play File" "application/vnd.koan" '(skp) "IANA: SSEYO Koan Play File") +(addMimeType "Standard Generalized Markup Language (SGML)" "text/sgml" '(sgml) "Wikipedia: SGML") +(addMimeType "StarOffice - Calc" "application/vnd.stardivision.calc" '(sdc) "") +(addMimeType "StarOffice - Draw" "application/vnd.stardivision.draw" '(sda) "") +(addMimeType "StarOffice - Impress" "application/vnd.stardivision.impress" '(sdd) "") +(addMimeType "StarOffice - Math" "application/vnd.stardivision.math" '(smf) "") +(addMimeType "StarOffice - Writer" "application/vnd.stardivision.writer" '(sdw) "") +(addMimeType "StarOffice - Writer (Global)" "application/vnd.stardivision.writer-global" '(sgl) "") +(addMimeType "StepMania" "application/vnd.stepmania.stepchart" '(sm) "IANA: StepMania") +(addMimeType "Stuffit Archive" "application/x-stuffit" '(sit) "Wikipedia: Stuffit") +(addMimeType "Stuffit Archive" "application/x-stuffitx" '(sitx) "Wikipedia: Stuffit") +(addMimeType "SudokuMagic" "application/vnd.solent.sdkm+xml" '(sdkm) "IANA: SudokuMagic") +(addMimeType "Sugar Linux Application Bundle" "application/vnd.olpc-sugar" '(xo) "IANA: Sugar Linux App Bundle") +(addMimeType "Sun Audio - Au file format" "audio/basic" '(au) "Wikipedia: Sun audio") +(addMimeType "SundaHus WQ" "application/vnd.wqd" '(wqd) "IANA: SundaHus WQ") +(addMimeType "Symbian Install Package" "application/vnd.symbian.install" '(sis) "IANA: Symbian Install") +(addMimeType "Synchronized Multimedia Integration Language" "application/smil+xml" '(smi) "RFC 4536") +(addMimeType "SyncML" "application/vnd.syncml+xml" '(xsm) "IANA: SyncML") +(addMimeType "SyncML - Device Management" "application/vnd.syncml.dm+wbxml" '(bdm) "IANA: SyncML") +(addMimeType "SyncML - Device Management" "application/vnd.syncml.dm+xml" '(xdm) "IANA: SyncML") +(addMimeType "System V Release 4 CPIO Archive" "application/x-sv4cpio" '(sv4cpio) "Wikipedia: pax") +(addMimeType "System V Release 4 CPIO Checksum Data" "application/x-sv4crc" '(sv4crc) "Wikipedia: pax") +(addMimeType "Systems Biology Markup Language" "application/sbml+xml" '(sbml) "RFC 3823") +(addMimeType "Tab Seperated Values" "text/tab-separated-values" '(tsv) "Wikipedia: TSV") +(addMimeType "Tagged Image File Format" "image/tiff" '(tiff) "Wikipedia: TIFF") +(addMimeType "Tao Intent" "application/vnd.tao.intent-module-archive" '(tao) "IANA: Tao Intent") +(addMimeType "Tar File (Tape Archive)" "application/x-tar" '(tar) "Wikipedia: Tar") +(addMimeType "Tcl Script" "application/x-tcl" '(tcl) "Wikipedia: Tcl") +(addMimeType "TeX" "application/x-tex" '(tex) "Wikipedia: TeX") +(addMimeType "TeX Font Metric" "application/x-tex-tfm" '(tfm) "Wikipedia: TeX Font Metric") +(addMimeType "Text Encoding and Interchange" "application/tei+xml" '(tei) "RFC 6129") +(addMimeType "Text File" "text/plain" '(txt) "Wikipedia: Text File") +(addMimeType "TIBCO Spotfire" "application/vnd.spotfire.dxp" '(dxp) "IANA: TIBCO Spotfire") +(addMimeType "TIBCO Spotfire" "application/vnd.spotfire.sfs" '(sfs) "IANA: TIBCO Spotfire") +(addMimeType "Time Stamped Data Envelope" "application/timestamped-data" '(tsd) "RFC 5955") +(addMimeType "TRI Systems Config" "application/vnd.trid.tpt" '(tpt) "IANA: TRI Systems") +(addMimeType "Triscape Map Explorer" "application/vnd.triscape.mxs" '(mxs) "IANA: Triscape Map Explorer") +(addMimeType "troff" "text/troff" '(t) "Wikipedia: troff") +(addMimeType "True BASIC" "application/vnd.trueapp" '(tra) "IANA: True BASIC") +(addMimeType "TrueType Font" "application/x-font-ttf" '(ttf) "Wikipedia: TrueType") +(addMimeType "Turtle (Terse RDF Triple Language)" "text/turtle" '(ttl) "Wikipedia: Turtle") +(addMimeType "UMAJIN" "application/vnd.umajin" '(umj) "IANA: UMAJIN") +(addMimeType "Unique Object Markup Language" "application/vnd.uoml+xml" '(uoml) "IANA: UOML") +(addMimeType "Unity 3d" "application/vnd.unity" '(unityweb) "IANA: Unity 3d") +(addMimeType "Universal Forms Description Language" "application/vnd.ufdl" '(ufd) "IANA: Universal Forms Description Language") +(addMimeType "URI Resolution Services" "text/uri-list" '(uri) "RFC 2483") +(addMimeType "User Interface Quartz - Theme (Symbian)" "application/vnd.uiq.theme" '(utz) "IANA: User Interface Quartz") +(addMimeType "Ustar (Uniform Standard Tape Archive)" "application/x-ustar" '(ustar) "Wikipedia: Ustar") +(addMimeType "UUEncode" "text/x-uuencode" '(uu) "Wikipedia: UUEncode") +(addMimeType "vCalendar" "text/x-vcalendar" '(vcs) "Wikipedia: vCalendar") +(addMimeType "vCard" "text/x-vcard" '(vcf) "Wikipedia: vCard") +(addMimeType "Video CD" "application/x-cdlink" '(vcd) "Wikipedia: Video CD") +(addMimeType "Viewport+" "application/vnd.vsf" '(vsf) "IANA: Viewport+") +(addMimeType "Virtual Reality Modeling Language" "model/vrml" '(wrl) "Wikipedia: VRML") +(addMimeType "VirtualCatalog" "application/vnd.vcx" '(vcx) "IANA: VirtualCatalog") +(addMimeType "Virtue MTS" "model/vnd.mts" '(mts) "IANA: MTS") +(addMimeType "Virtue VTU" "model/vnd.vtu" '(vtu) "IANA: VTU") +(addMimeType "Visionary" "application/vnd.visionary" '(vis) "IANA: Visionary") +(addMimeType "Vivo" "video/vnd.vivo" '(viv) "IANA: Vivo") +(addMimeType "Voice Browser Call Control" "application/ccxml+xml," '(ccxml) "Voice Browser Call Control: CCXML Version 1.0") +(addMimeType "VoiceXML" "application/voicexml+xml" '(vxml) "RFC 4267") +(addMimeType "WAIS Source" "application/x-wais-source" '(src) "YoLinux") +(addMimeType "WAP Binary XML (WBXML)" "application/vnd.wap.wbxml" '(wbxml) "IANA: WBXML") +(addMimeType "WAP Bitamp (WBMP)" "image/vnd.wap.wbmp" '(wbmp) "IANA: WBMP") +(addMimeType "Waveform Audio File Format (WAV)" "audio/x-wav" '(wav) "Wikipedia: WAV") +(addMimeType "Web Distributed Authoring and Versioning" "application/davmount+xml" '(davmount) "RFC 4918") +(addMimeType "Web Open Font Format" "application/x-font-woff" '(woff) "Wikipedia: Web Open Font Format") +(addMimeType "Web Services Policy" "application/wspolicy+xml" '(wspolicy) "W3C Web Services Policy") +(addMimeType "WebP Image" "image/webp" '(webp) "Wikipedia: WebP") +(addMimeType "WebTurbo" "application/vnd.webturbo" '(wtb) "IANA: WebTurbo") +(addMimeType "Widget Packaging and XML Configuration" "application/widget" '(wgt) "W3C Widget Packaging and XML Configuration") +(addMimeType "WinHelp" "application/winhlp" '(hlp) "Wikipedia: WinHelp") +(addMimeType "Wireless Markup Language (WML)" "text/vnd.wap.wml" '(wml) "Wikipedia: WML") +(addMimeType "Wireless Markup Language Script (WMLScript)" "text/vnd.wap.wmlscript" '(wmls) "Wikipedia: WMLScript") +(addMimeType "WMLScript" "application/vnd.wap.wmlscriptc" '(wmlsc) "IANA: WMLScript") +(addMimeType "Wordperfect" "application/vnd.wordperfect" '(wpd) "IANA: Wordperfect") +(addMimeType "Worldtalk" "application/vnd.wt.stf" '(stf) "IANA: Worldtalk") +(addMimeType "WSDL - Web Services Description Language" "application/wsdl+xml" '(wsdl) "W3C Web Service Description Language") +(addMimeType "X BitMap" "image/x-xbitmap" '(xbm) "Wikipedia: X BitMap") +(addMimeType "X PixMap" "image/x-xpixmap" '(xpm) "Wikipedia: X PixMap") +(addMimeType "X Window Dump" "image/x-xwindowdump" '(xwd) "Wikipedia: X Window Dump") +(addMimeType "X.509 Certificate" "application/x-x509-ca-cert" '(der) "Wikipedia: X.509") +(addMimeType "Xfig" "application/x-xfig" '(fig) "Wikipedia: Xfig") +(addMimeType "XHTML - The Extensible HyperText Markup Language" "application/xhtml+xml" '(xhtml) "W3C XHTML") +(addMimeType "XML - Extensible Markup Language" "application/xml" '(xml) "W3C XML") +(addMimeType "XML Configuration Access Protocol - XCAP Diff" "application/xcap-diff+xml" '(xdf) "Wikipedia: XCAP") +(addMimeType "XML Encryption Syntax and Processing" "application/xenc+xml" '(xenc) "W3C XML Encryption Syntax and Processing") +(addMimeType "XML Patch Framework" "application/patch-ops-error+xml" '(xer) "RFC 5261") +(addMimeType "XML Resource Lists" "application/resource-lists+xml" '(rl) "RFC 4826") +(addMimeType "XML Resource Lists" "application/rls-services+xml" '(rs) "RFC 4826") +(addMimeType "XML Resource Lists Diff" "application/resource-lists-diff+xml" '(rld) "RFC 4826") +(addMimeType "XML Transformations" "application/xslt+xml" '(xslt) "W3C XSLT") +(addMimeType "XML-Binary Optimized Packaging" "application/xop+xml" '(xop) "W3C XOP") +(addMimeType "XPInstall - Mozilla" "application/x-xpinstall" '(xpi) "Wikipedia: XPI") +(addMimeType "XSPF - XML Shareable Playlist Format" "application/xspf+xml" '(xspf) "XML Shareable Playlist Format") +(addMimeType "XUL - XML User Interface Language" "application/vnd.mozilla.xul+xml" '(xul) "IANA: XUL") +(addMimeType "XYZ File Format" "chemical/x-xyz" '(xyz) "Wikipedia: XYZ File Format") +(addMimeType "YAML Ain't Markup Language / Yet Another Markup Language" "text/yaml" '(yaml) "YAML: YAML Ain't Markup Language") +(addMimeType "YANG Data Modeling Language" "application/yang" '(yang) "Wikipedia: YANG") +(addMimeType "YIN (YANG - XML)" "application/yin+xml" '(yin) "Wikipedia: YANG") +(addMimeType "Z.U.L. Geometry" "application/vnd.zul" '(zir) "IANA: Z.U.L.") +(addMimeType "Zip Archive" "application/zip" '(zip) "Wikipedia: Zip") +(addMimeType "ZVUE Media Manager" "application/vnd.handheld-entertainment+xml" '(zmm) "IANA: ZVUE Media Manager") +(addMimeType "Zzazz Deck" "application/vnd.zzazz.deck+xml" '(zaz) "IANA: Zzazz") + diff --git a/private/racket-webview-qt.rkt b/private/racket-webview-qt.rkt index 649520e..47a5c6d 100644 --- a/private/racket-webview-qt.rkt +++ b/private/racket-webview-qt.rkt @@ -24,6 +24,14 @@ rkt-webview-call-js rkt-webview-move rkt-webview-resize + rkt-webview-show + rkt-webview-hide + rkt-webview-show-normal + rkt-webview-maximize + rkt-webview-minimize + rkt-webview-window-state + rkt-webview-set-title! + rkt-webview-present rkt-webview-exit rkt-webview-valid? rkt-webview-open-devtools @@ -35,70 +43,95 @@ (define lib-type 'release) -(define-runtime-path lib-dir ".") -; (if (eq? (system-type 'os*) 'windows) -; "..\\lib" -; "../lib")) +(define os (system-type 'os*)) +(define supported-os '(windows linux)) -(define libname (let ((os (system-type 'os*))) - (cond ((eq? os 'windows) (format "rktwebview.dll")) - ((eq? os 'linux) (format "librktwebview.so")) - (else (error (format "OS ~a not supported" os))))) +(unless (ormap (λ (o) (eq? os o)) supported-os) + (error (format "OS currently not supported: ~a. Supported: ~a." os supported-os))) + +(define-runtime-path lib-dir "lib") + +(define libraries-to-preload + (cond + ([eq? os 'windows] + '(Qt6Core.dll + Qt6Positioning.dll + Qt6Gui.dll + Qt6Widgets.dll + Qt6Svg.dll + Qt6Network.dll + Qt6OpenGL.dll + Qt6PrintSupport.dll + Qt6Qml.dll + Qt6QmlModels.dll + Qt6QmlWorkerScript.dll + Qt6QmlMeta.dll + Qt6Quick.dll + Qt6QuickWidgets.dll + Qt6WebChannel.dll + Qt6WebEngineCore.dll + Qt6WebEngineWidgets.dll + )) + ([eq? os 'linux] + '()) + ) ) -;(set! libname "../rktwebview/build/Release/rktwebview.dll") -;(set! libname "../rktwebview/build/Release/librktwebview.so") -(if (eq? (system-type 'os*) 'windows) - (set! libname "..\\rktwebview_qt\\build\\Release\\rktwebview_qt.dll") - (set! libname "../rktwebview_qt/build/Release/librktwebview_qt.so")) -(set! libname "rktwebview_qt.dll") -(current-directory (build-path lib-dir "..\\rktwebview_qt\\build\\Release")) +(define ffi-library + (cond + ([eq? os 'windows] 'rktwebview_qt.dll) + ([eq? os 'linux] 'librktwebview_qt.so) + ) + ) -;(define webview-lib-file (normalize-path (build-path lib-dir libname))) - -(define webview-lib-file libname) -(displayln (format "~a - ~a" (current-directory) webview-lib-file)) +(define (libname lib-symbol) + (build-path lib-dir (symbol->string os) (symbol->string lib-symbol))) ; c:\qt\6.10.2\msvc2022_64\bin\windeployqt.exe rktwebview_qt_test.exe -(putenv "QT_PLUGIN_PATH" (path->string (current-directory))) -(putenv "QTWEBENGINEPROCESS_PATH" - "c:\\devel\\racket\\racket-webview\\rktwebview_qt\\build\\Release\\QtWebEngineProcess.exe") -(putenv "QTWEBENGINE_RESOURCES_PATH" - "c:\\devel\\racket\\racket-webview\\rktwebview_qt\\build\\Release\\resources") -(putenv "QTWEBENGINE_LOCALES_PATH" - "c:\\devel\\racket\\racket-webview\\rktwebview_qt\\build\\Release\\translations\\qtwebengine_locales") +(when (eq? os 'windows) + (putenv "QT_PLUGIN_PATH" + (path->string (build-path lib-dir (symbol->string os)))) + (putenv "QTWEBENGINEPROCESS_PATH" + (path->string (build-path lib-dir (symbol->string os) "QtWebEngineProcess.exe"))) + (putenv "QTWEBENGINE_RESOURCES_PATH" + (path->string (build-path lib-dir (symbol->string os) "resources"))) + (putenv "QTWEBENGINE_LOCALES_PATH" + (path->string (build-path lib-dir (symbol->string os) "translations" "qtwebengine_locales"))) + ) -(define libs '(Qt6Core.dll - Qt6Positioning.dll - ;Qt6Concurrent.dll - Qt6Gui.dll - Qt6Widgets.dll - ;qwindows.dll - Qt6Svg.dll - Qt6Network.dll - Qt6OpenGL.dll - ;Qt6OpenGLWidgets.dll - Qt6PrintSupport.dll - Qt6Qml.dll - ;Qt6Xml.dll - Qt6QmlModels.dll - Qt6QmlWorkerScript.dll - Qt6QmlMeta.dll - Qt6Quick.dll - Qt6QuickWidgets.dll - Qt6WebChannel.dll - Qt6WebEngineCore.dll - ;Qt6WebEngineQuick.dll - Qt6WebEngineWidgets.dll - )) -(for-each (λ (l) - (let ((lib (symbol->string l))) - (displayln (format "~a: ~a" lib (ffi-lib lib))))) - libs) +;;; Preload libraries + +(for-each (λ (lib-symbol) + (let ((load-lib (libname lib-symbol))) + (ffi-lib load-lib))) + libraries-to-preload) + +;;; Actual FFI integration + +(define webview-lib-file (libname ffi-library)) +(define webview-lib + (with-handlers ([exn:fail? + (λ (exp) + (cond + ([eq? os 'linux] + (error (format + (string-append "Cannot load ~a.\n" + "Make sure you installed Qt6on your system\n" + "e.g. on debian 'sudo apt install libqt6webenginewidgets6'\n" + "\n" + "Exception:\n\n~a") + ffi-library exp))) + (else (error + (format "Cannot load ~a for os ~a\n\nException:\n\n~a" + ffi-library os exp)))) + ) + ]) + (ffi-lib webview-lib-file))) -(define webview-lib (ffi-lib webview-lib-file)) (define-ffi-definer define-rktwebview webview-lib) +;;; Callbacks from the OS library + (define callback-box (box '())) (define (applier thunk) (thunk)) @@ -117,7 +150,19 @@ no_delegate_for_context = 5 move_failed = 12 resize_failed = 13 + ) ) + ) + +(define _rkt_window_state_t + (_enum '(invalid = -1 + normal = 0 + minimized = 1 + maximized = 2 + hidden = 3 + normal_active = 16 + maximized_active = 18 + ) ) ) @@ -170,7 +215,7 @@ ;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_open_devtools(int wv); (define-rktwebview rkt_webview_open_devtools - (_fun _int -> _int)) + (_fun _int -> _rkt_result_t)) ;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_event(rkt_event_t e); (define-rktwebview rkt_webview_destroy_event @@ -184,10 +229,41 @@ (define-rktwebview rkt_webview_resize (_fun _int _int _int -> _rkt_result_t)) +(define-syntax def-rkt-wv + (syntax-rules () + ((_ name) + (define-rktwebview name + (_fun _int -> _rkt_result_t))))) + +;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_hide(rktwebview_t w); +(def-rkt-wv rkt_webview_hide) + +;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show(rktwebview_t w); +(def-rkt-wv rkt_webview_show) + +;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show_normal(rktwebview_t w); +(def-rkt-wv rkt_webview_show_normal) + +;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_present(rktwebview_t w); +(def-rkt-wv rkt_webview_present) + +;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_maximize(rktwebview_t w); +(def-rkt-wv rkt_webview_maximize) + +;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_minimize(rktwebview_t w); +(def-rkt-wv rkt_webview_minimize) + ;RKTWEBVIEW_QT_EXPORT bool rkt_webview_valid(rktwebview_t wv); (define-rktwebview rkt_webview_valid (_fun _int -> _int)) +;RKTWEBVIEW_QT_EXPORT window_state_t rkt_webview_window_state(rktwebview_t w); +(define-rktwebview rkt_webview_window_state + (_fun _int -> _rkt_window_state_t)) + +;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_title(rktwebview_t wv, const char *title); +(define-rktwebview rkt_webview_set_title + (_fun _int _string/utf-8 -> _rkt_result_t)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Initialize and start library @@ -274,11 +350,14 @@ (define (rkt-webview-set-html! wv html) (rkt_webview_set_html (rkt-wv-win wv) html)) +(define (rkt-webview-set-title! wv title) + (rkt_webview_set_title (rkt-wv-win wv) title)) + (define (rkt-webview-run-js wv js) (rkt_webview_run_js (rkt-wv-win wv) js)) (define (rkt-webview-call-js wv js) - (let* ((r (rkt_webview_call_js (rkt-wv-win) js)) + (let* ((r (rkt_webview_call_js (rkt-wv-win wv) js)) (value (cast (rkt_js_result_t-value r) _pointer _string*/utf-8)) (result (rkt_js_result_t-result r))) (rkt_webview_destroy_js_result r) @@ -290,6 +369,20 @@ (define (rkt-webview-move wv x y) (rkt_webview_move (rkt-wv-win wv) x y)) +(define-syntax def-rkt-wrapper-wv + (syntax-rules () + ((_ name c-name) + (define (name wv) + (c-name (rkt-wv-win wv)))))) + +(def-rkt-wrapper-wv rkt-webview-show rkt_webview_show) +(def-rkt-wrapper-wv rkt-webview-hide rkt_webview_hide) +(def-rkt-wrapper-wv rkt-webview-show-normal rkt_webview_show_normal) +(def-rkt-wrapper-wv rkt-webview-minimize rkt_webview_minimize) +(def-rkt-wrapper-wv rkt-webview-maximize rkt_webview_maximize) +(def-rkt-wrapper-wv rkt-webview-present rkt_webview_present) +(def-rkt-wrapper-wv rkt-webview-window-state rkt_webview_window_state) + (define (rkt-webview-open-devtools wv) (rkt_webview_open_devtools (rkt-wv-win wv))) @@ -309,5 +402,10 @@ open-windows)) (stop-event-processing)) - + +(plumber-add-flush! (current-plumber) + (λ (handle) + (rkt-webview-exit))) + + diff --git a/private/racket-webview.rkt b/private/racket-webview.rkt index a11ec6d..8f3a686 100644 --- a/private/racket-webview.rkt +++ b/private/racket-webview.rkt @@ -2,6 +2,7 @@ (require "racket-webview-qt.rkt" "utils.rkt" + "mimetypes.rkt" web-server/servlet web-server/servlet-env web-server/http @@ -11,6 +12,9 @@ racket/string racket/path racket/port + racket/contract + xml + xml/xexpr json ) @@ -19,11 +23,32 @@ webview-close webview-run-js webview-call-js + webview-call-js-result? webview-move webview-resize + webview-show + webview-hide + webview-show-normal + webview-maximize + webview-minimize + webview-window-state webview-bind! - webview-standard-file-getter + webview-set-title! + webview-set-url! + webview-set-html! + + webview-set-innerHTML! + webview-set-value! + webview-value + webview-value/bool + webview-value/symbol + webview-value/number + webview-add-class! + webview-remove-class! + webview-set-style! + + webview-standard-file-getter ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -45,7 +70,8 @@ [window-nr #:mutable] [file-getter #:mutable] [boilerplate-js #:mutable] - [webserver-thread #:mutable])) + [webserver-thread #:mutable]) + #:transparent) (define (process-html wv-handle path out) (let ((html (file->string path)) @@ -59,7 +85,7 @@ (define (process-file wv-handle ext path out) (let ((content (file->bytes path))) - (write bytes out))) + (display content out))) (define (web-serve wv-handle req) (let* ((path (url->string (request-uri req))) @@ -71,6 +97,7 @@ ) (if (file-exists? file-to-serve) (response/output + #:mime-type (string->bytes/utf-8 (mimetype-for-ext ext)) (λ (out) (if (or (eq? ext 'html) (eq? ext 'htm)) (process-html wv-handle file-to-serve out) @@ -95,7 +122,8 @@ #:servlet-path "" #:stateless? #t ;#:launch-browser #f - #:servlet-regexp #rx"")))) + #:servlet-regexp #rx"") + ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -106,6 +134,41 @@ (let ((wv-d0 (with-input-from-string evt read-json))) wv-d0)) +(define (webview-call-js-result? x) + (if (and (list? x) (= (length x) 2)) + (and (symbol? (car x)) + (string? (cadr x))) + #f)) + + +(define-syntax with-id + (syntax-rules () + ((_ id el + (code ...)) + (string-append (format "{ let ~a = document.getElementById('~a');\n" 'el id) + (format code ...) + "\n}") + ) + ((_ id el + (code ...) -> retval) + (string-append (format "{ let ~a = document.getElementById('~a');\n" 'el id) + (format code ...) + (format "return ~a;\n" retval) + "}")) + ((_ id el -> retval) + (string-append (format "{ let ~a = document.getElementById('~a');\n" 'el id) + (format "return ~a;\n" retval) + "}")) + ) + ) + +(define-syntax with-selector + (syntax-rules () + ((_ selector func) + (format "return window.rkt_with_selector('~a', ~a)" + (esc-quote selector) + func)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Webview functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -130,30 +193,75 @@ (set! current-servlet-port (+ current-servlet-port 1)) h)) -(define (webview-devtools wv) +(define/contract (webview-devtools wv) + (-> wv? symbol?) (rkt-webview-open-devtools (wv-handle wv))) -(define (webview-move wv x y) +(define/contract (webview-move wv x y) + (-> wv? number? number? symbol?) (rkt-webview-move (wv-handle wv) x y)) -(define (webview-resize wv w h) +(define/contract (webview-resize wv w h) + (-> wv? number? number? symbol?) (rkt-webview-resize (wv-handle wv) w h)) -(define (webview-close wv) - (rkt-webview-close (wv-handle wv)) - (kill-thread (wv-webserver-thread wv)) +(define/contract (webview-set-html! wv html) + (-> wv? (or/c string? xexpr?) symbol?) + (if (string? html) + (rkt-webview-set-html! (wv-handle wv) html) + (rkt-webview-set-html! (wv-handle wv) (xexpr->string html)) + ) + ) + +(define/contract (webview-set-url! wv url) + (-> wv? (or/c string? url?) symbol?) + (if (url? url) + (rkt-webview-set-url! (wv-handle wv) (url->string url)) + (rkt-webview-set-url! (wv-handle wv) url) + ) +) + +(define-syntax def-win-func + (syntax-rules () + ((_ name name-to-wrap) + (define/contract (name wv) + (-> wv? symbol?) + (name-to-wrap (wv-handle wv)))))) + +(def-win-func webview-show rkt-webview-show) +(def-win-func webview-hide rkt-webview-hide) +(def-win-func webview-maximize rkt-webview-maximize) +(def-win-func webview-minimize rkt-webview-minimize) +(def-win-func webview-show-normal rkt-webview-show-normal) +(def-win-func webview-present rkt-webview-present) +(def-win-func webview-window-state rkt-webview-window-state) + +(define/contract (webview-set-title! wv title) + (-> wv? string? symbol?) + (rkt-webview-set-title! (wv-handle wv) title)) + +(define/contract (webview-close wv) + (-> wv? symbol?) + (let ((r (rkt-webview-close (wv-handle wv)))) + (kill-thread (wv-webserver-thread wv)) + r) ) -(define (webview-bind! wv selector event) +(define/contract (webview-bind! wv selector event) + (-> wv? (or/c symbol? string?) symbol? list?) (let ((sel (if (symbol? selector) (format "#~a" selector) selector)) (evt (format "~a" event))) - (webview-run-js wv - (format "window.rkt_bind_evt_ids(~a, '~a', '~a')" - (wv-window-nr wv) sel evt)))) + (let ((r (webview-call-js wv + (format "return window.rkt_bind_evt_ids(~a, '~a', '~a')" + (wv-window-nr wv) sel evt)))) + (map (λ (el) + (list (string->symbol (car el)) (cadr el) (caddr el))) + r)))) -(define (webview-run-js wv js) +(define/contract (webview-run-js wv js) + (-> wv? string? symbol?) (rkt-webview-run-js (wv-handle wv) js)) (define (webview-standard-file-getter base-path @@ -168,9 +276,166 @@ (on-not-exist file base-path p) p))))) + (define (webview-call-js wv js) - (let ((result (rkt_webview_call_js (wv-handle wv) js))) - result)) + (-> wv? string? (or/c string? list? boolean? hash?)) + (let ((result (rkt-webview-call-js (wv-handle wv) js))) + (if (webview-call-js-result? result) + (if (eq? (car result) 'oke) + (hash-ref (fromJson (cadr result)) 'result #f) + (error "Error calling javascript. Message: ~a" (hash-ref (fromJson (cadr result)) 'exn result)) + ) + (error "Wrong result from webview-call-js: ~a" result) + ) + ) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Functions on top of the basics +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define/contract (webview-set-innerHTML! wv id html) + (-> wv? symbol? (or/c string? xexpr?) symbol?) + (if (string? html) + (webview-run-js wv + (with-id id el + ("el.innerHTML = '~a';" (esc-quote html)))) + (webview-set-innerHTML! wv id (xexpr->string html)) + ) + ) + +(define/contract (webview-set-value! wv id val) + (-> wv? symbol? (or/c symbol? string? number? boolean?) symbol?) + (webview-run-js wv + (with-id id el + ((string-append + "if (el.type == 'checkbox' || el.type == 'radio') {\n" + " el.checked = ~a;\n" + "} else {\n" + " el.value = '~a';\n" + "}") + (if (eq? val #f) "false" "true") + (esc-quote (format "~a" val)))) + ) + ) + +(define/contract (webview-value wv id) + (-> wv? symbol? (or/c string? boolean?)) + (let ((v (webview-call-js wv + (with-id id el + ((string-append "let f = function() {\n" + " if (el.type == 'checkbox' || el.type == 'radio') {\n" + " return '' + el.checked;\n" + " } else {\n" + " return el.value;\n" + " }\n" + "};\n")) + -> "f()")))) + (if (eq? (car v) 'oke) + (let ((h (fromJson (cadr v)))) + (hash-ref h 'result #f)) + #f) + ) + ) + +(define/contract (webview-value/number wv id) + (-> wv? symbol? (or/c number? boolean?)) + (let ((v (webview-value wv id))) + (if (eq? v #f) + #f + (string->number (webview-value wv id))))) + +(define/contract (webview-value/symbol wv id) + (-> wv? symbol? (or/c symbol? boolean?)) + (let ((v (webview-value wv id))) + (if (eq? v #f) + #f + (string->symbol (webview-value wv id))))) + +(define/contract (webview-value/bool wv id) + (-> wv? symbol? (or/c symbol? boolean?)) + (let ((v (webview-value wv id))) + (if (eq? v #f) + 'fail + (if (string=? (webview-value wv id) "true") + #t + #f)))) + +(define/contract (webview-add-class! wv id-or-selector class) + (-> wv? (or/c symbol? string?) (or/c symbol? string? list?) hash?) + (let ((sel (if (symbol? id-or-selector) + (format "#~a" id-or-selector) + id-or-selector)) + (cl (mk-js-array class)) + ) + (webview-call-js wv (with-selector sel + (format + (js-code + "function(id, el) {" + " let cl = ~a;" + " cl.forEach(function(c) {" + " el.classList.add(c);" + " });" + " return id;" + "}") cl))) + ) + ) + +(define/contract (webview-remove-class! wv id-or-selector class) + (-> wv? (or/c symbol? string?) (or/c symbol? string? list?) hash?) + (let ((sel (if (symbol? id-or-selector) + (format "#~a" id-or-selector) + id-or-selector)) + (cl (mk-js-array class)) + ) + (webview-call-js wv + (with-selector sel + (format + (js-code + "function(id, el) {" + " let cl = ~a;" + " cl.forEach(function(c) {" + " el.classList.remove(c);" + " });" + " return id;" + "}") cl)) + ) + ) + ) + + +(define/contract (webview-set-style! wv selector style-entries) + (-> wv? (or/c symbol? string?) (or/c list? list-of-kv?) hash?) + +(define (webview-set-style!* wv selector h) + (list wv selector h)) + + +(define-syntax webview-style-entry + (syntax-rules () + ((_ h (k v)) + (with-handlers ([exn:fail? (λ (e) + (hash-set! h 'k v))]) + (hash-set! h k v))) + ((_ h q l) + (hash-set! h (car l) (cadr l))) + ((_ h l) + (hash-set! h (car l) (cadr l))) + ) + ) + +(define-syntax webview-set-style! + (syntax-rules () + ((_ wv selector st ...) + (webview-set-style!* wv selector + (let ((h (make-hash))) + (webview-style-entry h st) + ... + h)) + ) + ) + ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; testing @@ -184,6 +449,10 @@ (let* ((cb (λ (handle evt) (displayln evt))) (h (webview-create file-getter cb))) + (webview-set-title! h "This is a test window") + (webview-resize h 800 600) + (webview-move h 350 220) + ;(webview-present h) h)) diff --git a/private/utils.rkt b/private/utils.rkt index a786b97..e4d6033 100644 --- a/private/utils.rkt +++ b/private/utils.rkt @@ -1,10 +1,20 @@ #lang racket/base +(require racket/string + racket/port + json + ) (provide while until get-lib-path do-for + esc-quote + esc-double-quote + fromJson + mk-js-array + js-code + list-of-kv? ) (define-syntax while @@ -61,4 +71,47 @@ [else (error (format "Install the shared library: ~a" lib))] ))) + +(define (esc-quote str) + (string-replace str "'" "\\'")) + +(define (esc-double-quote str) + (string-replace str "\"" "\\\"")) +(define (fromJson str) + (with-input-from-string str read-json)) + +(define (mk-js-array l) + (if (list? l) + (string-append "[ " (string-join (map (λ (e) (format "'~a'" + (esc-quote (format "~a" e)))) l) ", ") " ]") + (format "[ '~a' ]" (esc-quote (format "~a" l))) + ) + ) + +(define (js-code . a) + (define (code* l) + (if (null? l) + "" + (string-append (car l) "\n" (code* (cdr l))) + ) + ) + (code* a)) + + +(define (list-of-kv? l) + (define (kv? e) + (let ((e (car l))) + (and (list? e) + (= (length e) 2) + (symbol? (car e))))) + (define (all-kv? l) + (if (null? l) + #t + (if (kv? (car e)) + (all-kv? (cdr l)) + #f))) + (if (list? l) + (all-kv? l) + #f)) + diff --git a/rktwebview_qt/main.cpp b/rktwebview_qt/main.cpp index 4702f46..8063193 100644 --- a/rktwebview_qt/main.cpp +++ b/rktwebview_qt/main.cpp @@ -21,7 +21,9 @@ int main(int argc, char *argv[]) rkt_webview_init(); wv1 = rkt_webview_create(0, eventCb); - rkt_webview_set_url(wv1, "https://wikipedia.org"); + rkt_webview_move(wv1, 200, 300); + rkt_webview_resize(wv1, 800, 600); + rkt_webview_set_url(wv1, "http://127.0.0.1:8083"); int i = 0; while(i < 60) { @@ -50,6 +52,9 @@ int main(int argc, char *argv[]) if (i == 10) { wv2 = rkt_webview_create(0, eventCb); + rkt_webview_move(wv2, 400, 200); + rkt_webview_resize(wv2, 800, 600); + rkt_webview_set_url(wv2, "https://127.0.0.1"); } if (i > 10) { diff --git a/rktwebview_qt/rktwebview.cpp b/rktwebview_qt/rktwebview.cpp index 041aeb6..5931d65 100644 --- a/rktwebview_qt/rktwebview.cpp +++ b/rktwebview_qt/rktwebview.cpp @@ -29,6 +29,7 @@ void rkt_webview_init() { if (handler == nullptr) { handler = new Rktwebview_qt(&handler); + handler->doEvents(); } } @@ -135,4 +136,51 @@ bool rkt_webview_valid(rktwebview_t wv) return handler->rktValid(wv); } +result_t rkt_webview_hide(rktwebview_t w) +{ + rkt_webview_init(); + return handler->rktHideWindow(w); +} + +result_t rkt_webview_show(rktwebview_t w) +{ + rkt_webview_init(); + return handler->rktShowWindow(w); +} + +result_t rkt_webview_present(rktwebview_t w) +{ + rkt_webview_init(); + return handler->rktPresentWindow(w); +} + +result_t rkt_webview_maximize(rktwebview_t w) +{ + rkt_webview_init(); + return handler->rktMaximizeWindow(w); +} + +result_t rkt_webview_minimize(rktwebview_t w) +{ + rkt_webview_init(); + return handler->rktMinimizeWindow(w); +} + +result_t rkt_webview_show_normal(rktwebview_t w) +{ + rkt_webview_init(); + return handler->rktShowNormalWindow(w); +} + +window_state_t rkt_webview_window_state(rktwebview_t w) +{ + rkt_webview_init(); + return handler->rktWindowState(w); +} + +result_t rkt_webview_set_title(rktwebview_t wv, const char *title) +{ + rkt_webview_init(); + return handler->rktWindowSetTitle(wv, title); +} diff --git a/rktwebview_qt/rktwebview.h b/rktwebview_qt/rktwebview.h index 7faa013..a9e0295 100644 --- a/rktwebview_qt/rktwebview.h +++ b/rktwebview_qt/rktwebview.h @@ -37,7 +37,15 @@ typedef struct { char *value; } rkt_js_result_t; - +typedef enum { + invalid = -1, + normal = 0, + minimized = 1, + maximized = 2, + hidden = 3, + normal_active = 16, + maximized_active = 18 +} window_state_t; RKTWEBVIEW_QT_EXPORT void rkt_webview_init(); RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms); @@ -45,6 +53,7 @@ RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms); RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rktwebview_t parent, event_cb_t js_event_cb); RKTWEBVIEW_QT_EXPORT void rkt_webview_close(rktwebview_t wv); RKTWEBVIEW_QT_EXPORT bool rkt_webview_valid(rktwebview_t wv); +RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_title(rktwebview_t wv, const char *title); RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_url(rktwebview_t wv, const char *url); @@ -60,6 +69,13 @@ RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_event(rkt_event_t *e); RKTWEBVIEW_QT_EXPORT result_t rkt_webview_move(rktwebview_t w, int x, int y); RKTWEBVIEW_QT_EXPORT result_t rkt_webview_resize(rktwebview_t w, int width, int height); +RKTWEBVIEW_QT_EXPORT result_t rkt_webview_hide(rktwebview_t w); +RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show(rktwebview_t w); +RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show_normal(rktwebview_t w); +RKTWEBVIEW_QT_EXPORT result_t rkt_webview_present(rktwebview_t w); +RKTWEBVIEW_QT_EXPORT result_t rkt_webview_maximize(rktwebview_t w); +RKTWEBVIEW_QT_EXPORT result_t rkt_webview_minimize(rktwebview_t w); +RKTWEBVIEW_QT_EXPORT window_state_t rkt_webview_window_state(rktwebview_t w); } diff --git a/rktwebview_qt/rktwebview_qt.cpp b/rktwebview_qt/rktwebview_qt.cpp index b453338..660d717 100644 --- a/rktwebview_qt/rktwebview_qt.cpp +++ b/rktwebview_qt/rktwebview_qt.cpp @@ -8,17 +8,26 @@ #include #include #include +#include -#define COMMAND_QUIT 1 -#define COMMAND_CLOSE 2 -#define COMMAND_CREATE 3 -#define COMMAND_SET_URL 4 -#define COMMAND_SET_HTML 5 -#define COMMAND_RUN_JS 6 -#define COMMAND_DEV_TOOLS 7 -#define COMMAND_MOVE 8 -#define COMMAND_RESIZE 9 -#define COMMAND_CALL_JS 10 +#define COMMAND_QUIT 1 +#define COMMAND_CLOSE 2 +#define COMMAND_CREATE 3 +#define COMMAND_SET_URL 4 +#define COMMAND_SET_HTML 5 +#define COMMAND_RUN_JS 6 +#define COMMAND_DEV_TOOLS 7 +#define COMMAND_MOVE 8 +#define COMMAND_RESIZE 9 +#define COMMAND_CALL_JS 10 +#define COMMAND_HIDE_WIN 11 +#define COMMAND_SHOW_WIN 12 +#define COMMAND_MAX_WIN 13 +#define COMMAND_MIN_WIN 14 +#define COMMAND_PRESENT_WIN 15 +#define COMMAND_SHOW_NORMAL_WIN 16 +#define COMMAND_WINDOW_STATUS 17 +#define COMMAND_SET_TITLE 18 void Rktwebview_qt::processCommands() { @@ -54,12 +63,16 @@ void Rktwebview_qt::processCommands() _view_js_callbacks[id] = js_event_cb; w->show(); + while(!w->windowCreated()) { + doEvents(); + } cmd->result = id; cmd->done = true; } break; case COMMAND_CLOSE: { + doEvents(); int wv = cmd->args[0].toInt(); if (_views.contains(wv)) { WebviewWindow *w= _views[wv]; @@ -73,6 +86,7 @@ void Rktwebview_qt::processCommands() } break; case COMMAND_SET_URL: { + doEvents(); int wv = cmd->args[0].toInt(); QString url = cmd->args[1].toString(); if (_views.contains(wv)) { @@ -88,6 +102,7 @@ void Rktwebview_qt::processCommands() } break; case COMMAND_SET_HTML: { + doEvents(); int wv = cmd->args[0].toInt(); QString html = cmd->args[1].toString(); if (_views.contains(wv)) { @@ -101,7 +116,22 @@ void Rktwebview_qt::processCommands() cmd->done = true; } break; + case COMMAND_SET_TITLE: { + doEvents(); + int wv = cmd->args[0].toInt(); + QString title = cmd->args[1].toString(); + if (_views.contains(wv)) { + WebviewWindow *w = _views[wv]; + w->setWindowTitle(title); + cmd->result = true; + } else { + cmd->result = false; + } + cmd->done = true; + } + break; case COMMAND_RUN_JS: { + doEvents(); int wv = cmd->args[0].toInt(); QString js = cmd->args[1].toString(); if (_views.contains(wv)) { @@ -115,6 +145,7 @@ void Rktwebview_qt::processCommands() } break; case COMMAND_CALL_JS: { + doEvents(); int wv = cmd->args[0].toInt(); QString js = cmd->args[1].toString(); if (_views.contains(wv)) { @@ -128,6 +159,7 @@ void Rktwebview_qt::processCommands() } break; case COMMAND_DEV_TOOLS: { + doEvents(); int wv = cmd->args[0].toInt(); if (_views.contains(wv)) { WebviewWindow *w = _views[wv]; @@ -139,13 +171,78 @@ void Rktwebview_qt::processCommands() cmd->done = true; } break; + case COMMAND_SHOW_WIN: + case COMMAND_HIDE_WIN: + case COMMAND_PRESENT_WIN: + case COMMAND_MAX_WIN: + case COMMAND_MIN_WIN: + case COMMAND_SHOW_NORMAL_WIN: + { + doEvents(); + int wv = cmd->args[0].toInt(); + if (_views.contains(wv)) { + WebviewWindow *w = _views[wv]; + int c = cmd->cmd; + if (c == COMMAND_SHOW_WIN) w->show(); + else if (c == COMMAND_HIDE_WIN) w->hide(); + else if (c == COMMAND_MAX_WIN) w->showMaximized(); + else if (c == COMMAND_MIN_WIN) { + w->showMinimized(); + } + else if (c == COMMAND_SHOW_NORMAL_WIN) w->showNormal(); + else if (c == COMMAND_PRESENT_WIN) { + w->show(); + w->raise(); + w->activateWindow(); + } + cmd->result = true; + } else { + cmd->result = false; + } + cmd->done = true; + } + break; + case COMMAND_WINDOW_STATUS: + { + doEvents(); + int wv = cmd->args[0].toInt(); + window_state_t ws = window_state_t::invalid; + if (_views.contains(wv)) { + WebviewWindow *w = _views[wv]; + if (w->isHidden()) { + ws = window_state_t::hidden; + } else if (w->isMinimized()) { + ws = window_state_t::minimized; + } else if (w->isMaximized()) { + if (w->isActiveWindow()) { + ws = window_state_t::maximized_active; + } else { + ws = window_state_t::maximized; + } + } else if (w->isVisible()) { + if (w->isActiveWindow()) { + ws = window_state_t::normal_active; + } else { + ws = window_state_t::normal; + } + } + } + cmd->result = static_cast(ws); + cmd->done = true; + } + break; case COMMAND_MOVE: { + doEvents(); int wv = cmd->args[0].toInt(); int x = cmd->args[1].toInt(); int y = cmd->args[2].toInt(); if (_views.contains(wv)) { WebviewWindow *w = _views[wv]; + int move_count = w->moveCount(); w->move(x, y); + while (w->moveCount() == move_count) { + doEvents(); + } cmd->result = true; } else { cmd->result = false; @@ -154,12 +251,17 @@ void Rktwebview_qt::processCommands() } break; case COMMAND_RESIZE: { + doEvents(); int wv = cmd->args[0].toInt(); int width = cmd->args[1].toInt(); int height = cmd->args[2].toInt(); if (_views.contains(wv)) { WebviewWindow *w = _views[wv]; + int resize_count = w->resizeCount(); w->resize(width, height); + while (w->resizeCount() == resize_count) { + doEvents(); + } cmd->result = true; } else { cmd->result = false; @@ -312,6 +414,68 @@ result_t Rktwebview_qt::rktResize(rktwebview_t wv, int w, int h) return r ? result_t::oke : result_t::resize_failed; } +result_t Rktwebview_qt::rktHideWindow(rktwebview_t w) +{ + return doWindow(w, COMMAND_HIDE_WIN); +} + +result_t Rktwebview_qt::rktShowWindow(rktwebview_t w) +{ + return doWindow(w, COMMAND_SHOW_WIN); +} + +result_t Rktwebview_qt::rktPresentWindow(rktwebview_t w) +{ + return doWindow(w, COMMAND_PRESENT_WIN); +} + +result_t Rktwebview_qt::rktMaximizeWindow(rktwebview_t w) +{ + return doWindow(w, COMMAND_MAX_WIN); +} + +result_t Rktwebview_qt::rktMinimizeWindow(rktwebview_t w) +{ + return doWindow(w, COMMAND_MIN_WIN); +} + +result_t Rktwebview_qt::rktShowNormalWindow(rktwebview_t w) +{ + return doWindow(w, COMMAND_SHOW_NORMAL_WIN); +} + +window_state_t Rktwebview_qt::rktWindowState(rktwebview_t w) +{ + Command c(COMMAND_WINDOW_STATUS); + c.args.push_back(w); + _command_queue.enqueue(&c); + while(!c.done) { doEvents(); } + int r = c.result.toInt(); + window_state_t ws = static_cast(r); + return ws; +} + +result_t Rktwebview_qt::rktWindowSetTitle(rktwebview_t wv, const char *title) +{ + Command c(COMMAND_SET_TITLE); + c.args.push_back(wv); + c.args.push_back(title); + _command_queue.enqueue(&c); + while(!c.done) { doEvents(); } + bool r = c.result.toBool(); + return r ? result_t::oke : result_t::resize_failed; +} + +result_t Rktwebview_qt::doWindow(rktwebview_t w, int cmd) +{ + Command c(cmd); + c.args.push_back(w); + _command_queue.enqueue(&c); + while(!c.done) { doEvents(); } + bool r = c.result.toBool(); + return r ? result_t::oke : result_t::resize_failed; +} + bool Rktwebview_qt::rktValid(rktwebview_t wv) { return _views.contains(wv); @@ -415,5 +579,13 @@ Rktwebview_qt::Rktwebview_qt(Rktwebview_qt **handler) : connect(&_process_events, &QTimer::timeout, this, &Rktwebview_qt::processJsEventQueues); _process_events.start(5); + const auto *eventDispatcher = QThread::currentThread()->eventDispatcher(); + QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, + QThread::currentThread(), []{ + if (QThread::currentThread()->loopLevel() == 0) + QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); + } + ); + *_handler = nullptr; } diff --git a/rktwebview_qt/rktwebview_qt.h b/rktwebview_qt/rktwebview_qt.h index 5aece18..754b0da 100644 --- a/rktwebview_qt/rktwebview_qt.h +++ b/rktwebview_qt/rktwebview_qt.h @@ -38,6 +38,7 @@ private: private: void runJs(rktwebview_t wv, const char *js); + result_t doWindow(rktwebview_t w, int cmd); public slots: void processCommands(); @@ -58,8 +59,19 @@ public: result_t rktSetHtml(rktwebview_t wv, const char *html); result_t rktRunJs(rktwebview_t wv, const char *js); rkt_js_result_t *rktCallJs(rktwebview_t wv, const char *js); + result_t rktMove(rktwebview_t wv, int x, int y); result_t rktResize(rktwebview_t wv, int w, int h); + result_t rktHideWindow(rktwebview_t w); + result_t rktShowWindow(rktwebview_t w); + result_t rktPresentWindow(rktwebview_t w); + result_t rktMaximizeWindow(rktwebview_t w); + result_t rktMinimizeWindow(rktwebview_t w); + result_t rktShowNormalWindow(rktwebview_t w); + window_state_t rktWindowState(rktwebview_t w); + + result_t rktWindowSetTitle(rktwebview_t wv, const char *title); + bool rktValid(rktwebview_t wv); public: diff --git a/rktwebview_qt/webviewwindow.cpp b/rktwebview_qt/webviewwindow.cpp index e5356b3..94a65e3 100644 --- a/rktwebview_qt/webviewwindow.cpp +++ b/rktwebview_qt/webviewwindow.cpp @@ -20,6 +20,10 @@ WebviewWindow::WebviewWindow(QWidget *parent) _devtools = nullptr; + _window_created = false; + _moved = 0; + _resized = 0; + connect(&_resize_timer, &QTimer::timeout, this, &WebviewWindow::triggerResize); connect(&_move_timer, &QTimer::timeout, this, &WebviewWindow::triggerMove); } @@ -74,6 +78,21 @@ void WebviewWindow::closeView() close(); } +bool WebviewWindow::windowCreated() +{ + return _window_created; +} + +int WebviewWindow::moveCount() +{ + return _moved; +} + +int WebviewWindow::resizeCount() +{ + return _resized; +} + void WebviewWindow::addView(WebViewQt *v, Rktwebview_qt *c) { _container = c; @@ -174,6 +193,7 @@ void WebviewWindow::moveEvent(QMoveEvent *event) _y = event->pos().y(); _move_timer.setSingleShot(true); _move_timer.start(500); + _moved += 1; } void WebviewWindow::triggerMove() @@ -190,6 +210,7 @@ void WebviewWindow::resizeEvent(QResizeEvent *event) _h = event->size().height(); _resize_timer.setSingleShot(true); _resize_timer.start(500); + _resized += 1; } void WebviewWindow::triggerResize() @@ -202,6 +223,7 @@ void WebviewWindow::triggerResize() void WebviewWindow::showEvent(QShowEvent *event) { + _window_created = true; EventContainer show("show"); _container->triggerEvent(_view->id(), show); } diff --git a/rktwebview_qt/webviewwindow.h b/rktwebview_qt/webviewwindow.h index cf266d8..e6cf997 100644 --- a/rktwebview_qt/webviewwindow.h +++ b/rktwebview_qt/webviewwindow.h @@ -25,6 +25,10 @@ private: int _h; bool _must_close; + bool _window_created; + int _moved; + int _resized; + public slots: void processJsEvents(); @@ -33,6 +37,9 @@ protected: public: void closeView(); + bool windowCreated(); + int moveCount(); + int resizeCount(); public: void addView(WebViewQt *v, Rktwebview_qt *c);