Removed astilectron-deps
This commit is contained in:
parent
7b83f23ff0
commit
288393aea7
BIN
astilectron-deps/vendor/astilectron-v0.30.0.zip
(Stored with Git LFS)
vendored
BIN
astilectron-deps/vendor/astilectron-v0.30.0.zip
(Stored with Git LFS)
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/astilectron-v0.6.0.zip
(Stored with Git LFS)
vendored
BIN
astilectron-deps/vendor/astilectron-v0.6.0.zip
(Stored with Git LFS)
vendored
Binary file not shown.
|
@ -1,4 +0,0 @@
|
|||
.idea/
|
||||
node_modules
|
||||
npm-debug.log
|
||||
dist
|
21
astilectron-deps/vendor/astilectron/LICENSE
vendored
21
astilectron-deps/vendor/astilectron/LICENSE
vendored
|
@ -1,21 +0,0 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2017 Quentin RENARD
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
547
astilectron-deps/vendor/astilectron/main.js
vendored
547
astilectron-deps/vendor/astilectron/main.js
vendored
|
@ -1,547 +0,0 @@
|
|||
'use strict'
|
||||
|
||||
const electron = require('electron')
|
||||
const {app, BrowserWindow, ipcMain, Menu, MenuItem, Tray, dialog, Notification} = electron
|
||||
const consts = require('./src/consts.js')
|
||||
const client = require('./src/client.js').init()
|
||||
const rl = require('readline').createInterface({input: client.socket})
|
||||
|
||||
let callbacks = {};
|
||||
let counters = {};
|
||||
let elements = {};
|
||||
let menus = {};
|
||||
let quittingApp = false;
|
||||
|
||||
// Single instance
|
||||
let lastWindow = null;
|
||||
if (process.argv[3] === "true") {
|
||||
// Lock
|
||||
const singlesInstanceLock = app.requestSingleInstanceLock();
|
||||
if (!singlesInstanceLock) {
|
||||
app.quit();
|
||||
return;
|
||||
}
|
||||
|
||||
// Someone tried to run a second instance, we should focus our window.
|
||||
app.on('second-instance', (event, commandLine, workingDirectory) => {
|
||||
if (lastWindow) {
|
||||
if (lastWindow.isMinimized()) lastWindow.restore();
|
||||
lastWindow.focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Command line switches
|
||||
let idx = 4;
|
||||
for (let i = idx; i < process.argv.length; i++) {
|
||||
let s = process.argv[i].replace(/^[\-]+/g,"");
|
||||
let v;
|
||||
if (typeof process.argv[i+1] !== "undefined" && !process.argv[i+1].startsWith("-")) {
|
||||
v = process.argv[i+1];
|
||||
i++;
|
||||
}
|
||||
app.commandLine.appendSwitch(s, v);
|
||||
}
|
||||
|
||||
// App is quitting
|
||||
app.on('before-quit', () => quittingApp = true);
|
||||
|
||||
// App is ready
|
||||
app.on('ready',() => {
|
||||
// Init
|
||||
const screen = electron.screen
|
||||
Menu.setApplicationMenu(null)
|
||||
|
||||
// Listen to screen events
|
||||
screen.on('display-added', function() {
|
||||
client.write(consts.targetIds.app, consts.eventNames.displayEventAdded, {displays: {all: screen.getAllDisplays(), primary: screen.getPrimaryDisplay()}})
|
||||
})
|
||||
screen.on('display-metrics-changed', function() {
|
||||
client.write(consts.targetIds.app, consts.eventNames.displayEventMetricsChanged, {displays: {all: screen.getAllDisplays(), primary: screen.getPrimaryDisplay()}})
|
||||
})
|
||||
screen.on('display-removed', function() {
|
||||
client.write(consts.targetIds.app, consts.eventNames.displayEventRemoved, {displays: {all: screen.getAllDisplays(), primary: screen.getPrimaryDisplay()}})
|
||||
})
|
||||
|
||||
// Listen on main ipcMain
|
||||
ipcMain.on(consts.eventNames.ipcEventMessage, (event, arg) => {
|
||||
let payload = {message: arg.message};
|
||||
if (typeof arg.callbackId !== "undefined") payload.callbackId = arg.callbackId;
|
||||
client.write(arg.targetID, consts.eventNames.windowEventMessage, payload)
|
||||
});
|
||||
ipcMain.on(consts.eventNames.ipcEventMessageCallback, (event, arg) => {
|
||||
let payload = {message: arg.message};
|
||||
if (typeof arg.callbackId !== "undefined") payload.callbackId = arg.callbackId;
|
||||
client.write(arg.targetID, consts.eventNames.windowEventMessageCallback, payload)
|
||||
});
|
||||
|
||||
// Read from client
|
||||
rl.on('line', function(line){
|
||||
// Parse the JSON
|
||||
let json = JSON.parse(line)
|
||||
|
||||
// Switch on event name
|
||||
let window;
|
||||
switch (json.name) {
|
||||
// App
|
||||
case consts.eventNames.appCmdQuit:
|
||||
app.quit();
|
||||
break;
|
||||
|
||||
// Dock
|
||||
case consts.eventNames.dockCmdBounce:
|
||||
let id = 0;
|
||||
if (typeof app.dock !== "undefined") {
|
||||
id = app.dock.bounce(json.bounceType);
|
||||
}
|
||||
client.write(consts.targetIds.dock, consts.eventNames.dockEventBouncing, {id: id});
|
||||
break;
|
||||
case consts.eventNames.dockCmdBounceDownloads:
|
||||
if (typeof app.dock !== "undefined") {
|
||||
app.dock.downloadFinished(json.filePath);
|
||||
}
|
||||
client.write(consts.targetIds.dock, consts.eventNames.dockEventDownloadsBouncing);
|
||||
break;
|
||||
case consts.eventNames.dockCmdCancelBounce:
|
||||
if (typeof app.dock !== "undefined") {
|
||||
app.dock.cancelBounce(json.id);
|
||||
}
|
||||
client.write(consts.targetIds.dock, consts.eventNames.dockEventBouncingCancelled);
|
||||
break;
|
||||
case consts.eventNames.dockCmdHide:
|
||||
if (typeof app.dock !== "undefined") {
|
||||
app.dock.hide();
|
||||
}
|
||||
client.write(consts.targetIds.dock, consts.eventNames.dockEventHidden);
|
||||
break;
|
||||
case consts.eventNames.dockCmdSetBadge:
|
||||
if (typeof app.dock !== "undefined") {
|
||||
app.dock.setBadge(json.badge);
|
||||
}
|
||||
client.write(consts.targetIds.dock, consts.eventNames.dockEventBadgeSet);
|
||||
break;
|
||||
case consts.eventNames.dockCmdSetIcon:
|
||||
if (typeof app.dock !== "undefined") {
|
||||
app.dock.setIcon(json.image);
|
||||
}
|
||||
client.write(consts.targetIds.dock, consts.eventNames.dockEventIconSet);
|
||||
break;
|
||||
case consts.eventNames.dockCmdShow:
|
||||
if (typeof app.dock !== "undefined") {
|
||||
app.dock.show();
|
||||
}
|
||||
client.write(consts.targetIds.dock, consts.eventNames.dockEventShown);
|
||||
break;
|
||||
|
||||
// Menu
|
||||
case consts.eventNames.menuCmdCreate:
|
||||
menuCreate(json.menu)
|
||||
menus[json.menu.rootId] = json.targetID
|
||||
setMenu(json.menu.rootId)
|
||||
client.write(json.targetID, consts.eventNames.menuEventCreated)
|
||||
break;
|
||||
case consts.eventNames.menuCmdDestroy:
|
||||
elements[json.targetID] = null
|
||||
if (menus[json.menu.rootId] === json.targetID) {
|
||||
menus[json.menu.rootId] = null
|
||||
setMenu(json.menu.rootId)
|
||||
}
|
||||
client.write(json.targetID, consts.eventNames.menuEventDestroyed)
|
||||
break;
|
||||
|
||||
// Menu item
|
||||
case consts.eventNames.menuItemCmdSetChecked:
|
||||
elements[json.targetID].checked = json.menuItemOptions.checked
|
||||
client.write(json.targetID, consts.eventNames.menuItemEventCheckedSet)
|
||||
break;
|
||||
case consts.eventNames.menuItemCmdSetEnabled:
|
||||
elements[json.targetID].enabled = json.menuItemOptions.enabled
|
||||
client.write(json.targetID, consts.eventNames.menuItemEventEnabledSet)
|
||||
break;
|
||||
case consts.eventNames.menuItemCmdSetLabel:
|
||||
elements[json.targetID].label = json.menuItemOptions.label
|
||||
client.write(json.targetID, consts.eventNames.menuItemEventLabelSet)
|
||||
break;
|
||||
case consts.eventNames.menuItemCmdSetVisible:
|
||||
elements[json.targetID].visible = json.menuItemOptions.visible
|
||||
client.write(json.targetID, consts.eventNames.menuItemEventVisibleSet)
|
||||
break;
|
||||
|
||||
// Notification
|
||||
case consts.eventNames.notificationCmdCreate:
|
||||
notificationCreate(json);
|
||||
break;
|
||||
case consts.eventNames.notificationCmdShow:
|
||||
if (Notification.isSupported()) {
|
||||
elements[json.targetID].show();
|
||||
}
|
||||
break;
|
||||
|
||||
// Session
|
||||
case consts.eventNames.sessionCmdClearCache:
|
||||
elements[json.targetID].clearCache(function() {
|
||||
client.write(json.targetID, consts.eventNames.sessionEventClearedCache)
|
||||
})
|
||||
break;
|
||||
|
||||
// Sub menu
|
||||
case consts.eventNames.subMenuCmdAppend:
|
||||
elements[json.targetID].append(menuItemCreate(json.menuItem))
|
||||
setMenu(json.menuItem.rootId)
|
||||
client.write(json.targetID, consts.eventNames.subMenuEventAppended)
|
||||
break;
|
||||
case consts.eventNames.subMenuCmdClosePopup:
|
||||
window = null
|
||||
if (typeof json.windowId !== "undefined") {
|
||||
window = elements[json.windowId]
|
||||
}
|
||||
elements[json.targetID].closePopup(window)
|
||||
client.write(json.targetID, consts.eventNames.subMenuEventClosedPopup)
|
||||
break;
|
||||
case consts.eventNames.subMenuCmdInsert:
|
||||
elements[json.targetID].insert(json.menuItemPosition, menuItemCreate(json.menuItem))
|
||||
setMenu(json.menuItem.rootId)
|
||||
client.write(json.targetID, consts.eventNames.subMenuEventInserted)
|
||||
break;
|
||||
case consts.eventNames.subMenuCmdPopup:
|
||||
window = null
|
||||
if (typeof json.windowId !== "undefined") {
|
||||
window = elements[json.windowId]
|
||||
}
|
||||
json.menuPopupOptions.async = true
|
||||
elements[json.targetID].popup(window, json.menuPopupOptions)
|
||||
client.write(json.targetID, consts.eventNames.subMenuEventPoppedUp)
|
||||
break;
|
||||
|
||||
// Tray
|
||||
case consts.eventNames.trayCmdCreate:
|
||||
trayCreate(json)
|
||||
break;
|
||||
case consts.eventNames.trayCmdDestroy:
|
||||
elements[json.targetID].destroy()
|
||||
elements[json.targetID] = null
|
||||
client.write(json.targetID, consts.eventNames.trayEventDestroyed)
|
||||
break;
|
||||
case consts.eventNames.trayCmdSetImage:
|
||||
elements[json.targetID].setImage(json.image);
|
||||
client.write(json.targetID, consts.eventNames.trayEventImageSet)
|
||||
break;
|
||||
|
||||
// Web contents
|
||||
case consts.eventNames.webContentsEventLoginCallback:
|
||||
executeCallback(consts.callbackNames.webContentsLogin, json, [json.username, json.password]);
|
||||
break;
|
||||
|
||||
// Window
|
||||
case consts.eventNames.windowCmdBlur:
|
||||
elements[json.targetID].blur()
|
||||
break;
|
||||
case consts.eventNames.windowCmdCenter:
|
||||
elements[json.targetID].center()
|
||||
break;
|
||||
case consts.eventNames.windowCmdClose:
|
||||
elements[json.targetID].close()
|
||||
break;
|
||||
case consts.eventNames.windowCmdCreate:
|
||||
windowCreate(json)
|
||||
break;
|
||||
case consts.eventNames.windowCmdDestroy:
|
||||
elements[json.targetID].destroy()
|
||||
elements[json.targetID] = null
|
||||
break;
|
||||
case consts.eventNames.windowCmdFocus:
|
||||
elements[json.targetID].focus()
|
||||
break;
|
||||
case consts.eventNames.windowCmdHide:
|
||||
elements[json.targetID].hide()
|
||||
break;
|
||||
case consts.eventNames.windowCmdLog:
|
||||
elements[json.targetID].webContents.send(consts.eventNames.ipcCmdLog, json.message)
|
||||
break;
|
||||
case consts.eventNames.windowCmdMaximize:
|
||||
elements[json.targetID].maximize()
|
||||
break;
|
||||
case consts.eventNames.windowCmdMessage:
|
||||
case consts.eventNames.windowCmdMessageCallback:
|
||||
let m = {message: json.message}
|
||||
if (typeof json.callbackId !== "undefined") m.callbackId = json.callbackId
|
||||
elements[json.targetID].webContents.send(json.name === consts.eventNames.windowCmdMessageCallback ? consts.eventNames.ipcCmdMessageCallback : consts.eventNames.ipcCmdMessage, m)
|
||||
break;
|
||||
case consts.eventNames.windowCmdMinimize:
|
||||
elements[json.targetID].minimize()
|
||||
break;
|
||||
case consts.eventNames.windowCmdMove:
|
||||
elements[json.targetID].setPosition(json.windowOptions.x, json.windowOptions.y, true)
|
||||
break;
|
||||
case consts.eventNames.windowCmdResize:
|
||||
elements[json.targetID].setSize(json.windowOptions.width, json.windowOptions.height, true)
|
||||
break;
|
||||
case consts.eventNames.windowCmdRestore:
|
||||
elements[json.targetID].restore()
|
||||
break;
|
||||
case consts.eventNames.windowCmdShow:
|
||||
elements[json.targetID].show()
|
||||
break;
|
||||
case consts.eventNames.windowCmdWebContentsCloseDevTools:
|
||||
elements[json.targetID].webContents.closeDevTools()
|
||||
break;
|
||||
case consts.eventNames.windowCmdWebContentsOpenDevTools:
|
||||
elements[json.targetID].webContents.openDevTools()
|
||||
break;
|
||||
case consts.eventNames.windowCmdUnmaximize:
|
||||
elements[json.targetID].unmaximize()
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// Send electron.ready event
|
||||
client.write(consts.targetIds.app, consts.eventNames.appEventReady, {
|
||||
displays: {
|
||||
all: screen.getAllDisplays(),
|
||||
primary: screen.getPrimaryDisplay()
|
||||
},
|
||||
supported: {
|
||||
notification: Notification.isSupported()
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// menuCreate creates a new menu
|
||||
function menuCreate(menu) {
|
||||
if (typeof menu !== "undefined") {
|
||||
elements[menu.id] = new Menu()
|
||||
for(let i = 0; i < menu.items.length; i++) {
|
||||
elements[menu.id].append(menuItemCreate(menu.items[i]))
|
||||
}
|
||||
return elements[menu.id]
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
// menuItemCreate creates a menu item
|
||||
function menuItemCreate(menuItem) {
|
||||
const itemId = menuItem.id
|
||||
menuItem.options.click = function(menuItem) {
|
||||
client.write(itemId, consts.eventNames.menuItemEventClicked, {menuItemOptions: menuItemToJSON(menuItem)})
|
||||
}
|
||||
if (typeof menuItem.submenu !== "undefined") {
|
||||
menuItem.options.type = 'submenu'
|
||||
menuItem.options.submenu = menuCreate(menuItem.submenu)
|
||||
}
|
||||
elements[itemId] = new MenuItem(menuItem.options)
|
||||
return elements[itemId]
|
||||
}
|
||||
|
||||
// menuItemToJSON returns the proper fields not to raise an exception
|
||||
function menuItemToJSON(menuItem) {
|
||||
return {
|
||||
checked: menuItem.checked,
|
||||
enabled: menuItem.enabled,
|
||||
label: menuItem.label,
|
||||
visible: menuItem.visible,
|
||||
}
|
||||
}
|
||||
|
||||
// setMenu sets a menu
|
||||
function setMenu(rootId) {
|
||||
let menu = null
|
||||
if (typeof menus[rootId] !== "undefined" && typeof elements[menus[rootId]] !== "undefined") {
|
||||
menu = elements[menus[rootId]]
|
||||
}
|
||||
if (rootId === consts.targetIds.app) {
|
||||
Menu.setApplicationMenu(menu)
|
||||
} else if (rootId === consts.targetIds.dock && typeof app.dock !== "undefined") {
|
||||
app.dock.setMenu(menu)
|
||||
} else if (elements[rootId].constructor === Tray) {
|
||||
elements[rootId].setContextMenu(menu);
|
||||
} else {
|
||||
elements[rootId].setMenu(menu);
|
||||
}
|
||||
}
|
||||
|
||||
// notificationCreate creates a notification
|
||||
function notificationCreate(json) {
|
||||
if (Notification.isSupported()) {
|
||||
elements[json.targetID] = new Notification(json.notificationOptions);
|
||||
elements[json.targetID].on('action', (event, index) => { client.write(json.targetID, consts.eventNames.notificationEventActioned, {index: index}) })
|
||||
elements[json.targetID].on('click', () => { client.write(json.targetID, consts.eventNames.notificationEventClicked) })
|
||||
elements[json.targetID].on('close', () => { client.write(json.targetID, consts.eventNames.notificationEventClosed) })
|
||||
elements[json.targetID].on('reply', (event, reply) => { client.write(json.targetID, consts.eventNames.notificationEventReplied, {reply: reply}) })
|
||||
elements[json.targetID].on('show', () => { client.write(json.targetID, consts.eventNames.notificationEventShown) })
|
||||
}
|
||||
client.write(json.targetID, consts.eventNames.notificationEventCreated)
|
||||
}
|
||||
|
||||
// trayCreate creates a tray
|
||||
function trayCreate(json) {
|
||||
elements[json.targetID] = new Tray(json.trayOptions.image);
|
||||
if (typeof json.trayOptions.tooltip !== "undefined") {
|
||||
elements[json.targetID].setToolTip(json.trayOptions.tooltip);
|
||||
}
|
||||
elements[json.targetID].on('click', (index, event) => { client.write(json.targetID, consts.eventNames.trayEventClicked, {"bounds":{x:event.x, y:event.y,width:event.width,height:event.height}})})
|
||||
elements[json.targetID].on('double-click', (index, event) => { client.write(json.targetID, consts.eventNames.trayEventDoubleClicked, {"bounds":{x:event.x, y:event.y,width:event.width,height:event.height}})})
|
||||
elements[json.targetID].on('right-click', (index, event) => { client.write(json.targetID, consts.eventNames.trayEventRightClicked, {"bounds":{x:event.x, y:event.y,width:event.width,height:event.height}})})
|
||||
client.write(json.targetID, consts.eventNames.trayEventCreated)
|
||||
}
|
||||
|
||||
// windowCreate creates a new window
|
||||
function windowCreate(json) {
|
||||
elements[json.targetID] = new BrowserWindow(json.windowOptions)
|
||||
if (typeof json.windowOptions.proxy !== "undefined") {
|
||||
elements[json.targetID].webContents.session.setProxy(json.windowOptions.proxy, function() {
|
||||
windowCreateFinish(json)
|
||||
})
|
||||
} else {
|
||||
windowCreateFinish(json)
|
||||
}
|
||||
}
|
||||
|
||||
// windowCreateFinish finishes creating a new window
|
||||
function windowCreateFinish(json) {
|
||||
elements[json.targetID].setMenu(null)
|
||||
elements[json.targetID].loadURL(json.url, (typeof json.windowOptions.load !== "undefined" ? json.windowOptions.load : {}));
|
||||
elements[json.targetID].on('blur', () => { client.write(json.targetID, consts.eventNames.windowEventBlur) })
|
||||
elements[json.targetID].on('close', (e) => {
|
||||
if (typeof json.windowOptions.custom !== "undefined") {
|
||||
if (typeof json.windowOptions.custom.messageBoxOnClose !== "undefined") {
|
||||
let buttonId = dialog.showMessageBox(null, json.windowOptions.custom.messageBoxOnClose)
|
||||
if (typeof json.windowOptions.custom.messageBoxOnClose.confirmId !== "undefined" && json.windowOptions.custom.messageBoxOnClose.confirmId !== buttonId) {
|
||||
e.preventDefault()
|
||||
return
|
||||
}
|
||||
}
|
||||
if (!quittingApp) {
|
||||
if (json.windowOptions.custom.minimizeOnClose) {
|
||||
e.preventDefault();
|
||||
elements[json.targetID].minimize();
|
||||
} else if (json.windowOptions.custom.hideOnClose) {
|
||||
e.preventDefault();
|
||||
elements[json.targetID].hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
elements[json.targetID].on('closed', () => {
|
||||
client.write(json.targetID, consts.eventNames.windowEventClosed)
|
||||
delete elements[json.targetID]
|
||||
})
|
||||
elements[json.targetID].on('focus', () => { client.write(json.targetID, consts.eventNames.windowEventFocus) })
|
||||
elements[json.targetID].on('hide', () => { client.write(json.targetID, consts.eventNames.windowEventHide) })
|
||||
elements[json.targetID].on('maximize', () => { client.write(json.targetID, consts.eventNames.windowEventMaximize) })
|
||||
elements[json.targetID].on('minimize', () => { client.write(json.targetID, consts.eventNames.windowEventMinimize) })
|
||||
elements[json.targetID].on('move', () => { client.write(json.targetID, consts.eventNames.windowEventMove) })
|
||||
elements[json.targetID].on('ready-to-show', () => { client.write(json.targetID, consts.eventNames.windowEventReadyToShow) })
|
||||
elements[json.targetID].on('resize', () => { client.write(json.targetID, consts.eventNames.windowEventResize) })
|
||||
elements[json.targetID].on('restore', () => { client.write(json.targetID, consts.eventNames.windowEventRestore) })
|
||||
elements[json.targetID].on('show', () => { client.write(json.targetID, consts.eventNames.windowEventShow) })
|
||||
elements[json.targetID].on('unmaximize', () => { client.write(json.targetID, consts.eventNames.windowEventUnmaximize) })
|
||||
elements[json.targetID].on('unresponsive', () => { client.write(json.targetID, consts.eventNames.windowEventUnresponsive) })
|
||||
elements[json.targetID].webContents.on('did-finish-load', () => {
|
||||
elements[json.targetID].webContents.executeJavaScript(
|
||||
`const {ipcRenderer} = require('electron')
|
||||
const {dialog} = require('electron').remote
|
||||
var astilectron = {
|
||||
onMessageOnce: false,
|
||||
onMessage: function(callback) {
|
||||
if (astilectron.onMessageOnce) {
|
||||
return
|
||||
}
|
||||
ipcRenderer.on('`+ consts.eventNames.ipcCmdMessage +`', function(event, message) {
|
||||
let v = callback(message.message)
|
||||
if (typeof message.callbackId !== "undefined") {
|
||||
let e = {callbackId: message.callbackId, targetID: '`+ json.targetID +`'}
|
||||
if (typeof v !== "undefined") e.message = v
|
||||
ipcRenderer.send('`+ consts.eventNames.ipcEventMessageCallback +`', e)
|
||||
}
|
||||
})
|
||||
astilectron.onMessageOnce = true
|
||||
},
|
||||
callbacks: {},
|
||||
counters: {},
|
||||
registerCallback: function(k, e, c, n) {
|
||||
e.targetID = '`+ json.targetID +`';
|
||||
if (typeof c !== "undefined") {
|
||||
if (typeof astilectron.counters[k] === "undefined") {
|
||||
astilectron.counters[k] = 1;
|
||||
}
|
||||
e.callbackId = String(astilectron.counters[k]++);
|
||||
if (typeof astilectron.callbacks[k] === "undefined") {
|
||||
astilectron.callbacks[k] = {};
|
||||
}
|
||||
astilectron.callbacks[k][e.callbackId] = c;
|
||||
}
|
||||
ipcRenderer.send(n, e);
|
||||
},
|
||||
executeCallback: function(k, message, args) {
|
||||
if (typeof astilectron.callbacks[k][message.callbackId] !== "undefined") {
|
||||
astilectron.callbacks[k][message.callbackId].apply(null, args);
|
||||
}
|
||||
},
|
||||
sendMessage: function(message, callback) {
|
||||
astilectron.registerCallback('` + consts.callbackNames.webContentsMessage + `', {message: message}, callback, '`+ consts.eventNames.ipcEventMessage +`');
|
||||
},
|
||||
showErrorBox: function(title, content) {
|
||||
dialog.showErrorBox(title, content)
|
||||
},
|
||||
showMessageBox: function(options, callback) {
|
||||
dialog.showMessageBox(null, options, callback)
|
||||
},
|
||||
showOpenDialog: function(options, callback) {
|
||||
dialog.showOpenDialog(null, options, callback)
|
||||
},
|
||||
showSaveDialog: function(options, callback) {
|
||||
dialog.showSaveDialog(null, options, callback)
|
||||
}
|
||||
};
|
||||
ipcRenderer.on('`+ consts.eventNames.ipcCmdMessageCallback +`', function(event, message) {
|
||||
astilectron.executeCallback('` + consts.callbackNames.webContentsMessage + `', message, [message.message]);
|
||||
});
|
||||
ipcRenderer.on('`+ consts.eventNames.ipcCmdLog+`', function(event, message) {
|
||||
console.log(message)
|
||||
});
|
||||
` + (typeof json.windowOptions.custom !== "undefined" && typeof json.windowOptions.custom.script !== "undefined" ? json.windowOptions.custom.script : "") + `
|
||||
document.dispatchEvent(new Event('astilectron-ready'))`
|
||||
)
|
||||
sessionCreate(elements[json.targetID].webContents, json.sessionId)
|
||||
client.write(json.targetID, consts.eventNames.windowEventDidFinishLoad)
|
||||
})
|
||||
elements[json.targetID].webContents.on('did-get-redirect-request', (event, oldUrl, newUrl) => {
|
||||
client.write(json.targetID, consts.eventNames.windowEventDidGetRedirectRequest, {
|
||||
newUrl: newUrl,
|
||||
oldUrl: oldUrl
|
||||
})
|
||||
})
|
||||
elements[json.targetID].webContents.on('login', (event, request, authInfo, callback) => {
|
||||
event.preventDefault();
|
||||
registerCallback(json, consts.callbackNames.webContentsLogin, {authInfo: authInfo, request: request}, consts.eventNames.webContentsEventLogin, callback);
|
||||
})
|
||||
elements[json.targetID].webContents.on('will-navigate', (event, url) => {
|
||||
client.write(json.targetID, consts.eventNames.windowEventWillNavigate, {
|
||||
url: url
|
||||
})
|
||||
})
|
||||
lastWindow = elements[json.targetID]
|
||||
}
|
||||
|
||||
function registerCallback(json, k, e, n, c) {
|
||||
if (typeof counters[k] === "undefined") {
|
||||
counters[k] = 1;
|
||||
}
|
||||
e.callbackId = String(counters[k]++);
|
||||
if (typeof callbacks[k] === "undefined") {
|
||||
callbacks[k] = {};
|
||||
}
|
||||
callbacks[k][e.callbackId] = c;
|
||||
client.write(json.targetID, n, e);
|
||||
}
|
||||
|
||||
function executeCallback(k, json, args) {
|
||||
if (typeof callbacks[k][json.callbackId] !== "undefined") {
|
||||
callbacks[k][json.callbackId].apply(null, args);
|
||||
}
|
||||
}
|
||||
|
||||
function sessionCreate(webContents, sessionId) {
|
||||
elements[sessionId] = webContents.session
|
||||
elements[sessionId].on('will-download', () => { client.write(sessionId, consts.eventNames.sessionEventWillDownload) })
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"name": "Astilectron",
|
||||
"description": "Electron-based cross-language application framework",
|
||||
"devDependencies": {
|
||||
"electron": "1.8.1"
|
||||
}
|
||||
}
|
61
astilectron-deps/vendor/astilectron/readme.md
vendored
61
astilectron-deps/vendor/astilectron/readme.md
vendored
|
@ -1,61 +0,0 @@
|
|||
`astilectron` is an Electron app that provides an API over a TCP socket that allows executing Electron's method as well as capturing Electron's events.
|
||||
|
||||
# Architecture
|
||||
|
||||
+-----------------------+ TCP +-------------+ IPC +---------------------+
|
||||
+ Client App (any Lang) |<--------->+ Astilectron +<-------->+ win1: (HTML/JS/CSS) +
|
||||
+-----------------------+ +-------------+ | +---------------------++
|
||||
| | +---->+ win2: (HTML/JS/CSS) +
|
||||
| +----------+ | | +---------------------++
|
||||
+---------+ Electron +--------+ +-->+ win3: (HTML/JS/CSS) +
|
||||
+----------+ +---------------------+
|
||||
|
||||
# Language bindings
|
||||
|
||||
Language bindings play a major role with `astilectron` as they allow communicating with its TCP socket and therefore interacting with its API in any language.
|
||||
|
||||
## I want to develop language bindings for a new language
|
||||
|
||||
Great! :)
|
||||
|
||||
Here's a few things you need to know:
|
||||
|
||||
- it's the responsibility of the language bindings to provision `astilectron` which usually consists of downloading and unzipping `astilectron` as well as `electron`
|
||||
- the TCP addr is sent to `astilectron` through a command line argument therefore your command line when calling `astilectron` should look like `<path to electron executable> <path to astilectron directory>/main.js <tcp addr>`
|
||||
|
||||
## Language bindings for GO
|
||||
|
||||
Check out [go-astilectron](https://github.com/asticode/go-astilectron) for `astilectron` GO language bindings
|
||||
|
||||
# Features and roadmap
|
||||
|
||||
- [x] window basic methods (create, show, close, resize, minimize, maximize, ...)
|
||||
- [x] window basic events (close, blur, focus, unresponsive, crashed, ...)
|
||||
- [x] remote messaging (messages between GO and the JS in the webserver)
|
||||
- [x] multi screens/displays
|
||||
- [x] menu methods and events (create, insert, append, popup, clicked, ...)
|
||||
- [x] dialogs (open or save file, alerts, ...)
|
||||
- [ ] accelerators (shortcuts)
|
||||
- [ ] file methods (drag & drop, ...)
|
||||
- [ ] clipboard methods
|
||||
- [ ] power monitor events (suspend, resume, ...)
|
||||
- [ ] notifications (macosx)
|
||||
- [ ] desktop capturer (audio and video)
|
||||
- [ ] session methods
|
||||
- [ ] session events
|
||||
- [ ] window advanced options (add missing ones)
|
||||
- [ ] window advanced methods (add missing ones)
|
||||
- [ ] window advanced events (add missing ones)
|
||||
- [ ] child windows
|
||||
|
||||
# Contribute
|
||||
|
||||
For now only GO has its official bindings with `astilectron`, but the more language has its bindings the better! Therefore if you feel like implementing bindings with `astilectron` in some other language feel free to reach out to me to get some more info and finally to get your repo listed here.
|
||||
|
||||
Also I'm far from being an expert in Node.JS therefore if you see anything that seems wrong in `astilectron` feel free to create an issue or even better contribute through a PR!
|
||||
|
||||
You know you want to! :D
|
||||
|
||||
# Cheers to
|
||||
|
||||
[thrust](https://github.com/breach/thrust) which is awesome but unfortunately not maintained anymore. It inspired this project.
|
|
@ -1,27 +0,0 @@
|
|||
'use strict'
|
||||
|
||||
const net = require('net');
|
||||
const url = require('url');
|
||||
|
||||
// Client can read/write messages from a TCP server
|
||||
class Client {
|
||||
// init initializes the Client
|
||||
init() {
|
||||
let u = url.parse("tcp://" + process.argv[2], false, false)
|
||||
this.socket = new net.Socket()
|
||||
this.socket.connect(u.port, u.hostname, function() {});
|
||||
this.socket.on('close', function() {
|
||||
process.exit()
|
||||
})
|
||||
return this
|
||||
}
|
||||
|
||||
// write writes an event to the server
|
||||
write(targetID, eventName, payload) {
|
||||
let data = {name: eventName, targetID: targetID}
|
||||
if (typeof payload !== "undefined") Object.assign(data, payload)
|
||||
this.socket.write(JSON.stringify(data) + "\n")
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new Client()
|
118
astilectron-deps/vendor/astilectron/src/consts.js
vendored
118
astilectron-deps/vendor/astilectron/src/consts.js
vendored
|
@ -1,118 +0,0 @@
|
|||
'use strict'
|
||||
|
||||
module.exports = {
|
||||
callbackNames: {
|
||||
webContentsLogin: "web.contents.login",
|
||||
webContentsMessage: "web.contents.message",
|
||||
},
|
||||
eventNames: {
|
||||
appCmdQuit: "app.cmd.quit",
|
||||
appEventReady: "app.event.ready",
|
||||
displayEventAdded: "display.event.added",
|
||||
displayEventMetricsChanged: "display.event.metrics.changed",
|
||||
displayEventRemoved: "display.event.removed",
|
||||
dockCmdBounce: "dock.cmd.bounce",
|
||||
dockCmdBounceDownloads: "dock.cmd.bounce.downloads",
|
||||
dockCmdCancelBounce: "dock.cmd.cancel.bounce",
|
||||
dockCmdHide: "dock.cmd.hide",
|
||||
dockCmdSetBadge: "dock.cmd.set.badge",
|
||||
dockCmdSetIcon: "dock.cmd.set.icon",
|
||||
dockCmdShow: "dock.cmd.show",
|
||||
dockEventBadgeSet: "dock.event.badge.set",
|
||||
dockEventBouncing: "dock.event.bouncing",
|
||||
dockEventBouncingCancelled: "dock.event.bouncing.cancelled",
|
||||
dockEventDownloadsBouncing: "dock.event.download.bouncing",
|
||||
dockEventHidden: "dock.event.hidden",
|
||||
dockEventIconSet: "dock.event.icon.set",
|
||||
dockEventShown: "dock.event.shown",
|
||||
ipcCmdLog: "ipc.cmd.log",
|
||||
ipcCmdMessage: "ipc.cmd.message",
|
||||
ipcCmdMessageCallback: "ipc.cmd.message.callback",
|
||||
ipcEventMessage: "ipc.event.message",
|
||||
ipcEventMessageCallback: "ipc.event.message.callback",
|
||||
menuCmdCreate: "menu.cmd.create",
|
||||
menuCmdDestroy: "menu.cmd.destroy",
|
||||
menuEventCreated: "menu.event.created",
|
||||
menuEventDestroyed: "menu.event.destroyed",
|
||||
menuItemCmdSetChecked: "menu.item.cmd.set.checked",
|
||||
menuItemCmdSetEnabled: "menu.item.cmd.set.enabled",
|
||||
menuItemCmdSetLabel: "menu.item.cmd.set.label",
|
||||
menuItemCmdSetVisible: "menu.item.cmd.set.visible",
|
||||
menuItemEventCheckedSet: "menu.item.event.checked.set",
|
||||
menuItemEventClicked: "menu.item.event.clicked",
|
||||
menuItemEventEnabledSet: "menu.item.event.enabled.set",
|
||||
menuItemEventLabelSet: "menu.item.event.label.set",
|
||||
menuItemEventVisibleSet: "menu.item.event.visible.set",
|
||||
notificationCmdCreate: "notification.cmd.create",
|
||||
notificationCmdShow: "notification.cmd.show",
|
||||
notificationEventActioned: "notification.event.actioned",
|
||||
notificationEventClicked: "notification.event.clicked",
|
||||
notificationEventClosed: "notification.event.closed",
|
||||
notificationEventCreated: "notification.event.created",
|
||||
notificationEventReplied: "notification.event.replied",
|
||||
notificationEventShown: "notification.event.shown",
|
||||
sessionCmdClearCache: "session.cmd.clear.cache",
|
||||
sessionEventClearedCache: "session.event.cleared.cache",
|
||||
sessionEventWillDownload: "session.event.will.download",
|
||||
subMenuCmdAppend: "sub.menu.cmd.append",
|
||||
subMenuCmdClosePopup: "sub.menu.cmd.close.popup",
|
||||
subMenuCmdInsert: "sub.menu.cmd.insert",
|
||||
subMenuCmdPopup: "sub.menu.cmd.popup",
|
||||
subMenuEventAppended: "sub.menu.event.appended",
|
||||
subMenuEventClosedPopup: "sub.menu.event.closed.popup",
|
||||
subMenuEventInserted: "sub.menu.event.inserted",
|
||||
subMenuEventPoppedUp: "sub.menu.event.popped.up",
|
||||
trayCmdCreate: "tray.cmd.create",
|
||||
trayCmdDestroy: "tray.cmd.destroy",
|
||||
trayCmdSetImage: "tray.cmd.set.image",
|
||||
trayEventClicked: "tray.event.clicked",
|
||||
trayEventCreated: "tray.event.created",
|
||||
trayEventDestroyed: "tray.event.destroyed",
|
||||
trayEventDoubleClicked: "tray.event.double.clicked",
|
||||
trayEventImageSet: "tray.event.image.set",
|
||||
trayEventRightClicked: "tray.event.right.clicked",
|
||||
webContentsEventLogin: "web.contents.event.login",
|
||||
webContentsEventLoginCallback: "web.contents.event.login.callback",
|
||||
windowCmdBlur: "window.cmd.blur",
|
||||
windowCmdCenter: "window.cmd.center",
|
||||
windowCmdClose: "window.cmd.close",
|
||||
windowCmdCreate: "window.cmd.create",
|
||||
windowCmdDestroy: "window.cmd.destroy",
|
||||
windowCmdFocus: "window.cmd.focus",
|
||||
windowCmdHide: "window.cmd.hide",
|
||||
windowCmdLog: "window.cmd.log",
|
||||
windowCmdMaximize: "window.cmd.maximize",
|
||||
windowCmdMessage: "window.cmd.message",
|
||||
windowCmdMessageCallback: "window.cmd.message.callback",
|
||||
windowCmdMinimize: "window.cmd.minimize",
|
||||
windowCmdMove: "window.cmd.move",
|
||||
windowCmdResize: "window.cmd.resize",
|
||||
windowCmdRestore: "window.cmd.restore",
|
||||
windowCmdShow: "window.cmd.show",
|
||||
windowCmdUnmaximize: "window.cmd.unmaximize",
|
||||
windowCmdWebContentsCloseDevTools: "window.cmd.web.contents.close.dev.tools",
|
||||
windowCmdWebContentsOpenDevTools: "window.cmd.web.contents.open.dev.tools",
|
||||
windowEventBlur: "window.event.blur",
|
||||
windowEventClosed: "window.event.closed",
|
||||
windowEventDidFinishLoad: "window.event.did.finish.load",
|
||||
windowEventDidGetRedirectRequest: "window.event.did.get.redirect.request",
|
||||
windowEventWillNavigate: "window.event.will.navigate",
|
||||
windowEventFocus: "window.event.focus",
|
||||
windowEventHide: "window.event.hide",
|
||||
windowEventMaximize: "window.event.maximize",
|
||||
windowEventMessage: "window.event.message",
|
||||
windowEventMessageCallback: "window.event.message.callback",
|
||||
windowEventMinimize: "window.event.minimize",
|
||||
windowEventMove: "window.event.move",
|
||||
windowEventReadyToShow: "window.event.ready.to.show",
|
||||
windowEventResize: "window.event.resize",
|
||||
windowEventRestore: "window.event.restore",
|
||||
windowEventShow: "window.event.show",
|
||||
windowEventUnmaximize: "window.event.unmaximize",
|
||||
windowEventUnresponsive: "window.event.unresponsive"
|
||||
},
|
||||
targetIds: {
|
||||
app: 'app',
|
||||
dock: 'dock'
|
||||
}
|
||||
}
|
BIN
astilectron-deps/vendor/electron-linux-amd64-v4.0.1.zip
(Stored with Git LFS)
vendored
BIN
astilectron-deps/vendor/electron-linux-amd64-v4.0.1.zip
(Stored with Git LFS)
vendored
Binary file not shown.
|
@ -1,20 +0,0 @@
|
|||
Copyright (c) 2013-2018 GitHub Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
4.0.1
|
BIN
astilectron-deps/vendor/electron-v1.6.5.zip
(Stored with Git LFS)
vendored
BIN
astilectron-deps/vendor/electron-v1.6.5.zip
(Stored with Git LFS)
vendored
Binary file not shown.
20
astilectron-deps/vendor/electron/LICENSE
vendored
20
astilectron-deps/vendor/electron/LICENSE
vendored
|
@ -1,20 +0,0 @@
|
|||
Copyright (c) 2013-2017 GitHub Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
33911
astilectron-deps/vendor/electron/LICENSES.chromium.html
vendored
33911
astilectron-deps/vendor/electron/LICENSES.chromium.html
vendored
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
BIN
astilectron-deps/vendor/electron/content_shell.pak
vendored
BIN
astilectron-deps/vendor/electron/content_shell.pak
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/electron
vendored
BIN
astilectron-deps/vendor/electron/electron
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/icudtl.dat
vendored
BIN
astilectron-deps/vendor/electron/icudtl.dat
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/libffmpeg.so
vendored
BIN
astilectron-deps/vendor/electron/libffmpeg.so
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/libnode.so
vendored
BIN
astilectron-deps/vendor/electron/libnode.so
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/locales/am.pak
vendored
BIN
astilectron-deps/vendor/electron/locales/am.pak
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/locales/ar.pak
vendored
BIN
astilectron-deps/vendor/electron/locales/ar.pak
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/locales/bg.pak
vendored
BIN
astilectron-deps/vendor/electron/locales/bg.pak
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/locales/bn.pak
vendored
BIN
astilectron-deps/vendor/electron/locales/bn.pak
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/locales/ca.pak
vendored
BIN
astilectron-deps/vendor/electron/locales/ca.pak
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/locales/cs.pak
vendored
BIN
astilectron-deps/vendor/electron/locales/cs.pak
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/locales/da.pak
vendored
BIN
astilectron-deps/vendor/electron/locales/da.pak
vendored
Binary file not shown.
BIN
astilectron-deps/vendor/electron/locales/de.pak
vendored
BIN
astilectron-deps/vendor/electron/locales/de.pak
vendored
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user