mirror of
https://github.com/wavetermdev/wails.git
synced 2026-08-05 13:53:43 -07:00
[windows] Initial commit
This commit is contained in:
+31
-29
@@ -19,6 +19,8 @@ Application interface methods
|
||||
| dispatchOnMainThread(id uint) | | | ✅ | |
|
||||
| hide() | | | ✅ | |
|
||||
| show() | | | ✅ | |
|
||||
| getPrimaryScreen() (*Screen, error) | | | ✅ | |
|
||||
| getScreens() ([]*Screen, error) | | | ✅ | |
|
||||
|
||||
## Webview Window
|
||||
|
||||
@@ -117,35 +119,35 @@ Webview Window Interface Methods
|
||||
|
||||
### Window
|
||||
|
||||
| Feature | Windows | Linux | Mac | Notes |
|
||||
|---------------------|---------|-------|-----|------------------------|
|
||||
| SetTitle | | | ✅ | |
|
||||
| SetSize | | | ✅ | |
|
||||
| Size | | | ✅ | |
|
||||
| SetPosition | | | ✅ | |
|
||||
| Position | | | ✅ | |
|
||||
| FullScreen | | | ✅ | |
|
||||
| UnFullscreen | | | ✅ | |
|
||||
| Minimise | | | ✅ | |
|
||||
| UnMinimise | | | ✅ | |
|
||||
| Maximise | | | ✅ | |
|
||||
| UnMaximise | | | ✅ | |
|
||||
| Show | | | ✅ | |
|
||||
| Hide | | | ✅ | |
|
||||
| Center | | | ✅ | |
|
||||
| SetBackgroundColour | | | ✅ | |
|
||||
| SetAlwaysOnTop | | | ✅ | |
|
||||
| SetResizable | | | ✅ | |
|
||||
| SetMinSize | | | ✅ | |
|
||||
| SetMaxSize | | | ✅ | |
|
||||
| Width | | | ✅ | |
|
||||
| Height | | | ✅ | |
|
||||
| ZoomIn | | | ✅ | Increase view scale |
|
||||
| ZoomOut | | | ✅ | Decrease view scale |
|
||||
| ZoomReset | | | ✅ | Reset view scale |
|
||||
| GetZoom | | | ✅ | Get current view scale |
|
||||
| SetZoom | | | ✅ | Set view scale |
|
||||
| Screen | | | ✅ | Get screen for window |
|
||||
| Feature | Windows | Linux | Mac | Notes |
|
||||
|---------------------|---------|-------|-----|--------------------------------------------------------------------------------------|
|
||||
| SetTitle | | | ✅ | |
|
||||
| SetSize | | | ✅ | |
|
||||
| Size | | | ✅ | |
|
||||
| SetPosition | | | ✅ | |
|
||||
| Position | | | ✅ | |
|
||||
| FullScreen | | | ✅ | |
|
||||
| UnFullscreen | | | ✅ | |
|
||||
| Minimise | | | ✅ | |
|
||||
| UnMinimise | | | ✅ | |
|
||||
| Maximise | | | ✅ | |
|
||||
| UnMaximise | | | ✅ | |
|
||||
| Show | | | ✅ | |
|
||||
| Hide | | | ✅ | |
|
||||
| Center | | | ✅ | |
|
||||
| SetBackgroundColour | | | ✅ | https://github.com/MicrosoftEdge/WebView2Feedback/issues/1621#issuecomment-938234294 |
|
||||
| SetAlwaysOnTop | | | ✅ | |
|
||||
| SetResizable | | | ✅ | |
|
||||
| SetMinSize | | | ✅ | |
|
||||
| SetMaxSize | | | ✅ | |
|
||||
| Width | | | ✅ | |
|
||||
| Height | | | ✅ | |
|
||||
| ZoomIn | | | ✅ | Increase view scale |
|
||||
| ZoomOut | | | ✅ | Decrease view scale |
|
||||
| ZoomReset | | | ✅ | Reset view scale |
|
||||
| GetZoom | | | ✅ | Get current view scale |
|
||||
| SetZoom | | | ✅ | Set view scale |
|
||||
| Screen | | | ✅ | Get screen for window |
|
||||
|
||||
### Log
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package application
|
||||
|
||||
import "C"
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
@@ -97,19 +96,23 @@ func mergeApplicationDefaults(o *Options) {
|
||||
|
||||
}
|
||||
|
||||
type platformApp interface {
|
||||
run() error
|
||||
destroy()
|
||||
setApplicationMenu(menu *Menu)
|
||||
name() string
|
||||
getCurrentWindowID() uint
|
||||
showAboutDialog(name string, description string, icon []byte)
|
||||
setIcon(icon []byte)
|
||||
on(id uint)
|
||||
dispatchOnMainThread(id uint)
|
||||
hide()
|
||||
show()
|
||||
}
|
||||
type (
|
||||
platformApp interface {
|
||||
run() error
|
||||
destroy()
|
||||
setApplicationMenu(menu *Menu)
|
||||
name() string
|
||||
getCurrentWindowID() uint
|
||||
showAboutDialog(name string, description string, icon []byte)
|
||||
setIcon(icon []byte)
|
||||
on(id uint)
|
||||
dispatchOnMainThread(id uint)
|
||||
hide()
|
||||
show()
|
||||
getPrimaryScreen() (*Screen, error)
|
||||
getScreens() ([]*Screen, error)
|
||||
}
|
||||
)
|
||||
|
||||
// Messages sent from javascript get routed here
|
||||
type windowMessage struct {
|
||||
@@ -518,11 +521,11 @@ func (a *App) SaveFileDialog() *SaveFileDialog {
|
||||
}
|
||||
|
||||
func (a *App) GetPrimaryScreen() (*Screen, error) {
|
||||
return getPrimaryScreen()
|
||||
return a.impl.getPrimaryScreen()
|
||||
}
|
||||
|
||||
func (a *App) GetScreens() ([]*Screen, error) {
|
||||
return getScreens()
|
||||
return a.impl.getScreens()
|
||||
}
|
||||
|
||||
func (a *App) Clipboard() *Clipboard {
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
//go:build windows
|
||||
|
||||
package application
|
||||
|
||||
type windowsApp struct {
|
||||
//applicationMenu unsafe.Pointer
|
||||
parent *App
|
||||
}
|
||||
|
||||
func (m *windowsApp) dispatchOnMainThread(id uint) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (m *windowsApp) getPrimaryScreen() (*Screen, error) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (m *windowsApp) getScreens() ([]*Screen, error) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (m *windowsApp) hide() {
|
||||
//C.hide()
|
||||
}
|
||||
|
||||
func (m *windowsApp) show() {
|
||||
//C.show()
|
||||
}
|
||||
|
||||
func (m *windowsApp) on(eventID uint) {
|
||||
//C.registerListener(C.uint(eventID))
|
||||
}
|
||||
|
||||
func (m *windowsApp) setIcon(icon []byte) {
|
||||
//C.setApplicationIcon(unsafe.Pointer(&icon[0]), C.int(len(icon)))
|
||||
}
|
||||
|
||||
func (m *windowsApp) name() string {
|
||||
//appName := C.getAppName()
|
||||
//defer C.free(unsafe.Pointer(appName))
|
||||
//return C.GoString(appName)
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *windowsApp) getCurrentWindowID() uint {
|
||||
//return uint(C.getCurrentWindowID())
|
||||
return uint(0)
|
||||
}
|
||||
|
||||
func (m *windowsApp) setApplicationMenu(menu *Menu) {
|
||||
if menu == nil {
|
||||
// Create a default menu for mac
|
||||
menu = defaultApplicationMenu()
|
||||
}
|
||||
menu.Update()
|
||||
|
||||
// Convert impl to macosMenu object
|
||||
//m.applicationMenu = (menu.impl).(*macosMenu).nsMenu
|
||||
//C.setApplicationMenu(m.applicationMenu)
|
||||
}
|
||||
|
||||
func (m *windowsApp) run() error {
|
||||
// Add a hook to the ApplicationDidFinishLaunching event
|
||||
//m.parent.On(events.Mac.ApplicationDidFinishLaunching, func() {
|
||||
// C.setApplicationShouldTerminateAfterLastWindowClosed(C.bool(m.parent.options.Mac.ApplicationShouldTerminateAfterLastWindowClosed))
|
||||
// C.setActivationPolicy(C.int(m.parent.options.Mac.ActivationPolicy))
|
||||
// C.activateIgnoringOtherApps()
|
||||
//})
|
||||
// setup event listeners
|
||||
for eventID := range m.parent.applicationEventListeners {
|
||||
m.on(eventID)
|
||||
}
|
||||
//C.run()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *windowsApp) destroy() {
|
||||
//C.destroyApp()
|
||||
}
|
||||
|
||||
func newPlatformApp(app *App) *windowsApp {
|
||||
//C.init()
|
||||
return &windowsApp{
|
||||
parent: app,
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,5 @@
|
||||
package application
|
||||
|
||||
import "C"
|
||||
|
||||
type clipboardImpl interface {
|
||||
setText(text string) bool
|
||||
text() string
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
//go:build windows
|
||||
|
||||
package application
|
||||
|
||||
type windowsClipboard struct{}
|
||||
|
||||
func (m windowsClipboard) setText(text string) bool {
|
||||
//clipboardLock.Lock()
|
||||
//defer clipboardLock.Unlock()
|
||||
//cText := C.CString(text)
|
||||
//success := C.setClipboardText(cText)
|
||||
//C.free(unsafe.Pointer(cText))
|
||||
//return bool(success)
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (m windowsClipboard) text() string {
|
||||
//clipboardLock.RLock()
|
||||
//defer clipboardLock.RUnlock()
|
||||
//clipboardText := C.getClipboardText()
|
||||
//result := C.GoString(clipboardText)
|
||||
//return result
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func newClipboardImpl() *windowsClipboard {
|
||||
return &windowsClipboard{}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package application
|
||||
|
||||
import "C"
|
||||
import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
//go:build windows
|
||||
|
||||
package application
|
||||
|
||||
func (m *windowsApp) showAboutDialog(title string, message string, icon []byte) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
type windowsDialog struct {
|
||||
dialog *MessageDialog
|
||||
|
||||
//dialogImpl unsafe.Pointer
|
||||
}
|
||||
|
||||
func (m *windowsDialog) show() {
|
||||
globalApplication.dispatchOnMainThread(func() {
|
||||
//
|
||||
//// Mac can only have 4 Buttons on a dialog
|
||||
//if len(m.dialog.Buttons) > 4 {
|
||||
// m.dialog.Buttons = m.dialog.Buttons[:4]
|
||||
//}
|
||||
//
|
||||
//if m.nsDialog != nil {
|
||||
// C.releaseDialog(m.nsDialog)
|
||||
//}
|
||||
//var title *C.char
|
||||
//if m.dialog.Title != "" {
|
||||
// title = C.CString(m.dialog.Title)
|
||||
//}
|
||||
//var message *C.char
|
||||
//if m.dialog.Message != "" {
|
||||
// message = C.CString(m.dialog.Message)
|
||||
//}
|
||||
//var iconData unsafe.Pointer
|
||||
//var iconLength C.int
|
||||
//if m.dialog.Icon != nil {
|
||||
// iconData = unsafe.Pointer(&m.dialog.Icon[0])
|
||||
// iconLength = C.int(len(m.dialog.Icon))
|
||||
//} else {
|
||||
// // if it's an error, use the application Icon
|
||||
// if m.dialog.DialogType == ErrorDialog {
|
||||
// iconData = unsafe.Pointer(&globalApplication.options.Icon[0])
|
||||
// iconLength = C.int(len(globalApplication.options.Icon))
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//alertType, ok := alertTypeMap[m.dialog.DialogType]
|
||||
//if !ok {
|
||||
// alertType = C.NSAlertStyleInformational
|
||||
//}
|
||||
//
|
||||
//m.nsDialog = C.createAlert(alertType, title, message, iconData, iconLength)
|
||||
//
|
||||
//// Reverse the Buttons so that the default is on the right
|
||||
//reversedButtons := make([]*Button, len(m.dialog.Buttons))
|
||||
//var count = 0
|
||||
//for i := len(m.dialog.Buttons) - 1; i >= 0; i-- {
|
||||
// button := m.dialog.Buttons[i]
|
||||
// C.alertAddButton(m.nsDialog, C.CString(button.Label), C.bool(button.IsDefault), C.bool(button.IsCancel))
|
||||
// reversedButtons[count] = m.dialog.Buttons[i]
|
||||
// count++
|
||||
//}
|
||||
//
|
||||
//buttonPressed := int(C.dialogRunModal(m.nsDialog))
|
||||
//if len(m.dialog.Buttons) > buttonPressed {
|
||||
// button := reversedButtons[buttonPressed]
|
||||
// if button.callback != nil {
|
||||
// button.callback()
|
||||
// }
|
||||
//}
|
||||
panic("implement me")
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func newDialogImpl(d *MessageDialog) *windowsDialog {
|
||||
return &windowsDialog{
|
||||
dialog: d,
|
||||
}
|
||||
}
|
||||
|
||||
type windowOpenFileDialog struct {
|
||||
dialog *OpenFileDialog
|
||||
}
|
||||
|
||||
func newOpenFileDialogImpl(d *OpenFileDialog) *windowOpenFileDialog {
|
||||
return &windowOpenFileDialog{
|
||||
dialog: d,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *windowOpenFileDialog) show() ([]string, error) {
|
||||
//openFileResponses[m.dialog.id] = make(chan string)
|
||||
//nsWindow := unsafe.Pointer(nil)
|
||||
//if m.dialog.window != nil {
|
||||
// // get NSWindow from window
|
||||
// nsWindow = m.dialog.window.impl.(*windowsWebviewWindow).nsWindow
|
||||
//}
|
||||
//
|
||||
//// Massage filter patterns into macOS format
|
||||
//// We iterate all filter patterns, tidy them up and then join them with a semicolon
|
||||
//// This should produce a single string of extensions like "png;jpg;gif"
|
||||
//var filterPatterns string
|
||||
//if len(m.dialog.filters) > 0 {
|
||||
// var allPatterns []string
|
||||
// for _, filter := range m.dialog.filters {
|
||||
// patternComponents := strings.Split(filter.Pattern, ";")
|
||||
// for i, component := range patternComponents {
|
||||
// filterPattern := strings.TrimSpace(component)
|
||||
// filterPattern = strings.TrimPrefix(filterPattern, "*.")
|
||||
// patternComponents[i] = filterPattern
|
||||
// }
|
||||
// allPatterns = append(allPatterns, strings.Join(patternComponents, ";"))
|
||||
// }
|
||||
// filterPatterns = strings.Join(allPatterns, ";")
|
||||
//}
|
||||
//
|
||||
//C.showOpenFileDialog(C.uint(m.dialog.id),
|
||||
// C.bool(m.dialog.canChooseFiles),
|
||||
// C.bool(m.dialog.canChooseDirectories),
|
||||
// C.bool(m.dialog.canCreateDirectories),
|
||||
// C.bool(m.dialog.showHiddenFiles),
|
||||
// C.bool(m.dialog.allowsMultipleSelection),
|
||||
// C.bool(m.dialog.resolvesAliases),
|
||||
// C.bool(m.dialog.hideExtension),
|
||||
// C.bool(m.dialog.treatsFilePackagesAsDirectories),
|
||||
// C.bool(m.dialog.allowsOtherFileTypes),
|
||||
// toCString(filterPatterns),
|
||||
// C.uint(len(filterPatterns)),
|
||||
// toCString(m.dialog.message),
|
||||
// toCString(m.dialog.directory),
|
||||
// toCString(m.dialog.buttonText),
|
||||
// nsWindow)
|
||||
//var result []string
|
||||
//for filename := range openFileResponses[m.dialog.id] {
|
||||
// result = append(result, filename)
|
||||
//}
|
||||
//return result, nil
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
type windowSaveFileDialog struct {
|
||||
dialog *SaveFileDialog
|
||||
}
|
||||
|
||||
func newSaveFileDialogImpl(d *SaveFileDialog) *windowSaveFileDialog {
|
||||
return &windowSaveFileDialog{
|
||||
dialog: d,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *windowSaveFileDialog) show() (string, error) {
|
||||
//saveFileResponses[m.dialog.id] = make(chan string)
|
||||
//nsWindow := unsafe.Pointer(nil)
|
||||
//if m.dialog.window != nil {
|
||||
// // get NSWindow from window
|
||||
// nsWindow = m.dialog.window.impl.(*macosWebviewWindow).nsWindow
|
||||
//}
|
||||
//C.showSaveFileDialog(C.uint(m.dialog.id),
|
||||
// C.bool(m.dialog.canCreateDirectories),
|
||||
// C.bool(m.dialog.showHiddenFiles),
|
||||
// C.bool(m.dialog.canSelectHiddenExtension),
|
||||
// C.bool(m.dialog.hideExtension),
|
||||
// C.bool(m.dialog.treatsFilePackagesAsDirectories),
|
||||
// C.bool(m.dialog.allowOtherFileTypes),
|
||||
// toCString(m.dialog.message),
|
||||
// toCString(m.dialog.directory),
|
||||
// toCString(m.dialog.buttonText),
|
||||
// toCString(m.dialog.filename),
|
||||
// nsWindow)
|
||||
//return <-saveFileResponses[m.dialog.id], nil
|
||||
panic("implement me")
|
||||
}
|
||||
@@ -22,7 +22,7 @@ func (m *Menu) Add(label string) *MenuItem {
|
||||
}
|
||||
|
||||
func (m *Menu) AddSeparator() {
|
||||
result := newMenuItemSeperator()
|
||||
result := newMenuItemSeparator()
|
||||
m.items = append(m.items, result)
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
//go:build windows
|
||||
|
||||
package application
|
||||
|
||||
import "unsafe"
|
||||
|
||||
type windowsMenu struct {
|
||||
menu *Menu
|
||||
|
||||
menuImpl unsafe.Pointer
|
||||
}
|
||||
|
||||
func newMenuImpl(menu *Menu) *windowsMenu {
|
||||
result := &windowsMenu{
|
||||
menu: menu,
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (m *windowsMenu) update() {
|
||||
//if m.menuImpl == nil {
|
||||
// m.menuImpl = C.createNSMenu(C.CString(m.menu.label))
|
||||
//} else {
|
||||
// C.clearMenu(m.menuImpl)
|
||||
//}
|
||||
m.processMenu(m.menuImpl, m.menu)
|
||||
}
|
||||
|
||||
func (m *windowsMenu) processMenu(parent unsafe.Pointer, menu *Menu) {
|
||||
//for _, item := range menu.items {
|
||||
// switch item.itemType {
|
||||
// case submenu:
|
||||
// submenu := item.submenu
|
||||
// nsSubmenu := C.createNSMenu(C.CString(item.label))
|
||||
// m.processMenu(nsSubmenu, submenu)
|
||||
// menuItem := newMenuItemImpl(item)
|
||||
// item.impl = menuItem
|
||||
// C.addMenuItem(parent, menuItem.nsMenuItem)
|
||||
// C.setMenuItemSubmenu(menuItem.nsMenuItem, nsSubmenu)
|
||||
// if item.role == ServicesMenu {
|
||||
// C.addServicesMenu(nsSubmenu)
|
||||
// }
|
||||
// case text, checkbox, radio:
|
||||
// menuItem := newMenuItemImpl(item)
|
||||
// item.impl = menuItem
|
||||
// C.addMenuItem(parent, menuItem.nsMenuItem)
|
||||
// case separator:
|
||||
// C.addMenuSeparator(parent)
|
||||
// }
|
||||
//
|
||||
//}
|
||||
}
|
||||
@@ -67,7 +67,7 @@ func newMenuItem(label string) *MenuItem {
|
||||
return result
|
||||
}
|
||||
|
||||
func newMenuItemSeperator() *MenuItem {
|
||||
func newMenuItemSeparator() *MenuItem {
|
||||
result := &MenuItem{
|
||||
itemType: separator,
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//go:build darwin
|
||||
|
||||
package application
|
||||
|
||||
/*
|
||||
@@ -329,29 +331,29 @@ import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type macosMenuItem struct {
|
||||
type windowsMenuItem struct {
|
||||
menuItem *MenuItem
|
||||
|
||||
nsMenuItem unsafe.Pointer
|
||||
}
|
||||
|
||||
func (m macosMenuItem) setTooltip(tooltip string) {
|
||||
func (m windowsMenuItem) setTooltip(tooltip string) {
|
||||
C.setMenuItemTooltip(m.nsMenuItem, C.CString(tooltip))
|
||||
}
|
||||
|
||||
func (m macosMenuItem) setLabel(s string) {
|
||||
func (m windowsMenuItem) setLabel(s string) {
|
||||
C.setMenuItemLabel(m.nsMenuItem, C.CString(s))
|
||||
}
|
||||
|
||||
func (m macosMenuItem) setDisabled(disabled bool) {
|
||||
func (m windowsMenuItem) setDisabled(disabled bool) {
|
||||
C.setMenuItemDisabled(m.nsMenuItem, C.bool(disabled))
|
||||
}
|
||||
|
||||
func (m macosMenuItem) setChecked(checked bool) {
|
||||
func (m windowsMenuItem) setChecked(checked bool) {
|
||||
C.setMenuItemChecked(m.nsMenuItem, C.bool(checked))
|
||||
}
|
||||
|
||||
func (m macosMenuItem) setAccelerator(accelerator *accelerator) {
|
||||
func (m windowsMenuItem) setAccelerator(accelerator *accelerator) {
|
||||
// Set the keyboard shortcut of the menu item
|
||||
var modifier C.int
|
||||
var key *C.char
|
||||
@@ -364,8 +366,8 @@ func (m macosMenuItem) setAccelerator(accelerator *accelerator) {
|
||||
C.setMenuItemKeyEquivalent(m.nsMenuItem, key, modifier)
|
||||
}
|
||||
|
||||
func newMenuItemImpl(item *MenuItem) *macosMenuItem {
|
||||
result := &macosMenuItem{
|
||||
func newMenuItemImpl(item *MenuItem) *windowsMenuItem {
|
||||
result := &windowsMenuItem{
|
||||
menuItem: item,
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
//go:build windows
|
||||
|
||||
package application
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type windowsMenuItem struct {
|
||||
menuItem *MenuItem
|
||||
|
||||
menuItemImpl unsafe.Pointer
|
||||
}
|
||||
|
||||
func (m windowsMenuItem) setTooltip(tooltip string) {
|
||||
//C.setMenuItemTooltip(m.nsMenuItem, C.CString(tooltip))
|
||||
}
|
||||
|
||||
func (m windowsMenuItem) setLabel(s string) {
|
||||
//C.setMenuItemLabel(m.nsMenuItem, C.CString(s))
|
||||
}
|
||||
|
||||
func (m windowsMenuItem) setDisabled(disabled bool) {
|
||||
//C.setMenuItemDisabled(m.nsMenuItem, C.bool(disabled))
|
||||
}
|
||||
|
||||
func (m windowsMenuItem) setChecked(checked bool) {
|
||||
//C.setMenuItemChecked(m.nsMenuItem, C.bool(checked))
|
||||
}
|
||||
|
||||
func (m windowsMenuItem) setAccelerator(accelerator *accelerator) {
|
||||
//// Set the keyboard shortcut of the menu item
|
||||
//var modifier C.int
|
||||
//var key *C.char
|
||||
//if accelerator != nil {
|
||||
// modifier = C.int(toMacModifier(accelerator.Modifiers))
|
||||
// key = C.CString(accelerator.Key)
|
||||
//}
|
||||
//
|
||||
//// Convert the key to a string
|
||||
//C.setMenuItemKeyEquivalent(m.nsMenuItem, key, modifier)
|
||||
}
|
||||
|
||||
func newMenuItemImpl(item *MenuItem) *windowsMenuItem {
|
||||
result := &windowsMenuItem{
|
||||
menuItem: item,
|
||||
}
|
||||
//
|
||||
//switch item.itemType {
|
||||
//case text, checkbox, submenu, radio:
|
||||
// result.nsMenuItem = unsafe.Pointer(C.newMenuItem(C.uint(item.id), C.CString(item.label), C.bool(item.disabled), C.CString(item.tooltip)))
|
||||
// if item.itemType == checkbox || item.itemType == radio {
|
||||
// C.setMenuItemChecked(result.nsMenuItem, C.bool(item.checked))
|
||||
// }
|
||||
// if item.accelerator != nil {
|
||||
// result.setAccelerator(item.accelerator)
|
||||
// }
|
||||
//default:
|
||||
// panic("WTF")
|
||||
//}
|
||||
return result
|
||||
}
|
||||
|
||||
func newSpeechMenu() *MenuItem {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func newHideMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newHideOthersMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newUnhideMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newUndoMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
// newRedoMenuItem creates a new menu item for redoing the last action
|
||||
func newRedoMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newCutMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newCopyMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newPasteMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newPasteAndMatchStyleMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newDeleteMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newQuitMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newSelectAllMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newAboutMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newCloseMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newReloadMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newForceReloadMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newToggleFullscreenMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newToggleDevToolsMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func newZoomResetMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newZoomInMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newZoomOutMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
|
||||
}
|
||||
|
||||
func newMinimizeMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func newZoomMenuItem() *MenuItem {
|
||||
panic("implement me")
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
//go:build windows
|
||||
|
||||
package application
|
||||
|
||||
type windowsSystemTray struct {
|
||||
id uint
|
||||
icon []byte
|
||||
menu *Menu
|
||||
}
|
||||
|
||||
func (s *windowsSystemTray) setIconPosition(position int) {
|
||||
// Unsupported - do nothing
|
||||
}
|
||||
|
||||
func (s *windowsSystemTray) setMenu(menu *Menu) {
|
||||
s.menu = menu
|
||||
}
|
||||
|
||||
func (s *windowsSystemTray) run() {
|
||||
globalApplication.dispatchOnMainThread(func() {
|
||||
//if s.nsStatusItem != nil {
|
||||
// Fatal("System tray '%d' already running", s.id)
|
||||
//}
|
||||
//s.nsStatusItem = unsafe.Pointer(C.systemTrayNew())
|
||||
//if s.label != "" {
|
||||
// C.systemTraySetLabel(s.nsStatusItem, C.CString(s.label))
|
||||
//}
|
||||
//if s.icon != nil {
|
||||
// s.nsImage = unsafe.Pointer(C.imageFromBytes((*C.uchar)(&s.icon[0]), C.int(len(s.icon))))
|
||||
// C.systemTraySetIcon(s.nsStatusItem, s.nsImage, C.int(s.iconPosition), C.bool(s.isTemplateIcon))
|
||||
//}
|
||||
//if s.menu != nil {
|
||||
// s.menu.Update()
|
||||
// // Convert impl to macosMenu object
|
||||
// s.nsMenu = (s.menu.impl).(*macosMenu).nsMenu
|
||||
// C.systemTraySetMenu(s.nsStatusItem, s.nsMenu)
|
||||
//}
|
||||
panic("implement me")
|
||||
})
|
||||
}
|
||||
|
||||
func (s *windowsSystemTray) setIcon(icon []byte) {
|
||||
s.icon = icon
|
||||
globalApplication.dispatchOnMainThread(func() {
|
||||
//s.nsImage = unsafe.Pointer(C.imageFromBytes((*C.uchar)(&icon[0]), C.int(len(icon))))
|
||||
//C.systemTraySetIcon(s.nsStatusItem, s.nsImage, C.int(s.iconPosition), C.bool(s.isTemplateIcon))
|
||||
})
|
||||
}
|
||||
|
||||
func (s *windowsSystemTray) setTemplateIcon(icon []byte) {
|
||||
// Unsupported - do nothing
|
||||
}
|
||||
|
||||
func newSystemTrayImpl(s *SystemTray) systemTrayImpl {
|
||||
return &windowsSystemTray{
|
||||
id: s.id,
|
||||
icon: s.icon,
|
||||
menu: s.menu,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *windowsSystemTray) setLabel(label string) {
|
||||
// Unsupported - do nothing
|
||||
}
|
||||
|
||||
func (s *windowsSystemTray) destroy() {
|
||||
panic("implement me")
|
||||
}
|
||||
@@ -0,0 +1,253 @@
|
||||
//go:build windows
|
||||
|
||||
package application
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var showDevTools = func(window unsafe.Pointer) {}
|
||||
|
||||
type windowsWebviewWindow struct {
|
||||
windowImpl unsafe.Pointer
|
||||
parent *WebviewWindow
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setTitle(title string) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setSize(width, height int) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setAlwaysOnTop(alwaysOnTop bool) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setURL(url string) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setResizable(resizable bool) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setMinSize(width, height int) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setMaxSize(width, height int) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) execJS(js string) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) restore() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setBackgroundColour(color *RGBA) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) run() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) center() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) size() (int, int) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) width() int {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) height() int {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) position() (int, int) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) destroy() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) reload() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) forceReload() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) toggleDevTools() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) zoomReset() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) zoomIn() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) zoomOut() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) getZoom() float64 {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setZoom(zoom float64) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) close() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) zoom() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setHTML(html string) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setPosition(x int, y int) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) on(eventID uint) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) minimise() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) unminimise() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) maximise() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) unmaximise() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) fullscreen() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) unfullscreen() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) isMinimised() bool {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) isMaximised() bool {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) isFullscreen() bool {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) disableSizeConstraints() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setFullscreenButtonEnabled(enabled bool) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) show() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) hide() {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) getScreen() (*Screen, error) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) setFrameless(b bool) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func newWindowImpl(parent *WebviewWindow) *windowsWebviewWindow {
|
||||
result := &windowsWebviewWindow{
|
||||
parent: parent,
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (w *windowsWebviewWindow) openContextMenu(menu *Menu, data *ContextMenuData) {
|
||||
// Create the menu
|
||||
thisMenu := newMenuImpl(menu)
|
||||
thisMenu.update()
|
||||
//C.windowShowMenu(w.nsWindow, thisMenu.nsMenu, C.int(data.X), C.int(data.Y))
|
||||
}
|
||||
Reference in New Issue
Block a user