summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-08-25 13:05:18 +0200
committerChristophe Besson <cbesson@gmail.com>2026-08-25 13:05:18 +0200
commitc52e85b984bffc78125aff744513bc5d33ad72b3 (patch)
tree2b3227b2483fb0feb981fd790d44089971c77be4
parent9e66c11b15b7103e963dcecf88fb152ed1e74253 (diff)
downloadmeshbay-c52e85b984bffc78125aff744513bc5d33ad72b3.tar.gz
feat(client): add app icon based on the MeshBay logo
Adds build/icon.png (1024x1024, cropped/upscaled from QE/meshbay-logo-v2.jpg) at electron-builder's default buildResources path, so packaged .deb/.rpm builds get a real icon instead of Electron's stock one. The generic `build/` gitignore rule (Python artifacts) was swallowing this legitimate source directory, so it gets an explicit exception. BrowserWindow now points at the same file for its own icon, and the process runs with --class=MeshBay so a dev run's WM_CLASS matches the StartupWMClass electron-builder derives from productName for the packaged app — kept consistent, even though the launcher/dash icon match itself only resolves once a .desktop file exists (i.e. after packaging, not in dev).
-rw-r--r--.gitignore6
-rw-r--r--packages/meshbay-client/build/icon.pngbin0 -> 404424 bytes
-rw-r--r--packages/meshbay-client/src/main.js11
3 files changed, 17 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index b22c619..52897da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -59,3 +59,9 @@ poc/bob_state.json
poc/testfile.bin
packages/meshbay-client/ui/
packages/meshbay-client/node_modules/
+
+# electron-builder's buildResources dir — a real source (app icon), not a
+# build artifact, despite living under a path the generic `build/` rule above
+# would otherwise swallow.
+!packages/meshbay-client/build/
+!packages/meshbay-client/build/**
diff --git a/packages/meshbay-client/build/icon.png b/packages/meshbay-client/build/icon.png
new file mode 100644
index 0000000..6202459
--- /dev/null
+++ b/packages/meshbay-client/build/icon.png
Binary files differ
diff --git a/packages/meshbay-client/src/main.js b/packages/meshbay-client/src/main.js
index 0517eba..91fc4fa 100644
--- a/packages/meshbay-client/src/main.js
+++ b/packages/meshbay-client/src/main.js
@@ -30,6 +30,16 @@ const os = require('node:os');
const path = require('node:path');
const { pathToFileURL } = require('node:url');
+// Linux window managers/desktop shells (GNOME's dash included) group and
+// icon-match a running window by its WM_CLASS, resolved against an installed
+// .desktop file's StartupWMClass — not against BrowserWindow's `icon` option,
+// which only sets the window's own icon (titlebar/alt-tab). Unpackaged, the
+// class defaults to "electron" and nothing matches it, so the shell falls
+// back to the generic Electron icon. A packaged build gets a correct
+// StartupWMClass from electron-builder automatically; this switch keeps dev
+// runs (`electron .`) consistent with it.
+app.commandLine.appendSwitch('class', 'MeshBay');
+
const UI_DIR = path.join(__dirname, '..', 'ui');
const SCHEME = 'app';
@@ -280,6 +290,7 @@ function createWindow() {
...bounds,
minWidth: 320,
show: false,
+ icon: path.join(__dirname, '..', 'build', 'icon.png'),
webPreferences: {
// The three that matter. `sandbox` keeps the Chromium renderer sandbox —
// the strongest one available, and the reason Electron is not the