Skip to content

Commit

Permalink
Allow adding separators to submenus
Browse files Browse the repository at this point in the history
Fixes getlantern#170

Add implementation of separators in submenus for
mac, linux and windows.
  • Loading branch information
forfuncsake committed Oct 14, 2024
1 parent 22c167e commit 5ac917c
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 12 deletions.
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
7 changes: 7 additions & 0 deletions systray_darwin.m
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,13 @@ - (void)add_or_update_menu_item:(MenuItem *)item {

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

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

0 comments on commit 5ac917c

Please sign in to comment.