From f2401adc9a7247b215cc46088113fc2db6f133e3 Mon Sep 17 00:00:00 2001 From: GrumpySurfer Date: Wed, 27 Nov 2024 12:09:48 +0100 Subject: [PATCH 1/2] Update separator functionality Added AddSeparatorID() which returns the item id. It can be used with the new ShowSeparator() and HideSeparator() methods to manipulate the separator behavior Signed-off-by: GrumpySurfer --- systray.go | 24 ++++++++++++++++++++++++ systray_menu_unix.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/systray.go b/systray.go index ff9b00c..0d0a96d 100644 --- a/systray.go +++ b/systray.go @@ -176,11 +176,35 @@ func AddSeparator() { addSeparator(currentID.Add(1), 0) } +// AddSeparatorID adds a separator bar to the menu and returns its id +func AddSeparatorID() uint32 { + id := currentID.Add(1) + addSeparator(id, 0) + return id +} + +// HideSeparator hides a separator bar by its id +func HideSeparator(id uint32) { + hideSeparator(id, 0) +} + +// ShowSeparator shows a separator bar by its id +func ShowSeparator(id uint32) { + showSeparator(id, 0) +} + // AddSeparator adds a separator bar to the submenu func (item *MenuItem) AddSeparator() { addSeparator(currentID.Add(1), item.id) } +// AddSeparatorID adds a separator bar to the submenu and returns its id +func (item *MenuItem) AddSeparatorID() uint32 { + id := currentID.Add(1) + addSeparator(id, item.id) + return id +} + // AddSubMenuItem adds a nested sub-menu item with the designated title and tooltip. // It can be safely invoked from different goroutines. // Created menu items are checkable on Windows and OSX by default. For Linux you have to use AddSubMenuItemCheckbox diff --git a/systray_menu_unix.go b/systray_menu_unix.go index 16df601..e862249 100644 --- a/systray_menu_unix.go +++ b/systray_menu_unix.go @@ -224,6 +224,34 @@ func addSeparator(id uint32, parent uint32) { refresh() } +func hideSeparator(id uint32, parent uint32) { + instance.menuLock.Lock() + defer instance.menuLock.Unlock() + menu, _ := findLayout(int32(parent)) + for _, i := range menu.V2 { + item := i.Value().(*menuLayout) + if item.V0 == int32(id) { + item.V1["visible"] = dbus.MakeVariant(false) + refresh() + return + } + } +} + +func showSeparator(id uint32, parent uint32) { + instance.menuLock.Lock() + defer instance.menuLock.Unlock() + menu, _ := findLayout(int32(parent)) + for _, i := range menu.V2 { + item := i.Value().(*menuLayout) + if item.V0 == int32(id) { + item.V1["visible"] = dbus.MakeVariant(true) + refresh() + return + } + } +} + func applyItemToLayout(in *MenuItem, out *menuLayout) { out.V1["enabled"] = dbus.MakeVariant(!in.disabled) out.V1["label"] = dbus.MakeVariant(in.title) From d68ff7e5078c7cda1f8254edfa66b844d5394881 Mon Sep 17 00:00:00 2001 From: GrumpySurfer Date: Wed, 27 Nov 2024 14:34:03 +0100 Subject: [PATCH 2/2] merge showSeparator and hideSeparator Signed-off-by: GrumpySurfer --- systray.go | 4 ++-- systray_menu_unix.go | 18 ++---------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/systray.go b/systray.go index 0d0a96d..a9bbe65 100644 --- a/systray.go +++ b/systray.go @@ -185,12 +185,12 @@ func AddSeparatorID() uint32 { // HideSeparator hides a separator bar by its id func HideSeparator(id uint32) { - hideSeparator(id, 0) + changeSeparatorVisibility(id, 0, false) } // ShowSeparator shows a separator bar by its id func ShowSeparator(id uint32) { - showSeparator(id, 0) + changeSeparatorVisibility(id, 0, true) } // AddSeparator adds a separator bar to the submenu diff --git a/systray_menu_unix.go b/systray_menu_unix.go index e862249..e1ce8a6 100644 --- a/systray_menu_unix.go +++ b/systray_menu_unix.go @@ -224,28 +224,14 @@ func addSeparator(id uint32, parent uint32) { refresh() } -func hideSeparator(id uint32, parent uint32) { +func changeSeparatorVisibility(id uint32, parent uint32, visible bool) { instance.menuLock.Lock() defer instance.menuLock.Unlock() menu, _ := findLayout(int32(parent)) for _, i := range menu.V2 { item := i.Value().(*menuLayout) if item.V0 == int32(id) { - item.V1["visible"] = dbus.MakeVariant(false) - refresh() - return - } - } -} - -func showSeparator(id uint32, parent uint32) { - instance.menuLock.Lock() - defer instance.menuLock.Unlock() - menu, _ := findLayout(int32(parent)) - for _, i := range menu.V2 { - item := i.Value().(*menuLayout) - if item.V0 == int32(id) { - item.V1["visible"] = dbus.MakeVariant(true) + item.V1["visible"] = dbus.MakeVariant(visible) refresh() return }