mirror of
https://github.com/netbirdio/netbird.git
synced 2026-07-17 20:19:55 +00:00
escape ampersand in tray menu labels on Windows
Win32 swallows a lone & in an MFT_STRING menu item as the mnemonic prefix, so "Help & Support" rendered as "Help Support". Add a build-tagged menuLabel() helper that doubles & to && on Windows and is the identity on macOS/Linux (which render & literally), and apply it to the About submenu label.
This commit is contained in:
@@ -459,7 +459,7 @@ func (t *Tray) buildMenu() *application.Menu {
|
||||
SetAccelerator("CmdOrCtrl+,").
|
||||
OnClick(func(*application.Context) { t.svc.WindowManager.OpenSettings("") })
|
||||
|
||||
aboutLabel := t.loc.T("tray.menu.about")
|
||||
aboutLabel := menuLabel(t.loc.T("tray.menu.about"))
|
||||
about := menu.AddSubmenu(aboutLabel)
|
||||
about.Add(t.loc.T("tray.menu.github")).OnClick(func(*application.Context) {
|
||||
_ = t.app.Browser.OpenURL(urlGitHubRepo)
|
||||
|
||||
9
client/ui/tray_label_other.go
Normal file
9
client/ui/tray_label_other.go
Normal file
@@ -0,0 +1,9 @@
|
||||
//go:build !windows && !android && !ios && !freebsd && !js
|
||||
|
||||
package main
|
||||
|
||||
// menuLabel is the identity on macOS and Linux — both render an ampersand
|
||||
// literally in tray-menu labels, so no escaping is needed. Windows opts in via
|
||||
// the sibling tray_label_windows.go file, where a lone "&" would otherwise be
|
||||
// swallowed as a Win32 mnemonic prefix.
|
||||
func menuLabel(s string) string { return s }
|
||||
16
client/ui/tray_label_windows.go
Normal file
16
client/ui/tray_label_windows.go
Normal file
@@ -0,0 +1,16 @@
|
||||
//go:build windows
|
||||
|
||||
package main
|
||||
|
||||
import "strings"
|
||||
|
||||
// menuLabel escapes a tray-menu label for Win32. A single ampersand in an
|
||||
// MFT_STRING menu item is consumed as the mnemonic (accelerator) prefix and
|
||||
// never painted — so "Help & Support" renders as "Help Support". Doubling it
|
||||
// to "&&" tells Win32 to draw a literal ampersand. Wails v3 passes the label
|
||||
// straight to InsertMenuItem without escaping (see menuitem_windows.go), so we
|
||||
// do it here. macOS/Linux render "&" literally and use the identity helper in
|
||||
// the sibling tray_label_other.go.
|
||||
func menuLabel(s string) string {
|
||||
return strings.ReplaceAll(s, "&", "&&")
|
||||
}
|
||||
Reference in New Issue
Block a user