diff --git a/example/main.go b/example/main.go index b88ac018..47f094c3 100644 --- a/example/main.go +++ b/example/main.go @@ -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") diff --git a/systray.go b/systray.go index cd5ae283..827bb9d3 100644 --- a/systray.go +++ b/systray.go @@ -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(¤tID, 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. diff --git a/systray_darwin.m b/systray_darwin.m index ecf21ace..5e7e2cc2 100644 --- a/systray_darwin.m +++ b/systray_darwin.m @@ -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 diff --git a/systray_linux.c b/systray_linux.c index 9e14ba01..ffb6ca9a 100644 --- a/systray_linux.c +++ b/systray_linux.c @@ -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; } diff --git a/systray_nonwindows.go b/systray_nonwindows.go index 12eacdfa..e67489e4 100644 --- a/systray_nonwindows.go +++ b/systray_nonwindows.go @@ -1,5 +1,5 @@ +//go:build !windows // +build !windows -// go:build !windows package systray @@ -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) { diff --git a/systray_windows.go b/systray_windows.go index 13b4411d..e84a8544 100644 --- a/systray_windows.go +++ b/systray_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package systray @@ -10,6 +11,7 @@ import ( "path/filepath" "sort" "sync" + "sync/atomic" "syscall" "unsafe" @@ -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 @@ -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(¤tID, 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, @@ -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