electron launcher
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

308 lines
10 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. const {BrowserWindow} = require('electron');
  2. const ipc = require('electron').ipcMain;
  3. // const screen = require('electron').screen;
  4. const store = require('./windows/lib/store');
  5. const {create: createMainWindow} = require('./windows/main')
  6. // const { create: createLoginWindow } = require('./windows/login')
  7. // const { create: createAppWindow } = require('./windows/app')
  8. const childProcess = require('./child_process')
  9. const { create: openWindow } = require('./windows/application')
  10. const {MAIN_WINDOW_FLAG, SUSPENSION_WINDOW_FLAG} = require('./constant');
  11. // const installApp = require('./ipc/installApp');
  12. // const getApps = require('./ipc/getApps');
  13. // const removeApp = require('./ipc/removeApp');
  14. // connect redis
  15. const { createClient } = require('redis')
  16. ;(async () => {
  17. /**
  18. * createClient({
  19. * url: 'redis://alice:foobared@awesome.redis.server:6380'
  20. * });
  21. */
  22. const client = createClient()
  23. client.on('error', (err) => console.log('Redis Client Error', err));
  24. await client.connect()
  25. // 订阅者
  26. const subscriber = client.duplicate();
  27. await subscriber.connect();
  28. // 发布者
  29. const publisher = client.duplicate()
  30. await publisher.connect()
  31. // 通过main向外发布消息
  32. ipc.on('publishMessage', (events, { channel, ...message }) => {
  33. publisher.publish(channel, JSON.stringify(message))
  34. })
  35. // 订阅外部消息
  36. subscriber.subscribe('openMap', message => {
  37. const windows = BrowserWindow.getAllWindows()
  38. const found = windows.find((window) => {
  39. return window[SUSPENSION_WINDOW_FLAG]
  40. });
  41. found.webContents.send('openMap', JSON.parse(message))
  42. })
  43. // 订阅外部消息(正则)
  44. subscriber.pSubscribe('openMap*', (message, channel) => {
  45. const windows = BrowserWindow.getAllWindows()
  46. const found = windows.find((window) => {
  47. return window[SUSPENSION_WINDOW_FLAG]
  48. });
  49. found.webContents.send(channel, JSON.parse(message))
  50. })
  51. })();
  52. module.exports = () => {
  53. let winStartPostion = {x: 0, y: 0};
  54. let mouseStartPosition = {x: 0, y: 0};
  55. let movingInterVal = null;
  56. ipc.on('getUnReadMessage', (events, callback) => {
  57. const msg = store.get('unReadMessage');
  58. // console.log('msg', msg);
  59. const windows = BrowserWindow.getAllWindows()
  60. const found = windows.find((window) => {
  61. return window[SUSPENSION_WINDOW_FLAG]
  62. });
  63. found.webContents.send("getUnReadMessage", [msg])
  64. });
  65. ipc.on('setUnReadMessage', (events, message) => {
  66. // console.log('set', message);
  67. store.set('unReadMessage', message);
  68. // 消息需要实时同步
  69. const windows = BrowserWindow.getAllWindows()
  70. const win = windows.find((window) => {
  71. return window[SUSPENSION_WINDOW_FLAG]
  72. });
  73. if (win) {
  74. // let winWidth = win.getSize()[0];
  75. let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize;
  76. const x = win.getPosition()[0];
  77. const y = win.getPosition()[1];
  78. let sWidth = areaSize.width;
  79. // console.log(sWidth - x);
  80. if (sWidth - x === 130) {
  81. win.setSize(640, 130, true);
  82. win.setPosition(sWidth - 660, y, true);
  83. }
  84. win.webContents.send("getUnReadMessage", [message])
  85. }
  86. });
  87. ipc.on("showSuspensionWindow",()=>{
  88. let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize;
  89. const windows = BrowserWindow.getAllWindows()
  90. const win = windows.find((window) => {
  91. return window[SUSPENSION_WINDOW_FLAG]
  92. });
  93. console.log('恢复原始大小')
  94. win.setSize(640, 130, true);
  95. const y = win.getPosition()[1];
  96. win.setPosition(areaSize.width - win.getSize()[0], y, true);
  97. win.webContents.send("winResize", [win.getSize()])
  98. })
  99. ipc.on('resizeWindow', () => {
  100. let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize;
  101. const windows = BrowserWindow.getAllWindows()
  102. const win = windows.find((window) => {
  103. return window[SUSPENSION_WINDOW_FLAG]
  104. });
  105. const startWidth = win.getSize()[0];
  106. if(startWidth < 640){
  107. const x = win.getPosition()[0];
  108. const y = win.getPosition()[1];
  109. win.setSize(640, 130, true);
  110. if(x > areaSize.width - win.getSize()[0] ){
  111. win.setPosition(areaSize.width - win.getSize()[0] - 50, y, true);
  112. }
  113. }
  114. });
  115. ipc.on('windowMoveHandle', (events, canMoving) => {
  116. const windows = BrowserWindow.getAllWindows()
  117. const win = windows.find((window) => {
  118. return window[SUSPENSION_WINDOW_FLAG]
  119. });
  120. const screen = require('electron').screen;
  121. /**
  122. * 窗口移动事件
  123. */
  124. if (canMoving) {
  125. if (!win) return;
  126. //读取原位置
  127. const winPosition = win.getPosition();
  128. winStartPostion = {x: winPosition[0], y: winPosition[1]};
  129. mouseStartPosition = screen.getCursorScreenPoint();
  130. //清除
  131. if (movingInterVal) {
  132. clearInterval(movingInterVal);
  133. }
  134. //新开
  135. movingInterVal = setInterval(() => {
  136. const cursorPosition = screen.getCursorScreenPoint();
  137. const x = winStartPostion.x + cursorPosition.x - mouseStartPosition.x;
  138. const y = winStartPostion.y + cursorPosition.y - mouseStartPosition.y;
  139. win.setPosition(x, y, true)
  140. }, 20)
  141. } else {
  142. clearInterval(movingInterVal);
  143. let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize;
  144. const x = win.getPosition()[0];
  145. const y = win.getPosition()[1];
  146. store.set("position",{x,y});
  147. let sWidth = areaSize.width;
  148. let winWidth = win.getSize()[0];
  149. // console.log(x + winWidth >= sWidth, sWidth - x - winWidth);
  150. // 靠边吸附效果
  151. console.log("0000000",x + winWidth >= sWidth,sWidth - x - winWidth <= 20)
  152. if (x + winWidth >= sWidth || sWidth - x - winWidth <= 20) {
  153. win.setResizable(true);
  154. win.setSize(130,130,true)
  155. win.setPosition(sWidth - 130, y, true);
  156. win.setResizable(false);
  157. console.log("靠边吸附",win.getSize(),win.getPosition())
  158. //通知渲染进程大小发生改变
  159. }else{
  160. win.setSize(650,130,true)
  161. }
  162. win.webContents.send("winResize", [win.getSize()])
  163. movingInterVal = null;
  164. }
  165. });
  166. ipc.on('showMainWindow', (event, arg) => {
  167. const windows = BrowserWindow.getAllWindows()
  168. const found = windows.find((window) => {
  169. return window[MAIN_WINDOW_FLAG]
  170. })
  171. if (found) {
  172. found.restore();
  173. found.show();
  174. } else {
  175. createMainWindow()
  176. }
  177. return true
  178. });
  179. ipc.on('hideMainWindow', () => {
  180. const windows = BrowserWindow.getAllWindows()
  181. const found = windows.find((window) => {
  182. return window[MAIN_WINDOW_FLAG]
  183. })
  184. if (found) {
  185. found.hide();
  186. }
  187. return true
  188. });
  189. ipc.on('minimize', () => {
  190. const windows = BrowserWindow.getAllWindows()
  191. const found = windows.find((window) => {
  192. return window[MAIN_WINDOW_FLAG]
  193. })
  194. if (found) {
  195. found.minimize();
  196. }
  197. return true
  198. });
  199. ipc.on('hideSuspensionWindow', (event, arg) => {
  200. const windows = BrowserWindow.getAllWindows()
  201. const found = windows.find((window) => {
  202. return window[SUSPENSION_WINDOW_FLAG]
  203. });
  204. if (found) {
  205. found.close()
  206. }
  207. return true
  208. });
  209. ipc.on('openDevTools', (event, arg) => {
  210. event.sender.webContents.openDevTools()
  211. return true
  212. });
  213. ipc.on('exitSystem', () => {
  214. const windows = BrowserWindow.getAllWindows()
  215. const mainWindow = windows.find((window) => {
  216. return window[MAIN_WINDOW_FLAG]
  217. })
  218. const suspWindow = windows.find((window) => {
  219. return window[SUSPENSION_WINDOW_FLAG]
  220. });
  221. store.delete("unReadMessage");
  222. mainWindow && mainWindow.close();
  223. suspWindow && suspWindow.close();
  224. });
  225. // ipc.handle('openWidget', (event, widget = {}) => {
  226. // createAppWindow(widget)
  227. // return true
  228. // });
  229. //
  230. // ipc.handle('openDevTools', (event, arg) => {
  231. // event.sender.webContents.openDevTools()
  232. // return true
  233. // });
  234. // ipc.handle('installApp', installApp);
  235. //
  236. // ipc.handle('getApps', getApps);
  237. //
  238. // ipc.handle('removeApp', removeApp);
  239. /* ipcRenderer
  240. ipcRenderer.send('spawn', {
  241. command: '微信.exe',
  242. args: null || ['--disable-cache'],
  243. key: + new Date // 唯一key,用来做关闭识别,
  244. })
  245. */
  246. ipc.on('spawn', (event, arg) => {
  247. const { pid, promise } = childProcess.start(arg.command, arg.args, arg.key)
  248. event.sender.send('spawn-success', {
  249. key: arg.key,
  250. pid
  251. })
  252. promise.then(data => {
  253. event.sender.send('spawn-success', {
  254. key: arg.key,
  255. data
  256. })
  257. })
  258. promise.catch(err => {
  259. event.sender.send('spawn-error', {
  260. key: arg.key,
  261. err
  262. })
  263. })
  264. })
  265. // ipcRenderer.send('kill-process', [pid])
  266. ipc.on('kill-process', function (event, arg) {
  267. childProcess.kill(arg[0])
  268. })
  269. // 通信桥梁
  270. ipc.on('bridge', function (event, { channel, ...message }) {
  271. console.log('bridge message', channel, message)
  272. const windows = BrowserWindow.getAllWindows()
  273. const found = windows.find((window) => {
  274. return window[SUSPENSION_WINDOW_FLAG]
  275. });
  276. found.webContents.send(channel, message)
  277. })
  278. // 通过main打开新窗口
  279. ipc.on('openWindow', function (event, arg) {
  280. console.log('openWindow request from renderer process', arg)
  281. if (!arg.id || !arg.entry) {
  282. return;
  283. }
  284. openWindow(arg)
  285. })
  286. }