diff --git a/be/app/api.go b/be/app/api.go
index 7f2ebc0..75c16f8 100644
--- a/be/app/api.go
+++ b/be/app/api.go
@@ -1,21 +1,21 @@
/*
-Macrame is a program that enables the user to create keyboard macros and button panels.
-The macros are saved as simple JSON files and can be linked to the button panels. The panels can
+Macrame is a program that enables the user to create keyboard macros and button panels.
+The macros are saved as simple JSON files and can be linked to the button panels. The panels can
be created with HTML and CSS.
Copyright (C) 2025 Jesse Malotaux
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
+You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
@@ -96,7 +96,7 @@ func ApiPost(w http.ResponseWriter, r *http.Request) {
case "/macro/play":
PlayMacro("", w, r)
case "/device/server/ip":
- GetServerIP(w, r)
+ GetServerIP(w)
case "/device/list":
DeviceList(w, r)
case "/device/access/check":
diff --git a/be/app/device.go b/be/app/device.go
index 8c83f43..9a906dd 100644
--- a/be/app/device.go
+++ b/be/app/device.go
@@ -1,21 +1,21 @@
/*
-Macrame is a program that enables the user to create keyboard macros and button panels.
-The macros are saved as simple JSON files and can be linked to the button panels. The panels can
+Macrame is a program that enables the user to create keyboard macros and button panels.
+The macros are saved as simple JSON files and can be linked to the button panels. The panels can
be created with HTML and CSS.
Copyright (C) 2025 Jesse Malotaux
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
+You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
@@ -35,11 +35,22 @@ import (
"time"
)
-func GetServerIP(w http.ResponseWriter, r *http.Request) {
+func ListServerIP(w http.ResponseWriter) {
+ ip, err := GetServerIp()
+
+ if err != nil {
+ MCRMLog("GetServerIP err: ", err)
+ return
+ }
+
+ json.NewEncoder(w).Encode(ip)
+}
+
+func GetServerIp() (string, error) {
ifs, err := net.Interfaces()
if err != nil {
MCRMLog(err)
- return
+ return "", err
}
for _, ifi := range ifs {
@@ -78,10 +89,11 @@ func GetServerIP(w http.ResponseWriter, r *http.Request) {
}
// Found a good IP, return it
- json.NewEncoder(w).Encode(ip.String())
- return
+ return ip.String(), nil
}
}
+
+ return "", fmt.Errorf("No IP found")
}
func DeviceList(w http.ResponseWriter, r *http.Request) {
diff --git a/be/app/log.go b/be/app/log.go
index 894d1da..db662ed 100644
--- a/be/app/log.go
+++ b/be/app/log.go
@@ -1,21 +1,21 @@
/*
-Macrame is a program that enables the user to create keyboard macros and button panels.
-The macros are saved as simple JSON files and can be linked to the button panels. The panels can
+Macrame is a program that enables the user to create keyboard macros and button panels.
+The macros are saved as simple JSON files and can be linked to the button panels. The panels can
be created with HTML and CSS.
Copyright (C) 2025 Jesse Malotaux
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
+You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
diff --git a/be/app/systray.go b/be/app/systray.go
new file mode 100644
index 0000000..dcece3f
--- /dev/null
+++ b/be/app/systray.go
@@ -0,0 +1,61 @@
+package app
+
+import (
+ "be/app/helper"
+ "os"
+
+ "github.com/getlantern/systray"
+)
+
+func InitSystray() {
+ go func() {
+ systray.Run(OnReady, OnExit)
+ }()
+}
+
+func OnReady() {
+ systray.SetIcon(getFavicon())
+ systray.SetTitle("Macrame")
+ systray.SetTooltip("Macrame - Server")
+
+ ip, _ := GetServerIp()
+
+ systray.AddMenuItem("IP: "+ip+":"+helper.EnvGet("MCRM__PORT"), "")
+
+ systray.AddSeparator()
+
+ addMCRMItem("Dashboard", "/")
+ addMCRMItem("Panels", "/panels")
+ addMCRMItem("Macros", "/macros")
+ addMCRMItem("Devices", "/devices")
+
+ systray.AddSeparator()
+
+ mQuit := systray.AddMenuItem("Quit Macrame", "Quit Macrame")
+ go func() {
+ <-mQuit.ClickedCh
+ os.Exit(0)
+ }()
+}
+
+func addMCRMItem(name, urlPath string) {
+ m := systray.AddMenuItem(name, name)
+ go func() {
+ <-m.ClickedCh
+ helper.OpenBrowser("http://localhost:" + helper.EnvGet("MCRM__PORT") + urlPath)
+ }()
+}
+
+func OnExit() {
+ systray.Quit()
+}
+
+func getFavicon() []byte {
+ favicon, err := os.ReadFile("favicon.ico")
+
+ if err != nil {
+ MCRMLog("getFavicon Error: ", err)
+ }
+
+ return favicon
+}
diff --git a/be/favicon.ico b/be/favicon.ico
new file mode 100644
index 0000000..a9a8c24
Binary files /dev/null and b/be/favicon.ico differ
diff --git a/be/main.go b/be/main.go
index 383340c..ecbb126 100644
--- a/be/main.go
+++ b/be/main.go
@@ -1,21 +1,21 @@
/*
-Macrame is a program that enables the user to create keyboard macros and button panels.
-The macros are saved as simple JSON files and can be linked to the button panels. The panels can
+Macrame is a program that enables the user to create keyboard macros and button panels.
+The macros are saved as simple JSON files and can be linked to the button panels. The panels can
be created with HTML and CSS.
Copyright (C) 2025 Jesse Malotaux
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
+You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
@@ -48,6 +48,8 @@ func main() {
app.MCRMLog("Listening on http://localhost:" + helper.EnvGet("MCRM__PORT"))
+ app.InitSystray()
+
app.MCRMLog(http.ListenAndServe(":"+helper.EnvGet("MCRM__PORT"), nil))
}