From 3a2abf90f6aa1efe34eab11fbacba109a7ed561b Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Wed, 4 Mar 2026 18:15:45 +0100 Subject: [PATCH] - --- example/index.html | 10 +- example/styles.css | 23 +- js/boilerplate.js | 24 +- lib/dll/webview.dll | Bin 106496 -> 0 bytes private/lib/linux/librktwebview_qt.so | Bin 0 -> 163088 bytes private/mimetypes.rkt | 725 ++++++++++++++++++++++++++ private/racket-webview-qt.rkt | 212 ++++++-- private/racket-webview.rkt | 303 ++++++++++- private/utils.rkt | 53 ++ rktwebview_qt/main.cpp | 7 +- rktwebview_qt/rktwebview.cpp | 48 ++ rktwebview_qt/rktwebview.h | 18 +- rktwebview_qt/rktwebview_qt.cpp | 192 ++++++- rktwebview_qt/rktwebview_qt.h | 12 + rktwebview_qt/webviewwindow.cpp | 22 + rktwebview_qt/webviewwindow.h | 7 + 16 files changed, 1563 insertions(+), 93 deletions(-) delete mode 100644 lib/dll/webview.dll create mode 100755 private/lib/linux/librktwebview_qt.so create mode 100644 private/mimetypes.rkt 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 9343d55d9fb34fb11d5c7e62f011e22c95a92b6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106496 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

+;kEr>7WJWqrZVVb zp_jO9Bg~7q6W<+{h~Y7YfoSNl;(jp}lCa`FOQP$5O6wZ3${RTfj{ZVf(M3I#_#U55 z@ka3mo%~wuMzrLpI~W+mcV(k#m-ib$zn4gCe&HbzKHeXI5dqKR&Li2c0F~C4V5QcH z=+O$`qulI=IPulbQKgPO#@`8`n5siL#6U!*3a_u~d$wQWwWmxIt^zGc zuoU~uu}#uDaWMX~*QnV#KvU~ti1Q8{p;;--Q29La98cjP>J>(^&xUvON_?|jsLs+y zcZb+n!8MY-48DYpWM7l8d0~5^^A`A{-^OcAUVK`yL=wZgG>*;S`&$fODWcI&^fR(J ziSex}Pgn0lAfk@(@=}hR7C`?d?MuLMQ*?kL1H@!IVo+j~)K%(jR694=$ z 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 (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);