github.com/secoba/wails/v2@v2.6.4/internal/frontend/runtime/desktop/contextmenu.js (about) 1 /* 2 --default-contextmenu: auto; (default) will show the default context menu if contentEditable is true OR text has been selected OR element is input or textarea 3 --default-contextmenu: show; will always show the default context menu 4 --default-contextmenu: hide; will always hide the default context menu 5 6 This rule is inherited like normal CSS rules, so nesting works as expected 7 */ 8 export function processDefaultContextMenu(event) { 9 // Process default context menu 10 const element = event.target; 11 const computedStyle = window.getComputedStyle(element); 12 const defaultContextMenuAction = computedStyle.getPropertyValue("--default-contextmenu").trim(); 13 switch (defaultContextMenuAction) { 14 case "show": 15 return; 16 case "hide": 17 event.preventDefault(); 18 return; 19 default: 20 // Check if contentEditable is true 21 if (element.isContentEditable) { 22 return; 23 } 24 25 // Check if text has been selected and action is on the selected elements 26 const selection = window.getSelection(); 27 const hasSelection = (selection.toString().length > 0) 28 if (hasSelection) { 29 for (let i = 0; i < selection.rangeCount; i++) { 30 const range = selection.getRangeAt(i); 31 const rects = range.getClientRects(); 32 for (let j = 0; j < rects.length; j++) { 33 const rect = rects[j]; 34 if (document.elementFromPoint(rect.left, rect.top) === element) { 35 return; 36 } 37 } 38 } 39 } 40 // Check if tagname is input or textarea 41 if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") { 42 if (hasSelection || (!element.readOnly && !element.disabled)) { 43 return; 44 } 45 } 46 47 // hide default context menu 48 event.preventDefault(); 49 } 50 }