diff --git a/README-zh_CN.md b/README-zh_CN.md index aeaa0bd..fa6a564 100644 --- a/README-zh_CN.md +++ b/README-zh_CN.md @@ -9,4 +9,37 @@ [![](https://img.shields.io/github/stars/zimocode/smartup)](https://github.com/zimocode/smartup/stargazers) [![](https://img.shields.io/github/license/zimocode/smartup)](LICENSE) -[English](README.md) ·[简体中文](README-zh_CN.md) \ No newline at end of file +[English](README.md) ·[简体中文](README-zh_CN.md) + +## 安装右键助手 +自行编译`rightClickHelper`目录下的go文件或者下载预编译文件。 +赋予可执行权限后,先在终端测试能否正常运行,如正常运行应该会有如下输出 + +```shell +❯ ./darwin_arm64 +{"version": "0.7"}[debug] sent msg: {"version": "0.7"} +``` + +如果有类似下列输出,则表明依赖库不存在,需要自行安装依赖库后再编译。 +```shell +❯ ./darwin_amd64 +dyld[60020]: Library not loaded: '/usr/local/opt/libpng/lib/libpng16.16.dylib' + Referenced from: '~/smartup/rightClickHelper/darwin_amd64' + Reason: tried: '/usr/local/opt/libpng/lib/libpng16.16.dylib' (no such file), '/usr/local/lib/libpng16.16.dylib' (no such file), '/usr/lib/libpng16.16.dylib' (no such file) +[1] 60020 abort ./darwin_amd64 +``` +编译命令如下: +```shell +# On Ubuntu dependency of robotgo: libx11-dev xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxtst-dev libpng++-dev +(cd rightClickHelper && go mod tidy && go build -ldflags "-s -w" -o rightClickHelper rightClickHelper.go) +``` + +编译成功后,按`GOOS_GOARCH`格式(如`linux_arm64`)重命名后,替换或补充在`rightClickHelper`目录下,执行`installRightClickHelper.sh`安装。 + +### macOS第一次点击右键时,会有授权弹窗提示 + +![授权弹窗提示](rightClickHelper/permission1.jpg) + +### 按图授权后,重启浏览器即可。 + +![按图授权](rightClickHelper/permission2.jpg) diff --git a/README.md b/README.md index 281c2f6..72d3d40 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,12 @@ smartUP Gestures has ben uploaded to these browser's extension store, you'll ins | Edge | [https://microsoftedge.microsoft.com/addons/detail/elponhbfjjjihgeijofonnflefhcbckp](https://microsoftedge.microsoft.com/addons/detail/elponhbfjjjihgeijofonnflefhcbckp) | | Firefox | [https://addons.mozilla.org/firefox/addon/smartup/](https://addons.mozilla.org/firefox/addon/smartup/) | +### Build right click helper +```shell +# On Ubuntu dependency of robotgo: libx11-dev xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxtst-dev libpng++-dev +(cd rightClickHelper && go mod tidy && go build -ldflags "-s -w" -o rightClickHelper rightClickHelper.go) +``` + ## License -[![License](https://img.shields.io/github/license/zimocode/smartup?logo=github&logoColor=white)](LICENSE) \ No newline at end of file +[![License](https://img.shields.io/github/license/zimocode/smartup?logo=github&logoColor=white)](LICENSE) diff --git a/installRightClickHelper.sh b/installRightClickHelper.sh new file mode 100755 index 0000000..e161126 --- /dev/null +++ b/installRightClickHelper.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# Copyright 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +set -e + +HOST_BIN="" +DIR="$( cd "$( dirname "$0" )" && pwd )" +if [ "$(uname -s)" = "Darwin" ]; then + SED="/usr/bin/sed -i ''" + [ "$(/usr/bin/uname -m)" = "arm64" ] && HOST_BIN="$DIR/rightClickHelper/darwin_arm64" || HOST_BIN="$DIR/rightClickHelper/darwin_amd64" + if [ "$(whoami)" = "root" ]; then + # Edge use TARGET_DIR="/Library/Microsoft/Edge/NativeMessagingHosts" + # Chromium use TARGET_DIR="/Library/Chromium/NativeMessagingHosts" + TARGET_DIR="/Library/Google/Chrome/NativeMessagingHosts" + else + # Edge use TARGET_DIR="$HOME/Library/Application Support/Microsoft/Edge/NativeMessagingHosts" + # Chromium use TARGET_DIR="$HOME/Library/Application Support/Chromium/NativeMessagingHosts" + TARGET_DIR="$HOME/Library/Application Support/Google/Chrome/NativeMessagingHosts" + fi +else + SED="/usr/bin/sed -i" + [ "$(/usr/bin/uname -m)" = "x86_64" ] && HOST_BIN="$DIR/rightClickHelper/linux_amd64" || HOST_BIN="$DIR/rightClickHelper/linux_arm64" + if [ "$(whoami)" = "root" ]; then + # Edge find it out yourself + # Chromium use TARGET_DIR="/etc/chromium/native-messaging-hosts" + TARGET_DIR="/etc/opt/chrome/native-messaging-hosts" + else + # Edge find it out yourself + # Chromium use TARGET_DIR="$HOME/.config/chromium/NativeMessagingHosts" + TARGET_DIR="$HOME/.config/google-chrome/NativeMessagingHosts" + fi +fi + +HOST_NAME=com.smartup.rightclickhelper + +# Create directory to store native messaging host. +mkdir -p "$TARGET_DIR" + +# create native messaging host manifest. +cat << EOF > "/tmp/$HOST_NAME.json" +{ + "name": "com.smartup.rightclickhelper", + "description": "Right Click Helper for SmartUp", + "path": "HOST_PATH", + "type": "stdio", + "allowed_origins": [ + "chrome-extension://okhdcmknlkpjecjobpijmniikbieejln/", + "chrome-extension://bgjfekefhjemchdeigphccilhncnjldn/", + "chrome-extension://jbfidehpoofganklkddfkcjeeaabimmb/" + ] +} +EOF + +# Update host path in the manifest. +HOST_PATH="$TARGET_DIR/smartUpRightClickHelper" +ESCAPED_HOST_PATH=${HOST_PATH////\\/} + +$SED "s/HOST_PATH/$ESCAPED_HOST_PATH/" "/tmp/$HOST_NAME.json" + +mv "/tmp/$HOST_NAME.json" "$TARGET_DIR/$HOST_NAME.json" +# Set permissions for the manifest so that all users can read it. +chmod o+r "$TARGET_DIR/$HOST_NAME.json" + +[ -f "$HOST_BIN" ] && cp "$HOST_BIN" "$HOST_PATH" && chmod +x "$HOST_PATH" \ +&& echo "Native messaging host $HOST_NAME has been installed to $HOST_PATH." \ +|| echo "No binary found for $HOST_BIN, please build it yourself." diff --git a/js/background.js b/js/background.js index 780a0b9..5caac25 100644 --- a/js/background.js +++ b/js/background.js @@ -27,7 +27,7 @@ var config, _SYNC, browserType, timerSaveConf; -let localConfig; +let localConfig,nativeListener; //check browser if(navigator.userAgent.toLowerCase().indexOf("firefox")!=-1){ @@ -42,6 +42,13 @@ if(browserType!="cr"){ chrome.storage.sync=chrome.storage.local; } +nativeListener = chrome.runtime.connectNative("com.smartup.rightclickhelper"); +nativeListener.onMessage.addListener((msg)=>{ + console.log('onNativeMessage',msg) +}); +nativeListener.onDisconnect.addListener(()=>{ + nativeListener = null; +}); var getDefault={ i18n:function(str){ @@ -313,7 +320,7 @@ var getDefault={ { direct:"U", name:"none" - + }, { direct:"R", @@ -361,7 +368,7 @@ var getDefault={ { direct:"U", name:"none" - + }, { direct:"R", @@ -407,7 +414,7 @@ var getDefault={ { direct:"U", name:"none" - + }, { direct:"R", @@ -439,7 +446,7 @@ var getDefault={ name:"none" } ], - }, + }, drg:{ settings:{ holdkey:"ctrl", @@ -801,7 +808,7 @@ var getDefault={ codes:[78,69,87], ctrl:false, alt:false, - shift:false + shift:false }] }, about:{ @@ -809,7 +816,7 @@ var getDefault={ ad:true } } - } + } switch(navigator.language.toLowerCase()){ case"zh-cn": var OBJ={}; @@ -887,7 +894,7 @@ let loadConfig=function(noInit,type){ }); }else{ config=items.config; - } + } } needInit(); //sub.init(); @@ -994,7 +1001,7 @@ var sub={ for(var i=0;i1&&sub.getConfValue("checks","n_closeConfirm")){ chrome.tabs.sendMessage(sub.curTab.id,{type:"set_confirm"},function(response){ @@ -1482,7 +1489,7 @@ var sub={ }); }else{ _funClose(); - } + } } if(value_closePin){ let ids_pinned,i=0,ii=0; @@ -1747,10 +1754,10 @@ var sub={ case"s_tabele_aslnk": clipOBJ.value=''+cptarget.title+'<\/a>'; break; - } + } clipOBJ.select(); document.execCommand('copy'); - clipOBJ.remove(); + clipOBJ.remove(); }) } var thepers=["clipboardWrite"]; @@ -1786,7 +1793,7 @@ var sub={ }) }, min:function(){ - chrome.windows.update(sub.curWin.id,{state:"minimized"}) + chrome.windows.update(sub.curWin.id,{state:"minimized"}) }, full:function(){ var t; @@ -1864,7 +1871,7 @@ var sub={ clipOBJ.value=sub.message.selEle.txt; clipOBJ.select(); document.execCommand('copy'); - clipOBJ.remove(); + clipOBJ.remove(); } var thepers=["clipboardWrite"]; var theorgs; @@ -1986,7 +1993,7 @@ var sub={ chrome.bookmarks.create({url:_url,title:_str}); _notif=="s_yes"?sub.showNotif("basic",sub.getI18n("notif_title"),sub.getI18n("notif_con_bkadd")):null; } - }) + }) } var thepers=["bookmarks"]; var theorgs; @@ -1999,7 +2006,7 @@ var sub={ clipOBJ.value=sub.message.selEle.lnk; clipOBJ.select(); document.execCommand('copy'); - clipOBJ.remove(); + clipOBJ.remove(); } var thepers=["clipboardWrite"]; var theorgs; @@ -2012,7 +2019,7 @@ var sub={ clipOBJ.value=sub.message.selEle.str; clipOBJ.select(); document.execCommand('copy'); - clipOBJ.remove(); + clipOBJ.remove(); } var thepers=["clipboardWrite"]; var theorgs; @@ -2025,7 +2032,7 @@ var sub={ clipOBJ.value=''+sub.message.selEle.str+'<\/a>'; clipOBJ.select(); document.execCommand('copy'); - clipOBJ.remove(); + clipOBJ.remove(); } var thepers=["clipboardWrite"]; var theorgs; @@ -2049,7 +2056,7 @@ var sub={ var _url=sub.message.selEle.img, //_dlbar=sub.getConfValue("checks","n_dlbar"), _notif=sub.getConfValue("checks","n_notif"); - //chrome.downloads.setShelfEnabled?chrome.downloads.setShelfEnabled(_dlbar==""?true:_dlbar):null; + //chrome.downloads.setShelfEnabled?chrome.downloads.setShelfEnabled(_dlbar==""?true:_dlbar):null; chrome.downloads.download({url:_url},function(id){ if(!id){ _notif?sub.showNotif("basic",sub.getI18n("notif_title"),sub.getI18n("notif_con_dnimgerr")):null; @@ -2077,7 +2084,7 @@ var sub={ }else{ _notif?sub.showNotif("basic",sub.getI18n("notif_title"),sub.getI18n("notif_con_dnimg")):null; } - }) + }) } var thepers=["downloads"/*,"downloads.shelf"*/]; var theorgs; @@ -2163,7 +2170,7 @@ var sub={ theURL="chrome://about"; break; } - sub.open(theURL,theTarget,theIndex,thePin); + sub.open(theURL,theTarget,theIndex,thePin); }, restart:function(){ chrome.tabs.create({url:"chrome://restart/",active:false}) @@ -2220,7 +2227,7 @@ var sub={ } }) }) - } + } } var thepers=["bookmarks"]; var theorgs; @@ -2286,7 +2293,7 @@ var sub={ case"s_reset": chrome.tabs.setZoom(factorDefault); break; - } + } } }, savepage:function(){ @@ -2310,7 +2317,7 @@ var sub={ }) }) }) - } + } } var thepers=["pageCapture","downloads"]; var theorgs; @@ -2493,7 +2500,7 @@ var sub={ } var thepers=["topSites"]; var theorgs; - sub.checkPermission(thepers,theorgs,theFunction); + sub.checkPermission(thepers,theorgs,theFunction); }, autoreload:function(){ var _appname="autoreload"; @@ -2565,7 +2572,7 @@ var sub={ chrome.bookmarks.getRecent(parseInt(config.apps[_appname].n_num),function(bkArray){ _obj.bk=bkArray; sub.cons[_appname]=_obj; - sub.insertTest(_appname); + sub.insertTest(_appname); }) } var thepers=["bookmarks"]; @@ -2692,7 +2699,7 @@ var sub={ } } config.apps.extmgm.exts=_newExts; - sub.insertTest(_appname); + sub.insertTest(_appname); }) }else{ sub.insertTest(_appname); @@ -2929,7 +2936,7 @@ var sub={ var dbobj=db.transaction(["config"], "readwrite").objectStore("config"); var dbadd=dbobj.put({config:config,id:config.version}); dbadd.onsuccess=function(e){ - sub.upgrade["_"+ver](ver!=defaultConf.version?true:false); + sub.upgrade["_"+ver](ver!=defaultConf.version?true:false); } } }, @@ -3079,7 +3086,7 @@ var sub={ } } config.version=44; - sub.saveConf(true); + sub.saveConf(true); }, _43:function(){ config.general.settings.timeoutvalue=config.general.settings.timeoutvalue*1000; @@ -3123,7 +3130,7 @@ var sub={ if(_obj[j][i].tip){ delete _obj[j][i].tip; } - } + } } if(config.wges.settings){delete config.wges.settings} if(config.rges.settings){delete config.rges.settings} @@ -3169,7 +3176,7 @@ var sub={ } if(config.apps.recentbk){ config.apps.recentbk.n_pin=(config.apps.recentbk.n_pin=="s_unpin")?false:true; - } + } } config.version=36; @@ -3249,7 +3256,7 @@ var sub={ if(["n_notif"].contains(_obj.selects[j].type)){ _obj.checks.push({type:_obj.selects[j].type,value:(_obj.selects[j].value=="s_yes"?true:false)}); _obj.selects.splice(j,1); - + } } }else if(_obj.name=="savepage"){ @@ -3266,7 +3273,7 @@ var sub={ if(["n_winincog"].contains(_obj.selects[j].type)){ _obj.checks.push({type:_obj.selects[j].type,value:(_obj.selects[j].value=="s_yes"?true:false)}); _obj.selects.splice(j,1); - + } } }else if(_obj.name=="reload"){ @@ -3274,7 +3281,7 @@ var sub={ if(["n_reload_clear"].contains(_obj.selects[j].type)){ _obj.checks.push({type:_obj.selects[j].type,value:(_obj.selects[j].value=="s_yes"?true:false)}); _obj.selects.splice(j,1); - + } } }else if(_obj.name=="script"){ @@ -3282,7 +3289,7 @@ var sub={ if(["n_jq"].contains(_obj.selects[j].type)){ _obj.checks.push({type:_obj.selects[j].type,value:(_obj.selects[j].value=="s_yes"?true:false)}); _obj.selects.splice(j,1); - + } } }else if(["next","previous","newtab","open","openclip","txtsearch","openlnk","openimg","imgsearch","crpages","source",""].contains(_obj.name)){ @@ -3290,7 +3297,7 @@ var sub={ if(["n_pin"].contains(_obj.selects[j].type)){ _obj.checks.push({type:_obj.selects[j].type,value:(_obj.selects[j].value=="s_pin"?true:false)}); _obj.selects.splice(j,1); - + } } }else if(_obj.name=="scroll"){ @@ -3298,7 +3305,7 @@ var sub={ if(["n_effect"].contains(_obj.selects[j].type)){ _obj.checks.push({type:_obj.selects[j].type,value:(_obj.selects[j].value=="s_on"?true:false)}); _obj.selects.splice(j,1); - + } } }else if(_obj.name=="pin"){ @@ -3341,7 +3348,7 @@ var sub={ config[_drgtype0[i]][_drgtype[ii]][iii].selects[j].value="s_back"; } } - } + } } } } @@ -3514,7 +3521,7 @@ var sub={ n_target:"s_back", n_index_new:"s_default", n_pin:"s_unpin", - n_appwin_close:false + n_appwin_close:false }} config.apps.rss.feed.push(_obj.texts[0].value); _flag=true; @@ -3528,7 +3535,7 @@ var sub={ texts:[], checks:[], selects:[] - } + } } } delete config.plus.menuPin; @@ -3577,7 +3584,7 @@ var sub={ config.drg.ui.tip.withdir=true; config.drg.ui.direct.width=defaultConf.drg.ui.direct.width; config.drg.ui.direct.style=defaultConf.drg.ui.direct.style; - config.drg.ui.allaction=defaultConf.drg.ui.allaction; + config.drg.ui.allaction=defaultConf.drg.ui.allaction; } config.version=2.7; sub.saveConf(true); @@ -3610,7 +3617,7 @@ var sub={ if(obj[ii][i].name=="script"&&obj[ii][i].texts){ delete obj[ii][i].texts; } - } + } } config.general.settings.theme="colorful"; config.version=2.8; @@ -3735,7 +3742,7 @@ var sub={ if(_erraction.contains(config[_drgtype0[i]][_drgtype[ii]][iii].name)&&!config[_drgtype0[i]][_drgtype[ii]][iii].selects){ config[_drgtype0[i]][_drgtype[ii]][iii].selects={} config[_drgtype0[i]][_drgtype[ii]][iii].selects=_errobj[config[_drgtype0[i]][_drgtype[ii]][iii].name] - } + } } } } @@ -3767,7 +3774,7 @@ var sub={ theConf={name:null/*,mydes:null*/} } } - return theConf; + return theConf; } switch(message.type){ case"evt_getconf": @@ -3830,7 +3837,7 @@ var sub={ chrome.tabs.executeScript({file:"js/inject/"+message.apptype+".js",runAt:"document_start"},function(){ }); - } + } if(!message.value){ chrome.tabs.insertCSS({file:"css/apps_basic.css",runAt:"document_start"},function(){}) chrome.tabs.executeScript({file:"js/apps_basic.js",runAt:"document_start"},function(){_fun();}) @@ -3925,7 +3932,7 @@ var sub={ },200) return } - sub.initCurrent(sender,sub.theConf) + sub.initCurrent(sender,sub.theConf) break; case"gettip": sub.theConf=getConf(); @@ -3976,7 +3983,7 @@ var sub={ sendResponse(sub.theConf); } sub.initCurrent(sender,sub.theConf); - break + break case"action": sub.theConf=getConf(); sub.theConf.type="action"; @@ -4007,6 +4014,9 @@ var sub={ sub.apps[message.app][message.action](message,sender,sendResponse); //sub.appsAction(message,sendResponse); break; + case"sendRightClick": + nativeListener.postMessage(message.sendValue); + break; } }, appsAction:function(message,sendResponse){ @@ -4026,7 +4036,7 @@ var sub={ sub.cons.autoreload[sender.tab.id].timeRemain=message.value.interval; sub.cons.autoreload[sender.tab.id].iconCountdown=message.value.iconCountdown; sub.cons.autoreload[sender.tab.id].bypassCache=message.value.bypassCache; - + if(sub.cons.autoreload[sender.tab.id].iconCountdown){ chrome.browserAction.setBadgeText({text:sub.cons.autoreload[sender.tab.id].timeRemain.toString(),tabId:sender.tab.id}); sub.cons.autoreload[sender.tab.id].countDown=window.setInterval(function(){ @@ -4036,7 +4046,7 @@ var sub={ }else{ sub.cons.autoreload[sender.tab.id].countDown=window.setInterval(function(){ sub.cons.autoreload[sender.tab.id].timeRemain--; - },1000) + },1000) } sub.cons.autoreload[sender.tab.id].timer=window.setInterval(function(){ chrome.tabs.reload(sender.tab.id,{bypassCache:sub.cons.autoreload[sender.tab.id].bypassCache}); @@ -4110,7 +4120,7 @@ var sub={ }, tablist:{ tabClose:function(message){ - message.value?chrome.tabs.remove(Number(message.value)):null; + message.value?chrome.tabs.remove(Number(message.value)):null; }, tabSwitch:function(message){ message.value?chrome.tabs.update(Number(message.value),{active:true}):null; @@ -4224,7 +4234,7 @@ var sub={ } } } - + sendResponse({exts:_exts}) // let _config=config.apps.extmgm.exts[message.value].id, // _exts=[]; @@ -4236,7 +4246,7 @@ var sub={ // } // } // } - + // sendResponse({exts:_exts}) }, getAllExt:function(message,sender,sendResponse){ @@ -4329,7 +4339,7 @@ var sub={ console.log(data) chrome.tabs.sendMessage(sender.tab.id,{type:"list",value:data}); } - reader.readAsText(blob, 'GBK') + reader.readAsText(blob, 'GBK') }) }, getData:function(message,sender,sendResponse){ @@ -4376,7 +4386,7 @@ var sub={ chrome.tabs.sendMessage(sender.tab.id,{type:"data",value:data}); } - reader.readAsText(blob, 'GBK') + reader.readAsText(blob, 'GBK') }) } }, @@ -4431,7 +4441,7 @@ var sub={ let response=await fetch(data.imageURL); response=await response.blob(); let reader = new FileReader(); - reader.readAsDataURL(response); + reader.readAsDataURL(response); reader.onloadend = function(){ data.base64=reader.result; (async function(){ @@ -4439,7 +4449,7 @@ var sub={ await sub.IDB.itemModify(db,"bingimg",0,data); if(localStorage.getItem("homepageURL")!=data.imageURL){ localStorage.setItem("homepageURL",data.imageURL); - } + } })(); } }, @@ -4505,7 +4515,7 @@ var sub={ console.log("get") message.type="appsListener_get"; message.data=data; - chrome.tabs.sendMessage(sender.tab.id,message); + chrome.tabs.sendMessage(sender.tab.id,message); } }, set:async function(message,sender,sendResponse){ @@ -4571,7 +4581,7 @@ var sub={ resolve(db); })() break; - } + } }) }, itemDel:function(db,storeName,key){ @@ -4682,7 +4692,7 @@ else{ chrome.runtime.getPlatformInfo(function(info){ sub.cons.os=info.os; sub.checkMouseup(); - }) + }) } if(!chrome.runtime.onInstalled){} @@ -4762,7 +4772,7 @@ else{ chrome.tabs.create({url:"https://chrome.google.com/webstore/detail/"+chrome.runtime.id+"?hl="+navigator.language}); break; } - }) + }) } chrome.contextMenus.onClicked.addListener(function(info,tab){ diff --git a/js/event.js b/js/event.js index 214fed4..3b92b71 100644 --- a/js/event.js +++ b/js/event.js @@ -12,7 +12,7 @@ let devMode, extDisable=false, appType={}, extID="jialbkkmibnohldjdhbdckemnpdpngeb"; - + //check browser if(navigator.userAgent.toLowerCase().indexOf("firefox")!=-1){ @@ -33,7 +33,8 @@ var sue={ fix_linux_value:false, fix_linux_timer:null, os:"win", - drginbox:true + drginbox:true, + sendRightClickTimer:null, }, apps:{ enable:false, @@ -232,7 +233,7 @@ var sue={ sue.clearUI(); sue.drawing=false; sue._lastX=e.clientX; - sue._lastY=e.clientY; + sue._lastY=e.clientY; } //fix wges @@ -264,7 +265,7 @@ var sue={ sue.selEle.img=document.activeElement.src; sue.selEle.str=document.activeElement.text; // sue.startEle=e.target; - + break; case"mousemove": if(sue.drawing&&e.buttons==config.mges.settings.model){ @@ -276,7 +277,7 @@ var sue={ &&((config.general.fnswitch.fndrg&&!e[config.drg.settings.holdkey+"Key"]) ||(config.general.fnswitch.fnsdrg&&!e[config.sdrg.settings.holdkey+"Key"]))){ sue.lineDrawReady(e,config.general.fnswitch.fndrg?"drg":"sdrg"); - + sue.inDrg=true; } break; @@ -289,7 +290,7 @@ var sue={ if(config[sue.drawType[0]].settings.drgcursor){ e.dataTransfer.effectAllowed="move" e.dataTransfer.dropEffect="move"; - e.preventDefault(); + e.preventDefault(); } //drag to text box, cancel if(!sue.cons.drginbox&&config[sue.drawType[0]].settings.drgtobox&&e.target&&e.target.type&&(e.target.type=="textarea"||e.target.type=="text")){ @@ -332,7 +333,7 @@ var sue={ break; } chrome.runtime.sendMessage(extID,{type:"action_dca",sendValue:sendValue,selEle:sue.selEle}); - } + } break; } }, @@ -355,7 +356,7 @@ var sue={ ||e.keyCode==18){ return } - sue.ksa.keyArray.push(e.keyCode) + sue.ksa.keyArray.push(e.keyCode) var key={ alt:e.altKey, shift:e.shiftKey, @@ -406,7 +407,7 @@ var sue={ return dom; }, regURL:function(txt){ - var reg=/^((http|https|ftp):\/\/)?(\w(\:\w)?@)?([0-9a-z_-]+\.)*?([a-z0-9-]+\.[a-z]{2,6}(\.[a-z]{2})?(\:[0-9]{2,6})?)((\/[^?#<>\/\\*":]*)+(\?[^#]*)?(#.*)?)?$/i; + var reg=/^((http|https|ftp):\/\/)?(\w(\:\w)?@)?([0-9a-z_-]+\.)*?([a-z0-9-]+\.[a-z]{2,6}(\.[a-z]{2})?(\:[0-9]{2,6})?)((\/[^?#<>\/\\*":]*)+(\?[^#]*)?(#.*)?)?$/i; return reg.test(txt.trim()); }, lineDrawReady_touch:function(e,type){ @@ -464,7 +465,7 @@ var sue={ } var dir; - dir=dx>dy?(xdy?(xdy?(xdy?(x" } - return domdir; + return domdir; }else{ return ""; } @@ -966,7 +983,7 @@ var sue={ }else{ sue.sendDir(sue._dirArray,"action",e); } - + if(sue.timeout){window.clearTimeout(sue.timeout);sue.break=false;} e.preventDefault(); sue._dirArray=""; diff --git a/manifest.json b/manifest.json index 78ff2ef..c6937bb 100644 --- a/manifest.json +++ b/manifest.json @@ -41,6 +41,6 @@ "image/*", "icon.png" ], - "permissions": ["tabs","","notifications","storage","contextMenus","unlimitedStorage","tts"], + "permissions": ["tabs","","notifications","storage","contextMenus","unlimitedStorage","tts","nativeMessaging"], "optional_permissions": ["downloads","downloads.shelf","clipboardRead","clipboardWrite","bookmarks","history","management","sessions","pageCapture","background","topSites"] -} \ No newline at end of file +} diff --git a/rightClickHelper/darwin_amd64 b/rightClickHelper/darwin_amd64 new file mode 100755 index 0000000..39892d9 Binary files /dev/null and b/rightClickHelper/darwin_amd64 differ diff --git a/rightClickHelper/darwin_arm64 b/rightClickHelper/darwin_arm64 new file mode 100755 index 0000000..f23cff3 Binary files /dev/null and b/rightClickHelper/darwin_arm64 differ diff --git a/rightClickHelper/go.mod b/rightClickHelper/go.mod new file mode 100644 index 0000000..1476536 --- /dev/null +++ b/rightClickHelper/go.mod @@ -0,0 +1,24 @@ +module rightClickHelper + +go 1.20 + +require github.com/go-vgo/robotgo v0.100.10 + +require ( + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect + github.com/otiai10/gosseract v2.2.1+incompatible // indirect + github.com/robotn/gohook v0.31.3 // indirect + github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 // indirect + github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 // indirect + github.com/shirou/gopsutil v3.21.10+incompatible // indirect + github.com/tklauser/go-sysconf v0.3.9 // indirect + github.com/tklauser/numcpus v0.3.0 // indirect + github.com/vcaesar/gops v0.21.3 // indirect + github.com/vcaesar/imgo v0.30.0 // indirect + github.com/vcaesar/keycode v0.10.0 // indirect + github.com/vcaesar/tt v0.20.0 // indirect + golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect + golang.org/x/sys v0.0.0-20211123173158-ef496fb156ab // indirect +) diff --git a/rightClickHelper/go.sum b/rightClickHelper/go.sum new file mode 100644 index 0000000..8d7dd91 --- /dev/null +++ b/rightClickHelper/go.sum @@ -0,0 +1,49 @@ +github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= +github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-vgo/robotgo v0.100.10 h1:bZe7AslG6oq5ops1SWUxsPfM9Z3QQvlqfA3ezxLFNO4= +github.com/go-vgo/robotgo v0.100.10/go.mod h1:7QeIpSHX7bjeXWRPxvQeKSx9mHI+3l80Ahq+CQF0C68= +github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= +github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= +github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I= +github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE= +github.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/robotn/gohook v0.31.3 h1:kGX8iukJ9ensVRwRKnTtdojAMQOpa6KFnXDi4OA4RaI= +github.com/robotn/gohook v0.31.3/go.mod h1:wyGik0yb4iwCfJjDprtNkTyxkgQWuKoVPQ3hkz6+6js= +github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 h1:2lhSR8N3T6I30q096DT7/5AKEIcf1vvnnWAmS0wfnNY= +github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= +github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 h1:2uX8QRLkkxn2EpAQ6I3KhA79BkdRZfvugJUzJadiJwk= +github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU= +github.com/shirou/gopsutil v3.21.10+incompatible h1:AL2kpVykjkqeN+MFe1WcwSBVUjGjvdU8/ubvCuXAjrU= +github.com/shirou/gopsutil v3.21.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= +github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= +github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= +github.com/vcaesar/gops v0.21.3 h1:VR7amkxVv9CQfsotkXrmMyT19dVuNTa1PM/oopJeIc0= +github.com/vcaesar/gops v0.21.3/go.mod h1:3e2EnlZTI9/44bqzRwkeZ3s0ZQwK2Cn4QPLx8Ii8Agk= +github.com/vcaesar/imgo v0.30.0 h1:ODQVX0EFJEh+WkKahCBtE0SqcDCIjl/kjiOplR0Ouh8= +github.com/vcaesar/imgo v0.30.0/go.mod h1:8TGnt5hjaMgwDByvMFIzUDSh5uSea4n1tAbSvnhvA6U= +github.com/vcaesar/keycode v0.10.0 h1:Qx5QE8ZXHyRyjoA2QOxBp25OKMKB+zxMVqm0FWGV0d4= +github.com/vcaesar/keycode v0.10.0/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= +github.com/vcaesar/tt v0.20.0 h1:9t2Ycb9RNHcP0WgQgIaRKJBB+FrRdejuaL6uWIHuoBA= +github.com/vcaesar/tt v0.20.0/go.mod h1:GHPxQYhn+7OgKakRusH7KJ0M5MhywoeLb8Fcffs/Gtg= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211123173158-ef496fb156ab h1:rfJ1bsoJQQIAoAxTxB7bme+vHrNkRw8CqfsYh9w54cw= +golang.org/x/sys v0.0.0-20211123173158-ef496fb156ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= diff --git a/rightClickHelper/linux_amd64 b/rightClickHelper/linux_amd64 new file mode 100755 index 0000000..edbce37 Binary files /dev/null and b/rightClickHelper/linux_amd64 differ diff --git a/rightClickHelper/permission1.jpg b/rightClickHelper/permission1.jpg new file mode 100644 index 0000000..08df887 Binary files /dev/null and b/rightClickHelper/permission1.jpg differ diff --git a/rightClickHelper/permission2.jpg b/rightClickHelper/permission2.jpg new file mode 100644 index 0000000..650d54d Binary files /dev/null and b/rightClickHelper/permission2.jpg differ diff --git a/rightClickHelper/rightClickHelper.go b/rightClickHelper/rightClickHelper.go new file mode 100644 index 0000000..006099a --- /dev/null +++ b/rightClickHelper/rightClickHelper.go @@ -0,0 +1,168 @@ +package main + +import ( + "encoding/binary" + "encoding/json" + "fmt" + "io" + "os" + "time" + + "github.com/go-vgo/robotgo" +) + +var lastMsgTime int64 +type Msg struct { + Timestamp int64 `json:"timestamp,omitempty"` + Click *struct { + Y int `json:"y"` + X int `json:"x"` + B int `json:"b"` + } `json:"click,omitempty"` + Key *struct { + Mod []string `json:"mod"` + Keys []string `json:"keys"` + } `json:"key,omitempty"` +} + +type Message struct { + Content []byte + MsgNum int +} + +func main() { + msg := `{"version": "0.8"}` + msgNum := 1 + SendMessage([]byte(msg)) + + msgChan := make(chan Message, 100) + + go func() { + for msg := range msgChan { + ProcessRequest(msg.Content, msg.MsgNum) + } + }() + + for { + length, err := ReadFrom(os.Stdin, 4) + if nil != err || len(length) < 1 { + time.Sleep(100 * time.Millisecond) + continue + } + readLength := binary.LittleEndian.Uint32(length) + text, err := ReadFrom(os.Stdin, int(readLength)) + + if nil != err { + os.Stderr.Write([]byte(fmt.Sprintf("[error] Read msg faild: %v\n", err))) + continue + } + + os.Stderr.Write([]byte(fmt.Sprintf("[debug] Received msg: %s\n", text))) + + msgNum += 1 + + msgChan <- Message{ + Content: text, + MsgNum: msgNum, + } + } +} + +func ReadFrom(reader io.Reader, num int) ([]byte, error) { + p := make([]byte, num) + n, err := reader.Read(p) + if n > 0 { + return p[:n], nil + } + return p, err +} + +func SendMessage(jsonMsg []byte) { + defer func() { + if r := recover(); nil != r { + os.Stderr.Write([]byte(fmt.Sprintf("[panic] Recover from SendMessage: %v\n", r))) + } + }() + bs := make([]byte, 4) + binary.LittleEndian.PutUint32(bs, uint32(len(jsonMsg))) + os.Stdout.Write(bs) + os.Stdout.Write(jsonMsg) + os.Stderr.Write([]byte(fmt.Sprintf("[debug] sent msg: %s\n\n\n", jsonMsg))) +} + +func ProcessRequest(req []byte, msgNum int) { + defer func() { + if r := recover(); nil != r { + os.Stderr.Write([]byte(fmt.Sprintf("[panic] Recover from ProcessRequest: %v\n", r))) + msgText, _ := json.Marshal(map[string]interface{}{"id": msgNum, "ack": req, "resp": map[string]interface{}{}, "timestamp": time.Now().UnixMilli(), "crash": true, "traceback": r}) + SendMessage(msgText) + } + }() + var msg Msg + err := json.Unmarshal(req, &msg) + if nil != err { + os.Stderr.Write([]byte(fmt.Sprintf("[error] Parse msg faild: %s\n", req))) + panic(`Parse msg faild.`) + } + + if lastMsgTime>0 && msg.Timestamp-lastMsgTime < 200 { + lastMsgTime = 0 + os.Stderr.Write([]byte(fmt.Sprintf("[debug] skip msg: %v\n", msg))) + return + } + + lastMsgTime = msg.Timestamp + var delay int64 + resp := map[string]interface{}{} + + if msg.Timestamp>0 { + delay = time.Now().UnixMilli() - msg.Timestamp + } else { + os.Stderr.Write([]byte(fmt.Sprintf("[debug] msg has no timestamp: %v\n", msg))) + } + + if nil != msg.Click { + if delay > 2e3 { + resp["clicked"] = false + } else { + robotgo.MoveClick(msg.Click.X, msg.Click.Y, "right", msg.Click.B == 2) + resp["clicked"] = true + os.Stderr.Write([]byte(fmt.Sprintf("[debug] MoveClick: %d,%d,right,%d\n", msg.Click.X, msg.Click.Y, msg.Click.B))) + } + } else { + os.Stderr.Write([]byte(fmt.Sprintf("[debug] msg has no click: %v\n", msg))) + } + + if nil != msg.Key { + if delay > 2e3 { + resp["keypressed"] = false + } else { + // press modifiers + if nil != msg.Key.Mod { + for _, keyChar := range msg.Key.Mod { + robotgo.KeyDown(keyChar) + os.Stderr.Write([]byte(fmt.Sprintf("[debug] KeyDown: %s,\n", keyChar))) + time.Sleep(50 * time.Millisecond) + } + } + // type seq + if nil != msg.Key.Keys { + for _, keyChar := range msg.Key.Keys { + robotgo.KeyTap(keyChar) + os.Stderr.Write([]byte(fmt.Sprintf("[debug] KeyTap: %s,\n", keyChar))) + } + } + // release modifiers + if modsLen := len(msg.Key.Mod); modsLen > 0 { + for i := modsLen - 1; i >= 0; i-- { + robotgo.KeyUp(msg.Key.Mod[i]) + os.Stderr.Write([]byte(fmt.Sprintf("[debug] KeyUp: %s,\n", msg.Key.Mod[i]))) + } + } + resp["keypressed"] = true + } + } + + msgText, _ := json.Marshal(map[string]interface{}{"id": msgNum, "ack": msg, "resp": resp, "timestamp": time.Now().Unix(), "delay": delay}) + SendMessage(msgText) +}