-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
core.cljs
95 lines (80 loc) · 3.11 KB
/
core.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
(ns electron.core
(:require [electron.handler :as handler]
[electron.updater :refer [init-updater]]
[electron.utils :refer [mac? win32? prod? dev? log]]
[clojure.string :as string]
["fs" :as fs]
["path" :as path]
["electron" :refer [BrowserWindow app protocol] :as electron]))
(def ROOT_PATH (path/join js/__dirname ".."))
(def MAIN_WINDOW_ENTRY (str "file://" (path/join js/__dirname (if dev? "dev.html" "index.html"))))
(def ^:dynamic *setup-fn* nil)
(def ^:dynamic *teardown-fn* nil)
(def ^:dynamic *teardown-updater* nil)
(def ^:dynamic *teardown-interceptor* nil)
;; Handle creating/removing shortcuts on Windows when installing/uninstalling.
(when (js/require "electron-squirrel-startup") (.quit app))
(defn create-main-window
"create main app window"
[]
(let [win-opts {:width 980
:height 700
:webPreferences
{:nodeIntegration false
:nodeIntegrationInWorker false
:contextIsolation true
:preload (path/join js/__dirname "js/preload.js")}}
url MAIN_WINDOW_ENTRY
win (BrowserWindow. (clj->js win-opts))]
(.loadURL win url)
(when dev? (.. win -webContents (openDevTools)))
win))
(defn setup-updater! [^js win]
(.. log (info (str "Logseq App(" (.getVersion app) ") Starting... ")))
;; manual updater
(set! *teardown-updater*
(init-updater {:repo "logseq/logseq"
:logger log
:win win})))
(defn setup-interceptor! []
(.registerFileProtocol
protocol "assets"
(fn [^js request callback]
(let [url (.-url request)
path (string/replace url "assets://" "")]
(callback #js {:path path}))))
(set! *teardown-interceptor* #(.unregisterProtocol protocol "assets")))
(defn main
[]
(.on app "window-all-closed" #(when-not mac? (.quit app)))
(.on app "ready"
(fn []
(let [^js win (create-main-window)
*win (atom win)
*quitting? (atom false)]
(set! *setup-fn*
(fn []
;; updater
(setup-updater! win)
(setup-interceptor!)
;; handler
(handler/set-ipc-handler! win)
;; teardown
#(do
(when *teardown-updater* (*teardown-updater*))
(when *teardown-interceptor* (*teardown-interceptor*)))))
;; setup effects
(*setup-fn*)
;; main window events
(.on win "close" #(if (or @*quitting? win32?)
(reset! *win nil)
(do (.preventDefault ^js/Event %)
(.hide win))))
(.on app "before-quit" #(reset! *quitting? true))
(.on app "activate" #(if @*win (.show win)))))))
(defn start []
(js/console.log "Main - start")
(when *setup-fn* (*setup-fn*)))
(defn stop []
(js/console.log "Main - stop")
(when *teardown-fn* (*teardown-fn*)))