From ea71836cd25750983e8ebec91da8bffa5937484b Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 2 May 2019 20:59:37 +0200 Subject: ui: use system icons in toolbar --- ui/icon/add.svg | 2 -- ui/icon/delete.svg | 2 -- ui/icon/export.svg | 2 -- ui/iconprovider.go | 16 ++++++++++++++++ ui/tunnelspage.go | 14 ++++++++++---- 5 files changed, 26 insertions(+), 10 deletions(-) delete mode 100644 ui/icon/add.svg delete mode 100644 ui/icon/delete.svg delete mode 100644 ui/icon/export.svg (limited to 'ui') diff --git a/ui/icon/add.svg b/ui/icon/add.svg deleted file mode 100644 index 2e1dd028..00000000 --- a/ui/icon/add.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/ui/icon/delete.svg b/ui/icon/delete.svg deleted file mode 100644 index 6c204271..00000000 --- a/ui/icon/delete.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/ui/icon/export.svg b/ui/icon/export.svg deleted file mode 100644 index caef7a2c..00000000 --- a/ui/icon/export.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/ui/iconprovider.go b/ui/iconprovider.go index 5ebf93bb..b56a4a5b 100644 --- a/ui/iconprovider.go +++ b/ui/iconprovider.go @@ -6,8 +6,12 @@ package ui import ( + "fmt" "github.com/lxn/walk" + "github.com/lxn/win" + "golang.org/x/sys/windows" "golang.zx2c4.com/wireguard/windows/service" + "path" ) type rectAndState struct { @@ -229,3 +233,15 @@ func (tsip *IconProvider) PaintForState(state service.TunnelState, canvas *walk. return nil } + +func loadSystemIcon(dll string, index uint) (*walk.Icon, error) { + system32, err := windows.GetSystemDirectory() + if err != nil { + return nil, err + } + hicon := win.ExtractIcon(win.GetModuleHandle(nil), windows.StringToUTF16Ptr(path.Join(system32, dll+".dll")), int32(index)) + if hicon <= 1 { + return nil, fmt.Errorf("Unable to find icon %d of %s", index, dll) + } + return walk.NewIconFromHICON(hicon) +} diff --git a/ui/tunnelspage.go b/ui/tunnelspage.go index 10a6c782..c2e555cf 100644 --- a/ui/tunnelspage.go +++ b/ui/tunnelspage.go @@ -70,23 +70,29 @@ func NewTunnelsPage() (*TunnelsPage, error) { tunnelsToolBar, _ := walk.NewToolBarWithOrientationAndButtonStyle(toolBarContainer, walk.Horizontal, walk.ToolBarButtonImageBeforeText) imageSize := walk.Size{tp.DPI() / 6, tp.DPI() / 6} // Dividing by six is the same as dividing by 96 and multiplying by 16. TODO: Use dynamic DPI - imageList, _ := walk.NewImageList(imageSize, walk.RGB(255, 255, 255)) + imageList, _ := walk.NewImageList(imageSize, walk.RGB(0, 0, 0)) tunnelsToolBar.SetImageList(imageList) addMenu, _ := walk.NewMenu() tp.AddDisposable(addMenu) importAction := walk.NewAction() importAction.SetText("Import tunnel(s) from file...") + importActionIcon, _ := loadSystemIcon("imageres", 3) + importActionImage, _ := walk.NewBitmapFromIcon(importActionIcon, imageSize) + importAction.SetImage(importActionImage) importAction.SetShortcut(walk.Shortcut{walk.ModControl, walk.KeyO}) importAction.Triggered().Attach(tp.onImport) addAction := walk.NewAction() addAction.SetText("Add empty tunnel") + addActionIcon, _ := loadSystemIcon("imageres", 2) + addActionImage, _ := walk.NewBitmapFromIcon(addActionIcon, imageSize) + addAction.SetImage(addActionImage) addAction.SetShortcut(walk.Shortcut{walk.ModControl, walk.KeyN}) addAction.Triggered().Attach(tp.onAddTunnel) addMenu.Actions().Add(importAction) addMenu.Actions().Add(addAction) addMenuAction := walk.NewMenuAction(addMenu) - addMenuActionIcon, _ := walk.NewIconFromResourceWithSize("add.ico", imageSize) + addMenuActionIcon, _ := loadSystemIcon("shell32", 149) addMenuActionImage, _ := walk.NewBitmapFromIcon(addMenuActionIcon, imageSize) addMenuAction.SetImage(addMenuActionImage) addMenuAction.SetText("Add Tunnel") @@ -97,7 +103,7 @@ func NewTunnelsPage() (*TunnelsPage, error) { tunnelsToolBar.Actions().Add(walk.NewSeparatorAction()) deleteAction := walk.NewAction() - deleteActionIcon, _ := walk.NewIconFromResourceWithSize("delete.ico", imageSize) + deleteActionIcon, _ := loadSystemIcon("shell32", 131) deleteActionImage, _ := walk.NewBitmapFromIcon(deleteActionIcon, imageSize) deleteAction.SetImage(deleteActionImage) deleteAction.SetShortcut(walk.Shortcut{0, walk.KeyDelete}) @@ -108,7 +114,7 @@ func NewTunnelsPage() (*TunnelsPage, error) { tunnelsToolBar.Actions().Add(walk.NewSeparatorAction()) exportAction := walk.NewAction() - exportActionIcon, _ := walk.NewIconFromResourceWithSize("export.ico", imageSize) + exportActionIcon, _ := loadSystemIcon("imageres", 165) // Or "shell32", 45? exportActionImage, _ := walk.NewBitmapFromIcon(exportActionIcon, imageSize) exportAction.SetImage(exportActionImage) exportAction.SetToolTip("Export all tunnels to zip...") -- cgit v1.2.3-59-g8ed1b