diff --git a/assets/index.js b/assets/index.js index b5fb2d1..fd349df 100644 --- a/assets/index.js +++ b/assets/index.js @@ -1,48 +1,155 @@ +checkUpdate = () => { + let cv = 'v0.0.5', + pg = 'https://yuanliao.info/d/296'; + if (utools.db.get(cv).data != 'pass') { + $.get(pg, data => { + data = /\[插件\]\[关闭进程 ProcessKiller (.*?)\](.*?) - 猿料<\/title>/.exec(data); + let lv = data[1], + desc = data[2]; + if (lv != cv) { + options = { + type: 'info', + title: '插件有可用更新', + icon: window.getLogo(), + cancelId: 1, + message: `发现新版本 ${lv},是否前往更新?\n更新内容:\n${desc}`, + buttons: ['起驾', '朕知道了', '别再烦朕'] + }; + window.messageBox(options, index => { + if (index == 0) { + window.open(pg) + } else if (index == 2) { + utools.db.put({ _id: cv, data: "pass" }) + } + }) + } + }) + } +} + +saveIcon = async tasks => { + if (window.isWin) { + window.getIco.emitter.on('icon', function (data) { + localStorage[data.Context] = data.Base64ImageData; + }); + for (var t of tasks) { + if (localStorage[t.ProcessName] == undefined) window.getIco.getIcon(t.ProcessName, t.Path); + } + } else { + for (var t of tasks) { + if (localStorage[t.nam] == undefined) { + if (t.ico) { + const buffer = await window.getIco.buffer(t.ico, { + size: 32 + }); + localStorage[t.nam] = buffer.toString('base64'); + } else { + localStorage[t.nam] = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAFNWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHRpZmY6T3JpZW50YXRpb249IjEiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA0LTI0VDEwOjAwOjE1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5MGQzMmU1Yi02OWY4LTRhOWYtYWUxNS0wMWEwZWY2Mzc2YTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiBzdEV2dDp3aGVuPSIyMDE5LTA0LTI0VDEwOjAxOjIzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+vwRiLQAAAuRJREFUWIXtlz1vHFUUhp9z52Mn67UTs7YcCSnio0AhFHSIgnSIIoqEokiIOgVtfkF+QmoqSxRUiI4SiShBCKVPhQSyowg7C14p9to7d+aeQ7E7s7vxWMGwa1PwSqMZzcc9z5zznntnxMw4T7lzjf5fAIirgwvtNh98dP1Dn+fZoqoiAq0sy39++PCno8PBLMCNW7e/jES+6O3uIK4pMTLe29Txy3r5WvUmAhhmRre7xo1btzeBOzMA+XD48XfffsNyZwkZPzBfADCM/YMBn372+SfVHTVAWfi91dVLb62trZNmKb43xHLFrcRQGtJymFfCfkm83iLseSR1xN0UC6+umXMO7z1R7zlF4feOAaiaYYaaUvRz0qsdktczit+HUBhhvyTKHEvvrTB40KNz8zLmlcGjP3Dt6JUAADYKgenEZTWAqWIGOgy0Lnd47c4blM9yyt0dunff5uCHHvF6imvFXHj/EsXTI/pfb+Oy0zWSmaGqk8zUGTDFzMAJlivlnzn+twGmht86RAclmivF1hGHj/dwyzHJlTZWnK5lzAybApiUIChqiiRC6Hv6m1u03ulgXund/wVJHdFyTHb1Igc/9iifDYnXUsqnR/8qA7MlUAMDt5IQ+p6DB6P6SuIQIPQL9r/fIVpNGT55AQLuYgJ/w4T1i5qiGhoyoIFqXRADySKibNZcEglRKwXALY8fPUXwyoQamjygip7BwmSmhKkMTABCGBMuFsLM0NAEoGHGnfOWiIzjWHMJQjirEtiMCWuA0UR0jgBBF++BavzmLgi6UA/UcfSELjANtQcqwyxKdtI8cFZq9MCiAaaz2rwankkG7FismcUIRqTOOVzjd+E/12g8dzKAqjqAEEK9zVMiUtfexrFmAJIk6QJsb2/PNXCT4jjuHgMoiuKra9fevTcYHMqi/OCcY6ndNu/9ZnVObKr3NzY23hSR1HQ0I8xrNqjGEucEs2Jnd/fXybfH/z+n56y/AJCowRn/6NLmAAAAAElFTkSuQmCC' + } + } + } + } +} + kill = (taskname, taskpath) => { window.taskkill(taskname, taskpath, err => { if (err) { - $("#infopannel").css({ "background": "#EF5350" }); + $("#infopannel").css({ + "background": "#EF5350" + }); $("#infopannel").html(err).fadeIn(300).delay(3000).fadeOut(300); } else { - if(taskpath == undefined){ - $("[name='" + taskname + "']").fadeOut(300).remove() + if (taskpath == undefined) { let tasknum = $(".taskinfo").length - utools.setExpendHeight(tasknum > 10 ? 500 : 50 * tasknum); - window.tasklist((task) => { - window.tasks = task + utools.setExpendHeight(tasknum > 11 ? 550 : 50 * tasknum); + } else { + $("#infopannel").css({ + "background": "#83bf40" }); - }else{ - $("#infopannel").css({ "background": "#83bf40" }); - $("#infopannel").html('重启进程成功!').fadeIn(300).delay(3000).fadeOut(300); + $("#infopannel").html('重启进程成功!').fadeIn(300).delay(3000).fadeOut(300); } + window.tasklist((task) => { + window.tasks = task + show(window.text); + }); } }); } -show = (tasks, text) => { +search = (t, text) => { + text = text.toUpperCase(); + var taskinfo = ''; + if (window.isWin) { + var icon = localStorage[t.ProcessName], + p = t.ProcessName.toUpperCase(), + d = t.Description.toUpperCase(); + if (icon == undefined) icon = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEUSURBVFhHYxgFgw2w+vv7C9ASA+1ggViFBiIiImISEhLuREVFfaAljo+PPxsZGWkJtRYBgoICzgUHBvzz9/X97+9HIww0O9Df/09QUFAr1FoEcJ9/9ILXotP/PBec+E9TvPDUH/f5Rzqg1iKA+6an5712vvnnse3Ff5rina//uG980g61FgHcNz4877XtxT+PzU/+0xRvf/7Hff2jUQeMOmDUAaMOGHXAqANGHTDqgEHoALf190/57fvyz2v7i/9e21/SBgObZD57Pv52XX23EWotAhh1rUpw3/DwofuGB5/dNtyjCQaaD6TvXjLuWGUDtRYFsDCwsWnwGdqbcOpY0QTzGVqZAO1RAWJmsI2jYOABAwMAOrpjfXCfUOgAAAAASUVORK5CYII="; + if (p.includes(text) || d.includes(text)) { + let title = t.Description ? t.Description : t.ProcessName; + taskinfo = `<div class="taskinfo" name="${t.ProcessName}"> + <img src="data:image/png;base64,${icon}"> + <div class="description">${title}</div> + <div class="path">${t.Path}</div></div>`; + } + } else { + var icon = localStorage[t.nam], + p = t.nam.toUpperCase(); + if (icon == undefined) icon = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAFNWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHRpZmY6T3JpZW50YXRpb249IjEiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA0LTI0VDEwOjAwOjE1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNC0yNFQxMDowMToyMyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5MGQzMmU1Yi02OWY4LTRhOWYtYWUxNS0wMWEwZWY2Mzc2YTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTBkMzJlNWItNjlmOC00YTlmLWFlMTUtMDFhMGVmNjM3NmE0IiBzdEV2dDp3aGVuPSIyMDE5LTA0LTI0VDEwOjAxOjIzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+vwRiLQAAAuRJREFUWIXtlz1vHFUUhp9z52Mn67UTs7YcCSnio0AhFHSIgnSIIoqEokiIOgVtfkF+QmoqSxRUiI4SiShBCKVPhQSyowg7C14p9to7d+aeQ7E7s7vxWMGwa1PwSqMZzcc9z5zznntnxMw4T7lzjf5fAIirgwvtNh98dP1Dn+fZoqoiAq0sy39++PCno8PBLMCNW7e/jES+6O3uIK4pMTLe29Txy3r5WvUmAhhmRre7xo1btzeBOzMA+XD48XfffsNyZwkZPzBfADCM/YMBn372+SfVHTVAWfi91dVLb62trZNmKb43xHLFrcRQGtJymFfCfkm83iLseSR1xN0UC6+umXMO7z1R7zlF4feOAaiaYYaaUvRz0qsdktczit+HUBhhvyTKHEvvrTB40KNz8zLmlcGjP3Dt6JUAADYKgenEZTWAqWIGOgy0Lnd47c4blM9yyt0dunff5uCHHvF6imvFXHj/EsXTI/pfb+Oy0zWSmaGqk8zUGTDFzMAJlivlnzn+twGmht86RAclmivF1hGHj/dwyzHJlTZWnK5lzAybApiUIChqiiRC6Hv6m1u03ulgXund/wVJHdFyTHb1Igc/9iifDYnXUsqnR/8qA7MlUAMDt5IQ+p6DB6P6SuIQIPQL9r/fIVpNGT55AQLuYgJ/w4T1i5qiGhoyoIFqXRADySKibNZcEglRKwXALY8fPUXwyoQamjygip7BwmSmhKkMTABCGBMuFsLM0NAEoGHGnfOWiIzjWHMJQjirEtiMCWuA0UR0jgBBF++BavzmLgi6UA/UcfSELjANtQcqwyxKdtI8cFZq9MCiAaaz2rwankkG7FismcUIRqTOOVzjd+E/12g8dzKAqjqAEEK9zVMiUtfexrFmAJIk6QJsb2/PNXCT4jjuHgMoiuKra9fevTcYHMqi/OCcY6ndNu/9ZnVObKr3NzY23hSR1HQ0I8xrNqjGEucEs2Jnd/fXybfH/z+n56y/AJCowRn/6NLmAAAAAElFTkSuQmCC"; + if (p.includes(text)) { + taskinfo = `<div class="taskinfo" name="${t.pid}"> + <div class="user">${t.usr}</div> + <img src="data:image/png;base64,${icon}"> + <div class="description">${t.nam}</div> + <div class="usage">C: ${t.cpu}% M: ${t.mem}%</div> + <div class="path">${t.path}</div></div>`; + } + } + return taskinfo; +} + +show = text => { var taskinfo = ''; for (var t of window.tasks) { - if (t.ProcessName.toUpperCase().search(text.toUpperCase()) != -1 || t.Description.toUpperCase().search(text.toUpperCase()) != -1) { - let title = t.Description ? t.Description : t.ProcessName; - taskinfo += '<div class="taskinfo" name="' + t.ProcessName + '">'; - taskinfo += '<img src="file:///' + t.Icon + '">'; - taskinfo += '<div class="description">' + title + '</div><div class="path">' + t.Path + '</div></div>'; - } - } + taskinfo += search(t, text); + } $("#tasklist").html(taskinfo); $(".taskinfo:first").addClass("select"); + window.mouseLockTime = new Date().getTime(); let tasknum = $(".taskinfo").length - utools.setExpendHeight(tasknum > 10 ? 500 : 50 * tasknum); + utools.setExpendHeight(tasknum > 11 ? 550 : 50 * tasknum); } utools.onPluginEnter(({ code, type, payload }) => { utools.setExpendHeight(0); + checkUpdate(); + if (window.isWin) { + utools.setExpendHeight(50); + $("#tasklist").html(`<div class="load">Loading...</div>`); + $(".load").animate({ "opacity": "0.3" }, 500) + .animate({ "opacity": "1" }, 500); + } + var db = utools.db.get('iconCache'); + if (db) { + for (var key in db.data) { + localStorage[key] = db.data[key] + } + } window.tasklist((task) => { window.tasks = task - show(window.tasks, ''); + saveIcon(task); + show(''); utools.setSubInput(({ text }) => { - show(window.tasks, text); - }, '输入进程名,回车关闭,或点击关闭'); + window.text = text; + show(text); + }, '输入进程名进行搜索'); + utools.onPluginOut(() => { + var update = { + _id: "iconCache", + data: localStorage + }; + if (db) update._rev = db._rev; + utools.db.put(update); + }) }); }); @@ -54,9 +161,12 @@ $("#tasklist").on('mousedown', '.taskinfo', function (e) { } }); -$("#tasklist").on('mouseover', '.taskinfo', function () { - $(".select").removeClass('select'); - $(this).addClass('select') +$("#tasklist").on('mousemove', '.taskinfo', function () { + var mouseUnlockTime = new Date().getTime(); + if (mouseUnlockTime - window.mouseLockTime > 500) { + $(".select").removeClass('select'); + $(this).addClass('select'); + } }); $(document).keydown(e => { @@ -70,28 +180,30 @@ $(document).keydown(e => { break; case 38: let pre = $(".select").prev(); - if(pre.length != 0){ + if (pre.length != 0) { event.preventDefault(); - if(pre.offset().top < $(window).scrollTop()){ + if (pre.offset().top < $(window).scrollTop()) { $("html").animate({ scrollTop: "-=50" }, 0); } pre.addClass("select"); $(".select:last").removeClass("select"); - }else{ - $(".select").animate({"opacity":"0.3"}).delay(500).animate({"opacity":"1"}) + } else { + $(".select").animate({ "opacity": "0.3" }) + .animate({ "opacity": "1" }) } - break; + break; case 40: let next = $(".select").next(); - if(next.length !=0){ + if (next.length != 0) { event.preventDefault(); - if(next.offset().top >= $(window).scrollTop() + 500){ + if (next.offset().top >= $(window).scrollTop() + 550) { $("html").animate({ scrollTop: "+=50" }, 0); } next.addClass("select"); $(".select:first").removeClass("select"); - }else{ - $(".select").animate({"opacity":"0.3"}).delay(500).animate({"opacity":"1"}) + } else { + $(".select").animate({ "opacity": "0.3" }) + .animate({ "opacity": "1" }) } break; } diff --git a/assets/style.css b/assets/style.css index cc1cae4..bde1ec2 100644 --- a/assets/style.css +++ b/assets/style.css @@ -23,6 +23,23 @@ .path { color: #888888; font-size: small; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.user { + float: right; + margin: 15px 10px; + height: 20px; + color: #666666 +} + +.usage { +font-size: small; + float: left; + color: #607D8B; + margin-right: 5px; } #infopannel { @@ -39,4 +56,11 @@ img { float: left; margin: 10px; height: 30px; +} + +.load { + margin-top: 10px; + text-align: center; + font-size: large; + color: #666666; } \ No newline at end of file diff --git a/preload.js b/preload.js index e7c956a..071ff1c 100644 --- a/preload.js +++ b/preload.js @@ -1,30 +1,25 @@ -const fs = require('fs'); -const path = require("path"); -const iconExtractor = require('icon-extractor'); const os = require('os') const iconv = require('iconv-lite') -const { spawn } = require("child_process") +const { spawn, exec } = require("child_process") +const { dialog, BrowserWindow, nativeImage } = require('electron').remote +const { shell } = require('electron'); +const path = require("path") -getico = tasks =>{ - iconExtractor.emitter.on('icon', function (data) { - let icondir = path.join(os.tmpdir(), 'ProcessIcon') - fs.exists(icondir, exists => { - if (!exists) { fs.mkdirSync(icondir) } - let iconpath = path.join(icondir, `${data.Context}.png`) - fs.exists(iconpath, exists => { - if (!exists) { - fs.writeFile(iconpath, data.Base64ImageData, "base64", err => { - if (err) { console.log(err); } - }) - } - }) - }) - }); +isWin = os.platform() == 'win32' ? true : false; - for (var task of tasks) { - iconExtractor.getIcon(task.ProcessName, task.Path); - } +getIco = isWin ? require('icon-extractor') : require('file-icon'); + +getLogo = () => nativeImage.createFromPath(path.join(__dirname, 'logo.png')); + +messageBox = (options, callback) => { + dialog.showMessageBox(BrowserWindow.getFocusedWindow(), options, index => { + callback(index); + }) +} + +open = url => { + shell.openExternal(url); } powershell = (cmd, callback) => { @@ -45,32 +40,59 @@ powershell = (cmd, callback) => { } tasklist = (callback) => { - powershell("Get-Process | Format-List ProcessName,Path,Description", (stdout, stderr) => { - let tasklist = []; - let tasks = stdout.trim().split('\r\n\r\n'); - for (var task of tasks) { - dict = {} - let lines = task.split('\r\n') - for (var line of lines) { - if (line) { - let key = line.split(/\s+:\s*/)[0]; - let value = line.split(/\s+:\s*/)[1]; - dict[key] = value; - } + var tasklist = []; + if (isWin) { + powershell("Get-Process | Format-List ProcessName,Path,Description", (stdout, stderr) => { + let tasks = stdout.trim().split('\r\n\r\n'); + for (var task of tasks) { + dict = {} + let lines = task.split('\r\n') + lines.forEach(line => { + if (line) { + let key = line.split(/\s+:\s*/)[0]; + let value = line.split(/\s+:\s*/)[1]; + dict[key] = value; + } + }) + tasklist.push(dict); } - var icon = path.join(os.tmpdir(), 'ProcessIcon', `${encodeURIComponent(dict.ProcessName)}.png`); - dict.Icon = icon - tasklist.push(dict); - } - tasklist.shift(); - getico(tasklist); - callback(tasklist); - }); + tasklist.shift(); + callback(tasklist); + }); + } else { + exec('ps -A -o pid -o %cpu -o %mem -o user -o comm | sed 1d | sort -rnk 3', (err, stdout, stderr) => { + lines = stdout.split('\n'); + lines.forEach(line => { + if (line) { + l = /(\d+)\s+(\d+[\.|\,]\d+)\s+(\d+[\.|\,]\d+)\s+(.*?)\s+(.*)/.exec(line); + dict = { + pid: l[1], + cpu: l[2], + mem: l[3], + usr: l[4], + path: l[5], + nam: l[5].split('/').pop(), + } + let ico = /\/Applications\/(.*?)\.app\//.exec(dict.path) + dict.ico = ico ? ico[1] : false; + tasklist.push(dict); + } + }); + callback(tasklist); + }); + } } -taskkill = (taskname, taskpath, callback) => { - let restart = taskpath == undefined ? '' : `;Start-Process -FilePath "${taskpath}"`; - powershell(`Stop-Process -Name ${taskname}${restart}`, (stdout, stderr) => { - callback(stderr.split('\n')[0]) - }); +taskkill = (task, path, callback) => { + if (isWin) { + let restart = path == undefined ? '' : `;Start-Process -FilePath "${path}"`; + powershell(`Stop-Process -Name ${task}${restart}`, (stdout, stderr) => { + callback(stderr.split('\n')[0]) + }); + } else { + let restart = path == undefined ? '' : `&& "${path}"`; + exec(`kill -9 ${task}${restart}`, (err, stdout, stderr) => { + callback(stderr); + }); + } } \ No newline at end of file