Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ func onReady() {
subMenuTop := systray.AddMenuItem("SubMenuTop", "SubMenu Test (top)")
subMenuMiddle := subMenuTop.AddSubMenuItem("SubMenuMiddle", "SubMenu Test (middle)")
subMenuBottom := subMenuMiddle.AddSubMenuItemCheckbox("SubMenuBottom - Toggle Panic!", "SubMenu Test (bottom) - Hide/Show Panic!", false)
subMenuMiddle.AddSeparator()
subMenuBottom2 := subMenuMiddle.AddSubMenuItem("SubMenuBottom - Panic!", "SubMenu Test (bottom)")

mUrl := systray.AddMenuItem("Open UI", "my home")
Expand Down
7 changes: 6 additions & 1 deletion systray.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,12 @@ func AddMenuItemCheckbox(title string, tooltip string, checked bool) *MenuItem {

// AddSeparator adds a separator bar to the menu
func AddSeparator() {
addSeparator(atomic.AddUint32(&currentID, 1))
addSeparator(0)
}

// AddSeparator adds a separator bar to the submenu
func (item *MenuItem) AddSeparator() {
addSeparator(item.id)
}

// AddSubMenuItem adds a nested sub-menu item with the designated title and tooltip.
Expand Down
12 changes: 11 additions & 1 deletion systray_darwin.m
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,17 @@ - (void)add_or_update_menu_item:(MenuItem *)item {

- (void) add_separator:(NSNumber*) menuId
{
[menu addItem: [NSMenuItem separatorItem]];
if ([menuId intValue] == 0) {
[menu addItem: [NSMenuItem separatorItem]];
return;
}

NSMenuItem* menuItem = find_menu_item(menu, menuId);
if (menuItem != NULL) {
if (menuItem.hasSubmenu) {
[menuItem.submenu addItem: [NSMenuItem separatorItem]];
}
}
}

- (void) hide_menu_item:(NSNumber*) menuId
Expand Down
10 changes: 9 additions & 1 deletion systray_linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,16 @@ gboolean do_add_or_update_menu_item(gpointer data) {
}

gboolean do_add_separator(gpointer data) {
MenuItemInfo *mii = (MenuItemInfo*)data;
GtkMenuItem* menuItem = find_menu_by_id(mii->menu_id);
GtkWidget* menu = gtk_menu_item_get_submenu(menuItem);

if(menu == NULL) {
menu = global_tray_menu;
}

GtkWidget *separator = gtk_separator_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(global_tray_menu), separator);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), separator);
gtk_widget_show(separator);
return FALSE;
}
Expand Down
6 changes: 3 additions & 3 deletions systray_nonwindows.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//go:build !windows
// +build !windows
// go:build !windows

package systray

Expand Down Expand Up @@ -69,8 +69,8 @@ func addOrUpdateMenuItem(item *MenuItem) {
)
}

func addSeparator(id uint32) {
C.add_separator(C.int(id))
func addSeparator(menuID uint32) {
C.add_separator(C.int(menuID))
}

func hideMenuItem(item *MenuItem) {
Expand Down
16 changes: 9 additions & 7 deletions systray_windows.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//go:build windows
// +build windows

package systray
Expand All @@ -10,6 +11,7 @@ import (
"path/filepath"
"sort"
"sync"
"sync/atomic"
"syscall"
"unsafe"

Expand Down Expand Up @@ -581,7 +583,7 @@ func (t *winTray) addOrUpdateMenuItem(menuItemId uint32, parentId uint32, title
return nil
}

func (t *winTray) addSeparatorMenuItem(menuItemId, parentId uint32) error {
func (t *winTray) addSeparatorMenuItem(menuID uint32) error {
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms647578(v=vs.85).aspx
const (
MIIM_FTYPE = 0x00000100
Expand All @@ -593,15 +595,15 @@ func (t *winTray) addSeparatorMenuItem(menuItemId, parentId uint32) error {
mi := menuItemInfo{
Mask: MIIM_FTYPE | MIIM_ID | MIIM_STATE,
Type: MFT_SEPARATOR,
ID: uint32(menuItemId),
ID: atomic.AddUint32(&currentID, 1),
}

mi.Size = uint32(unsafe.Sizeof(mi))

t.addToVisibleItems(parentId, menuItemId)
position := t.getVisibleItemIndex(parentId, menuItemId)
t.addToVisibleItems(menuID, mi.ID)
position := t.getVisibleItemIndex(menuID, mi.ID)
t.muMenus.RLock()
menu := uintptr(t.menus[parentId])
menu := uintptr(t.menus[menuID])
t.muMenus.RUnlock()
res, _, err := pInsertMenuItem.Call(
menu,
Expand Down Expand Up @@ -928,8 +930,8 @@ func (item *MenuItem) SetTemplateIcon(templateIconBytes []byte, regularIconBytes
item.SetIcon(regularIconBytes)
}

func addSeparator(id uint32) {
err := wt.addSeparatorMenuItem(id, 0)
func addSeparator(menuID uint32) {
err := wt.addSeparatorMenuItem(menuID)
if err != nil {
log.Errorf("Unable to addSeparator: %v", err)
return
Expand Down