5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 20:39:34 +08:00

[linux] basic windowing

This commit is contained in:
Lea Anthony 2021-11-14 22:40:37 +11:00
parent ab1469638f
commit 3a93c08813
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405
6 changed files with 162 additions and 62 deletions

View File

@ -49,6 +49,8 @@ require (
nhooyr.io/websocket v1.8.6
)
require github.com/gotk3/gotk3 v0.6.1
require (
github.com/Microsoft/go-winio v0.4.16 // indirect
github.com/andybalholm/brotli v1.0.2 // indirect

View File

@ -82,6 +82,8 @@ github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gotk3/gotk3 v0.6.1 h1:GJ400a0ecEEWrzjBvzBzH+pB/esEMIGdB9zPSmBdoeo=
github.com/gotk3/gotk3 v0.6.1/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/jackmordaunt/icns v1.0.0 h1:RYSxplerf/l/DUd09AHtITwckkv/mqjVv4DjYdPmAMQ=

View File

@ -7,6 +7,7 @@ import (
"context"
"encoding/json"
"log"
"strconv"
"text/template"
"github.com/wailsapp/wails/v2/internal/binding"
@ -14,6 +15,8 @@ import (
"github.com/wailsapp/wails/v2/internal/frontend/assetserver"
"github.com/wailsapp/wails/v2/internal/logger"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/gotk3/gotk3/gtk"
)
type Frontend struct {
@ -82,6 +85,9 @@ func NewFrontend(ctx context.Context, appoptions *options.App, myLogger *logger.
}
result.assets = assets
// Initialise GTK
gtk.Init(nil)
return result
}
@ -101,14 +107,14 @@ func (f *Frontend) Run(ctx context.Context) error {
f.debug = _debug.(bool)
}
f.WindowCenter()
//f.WindowCenter()
//f.setupChromium()
//
//mainWindow.OnSize().Bind(func(arg *winc.Event) {
//gtkWindow.OnSize().Bind(func(arg *winc.Event) {
// f.chromium.Resize()
//})
//
//mainWindow.OnClose().Bind(func(arg *winc.Event) {
//gtkWindow.OnClose().Bind(func(arg *winc.Event) {
// if f.frontendOptions.HideWindowOnClose {
// f.WindowHide()
// } else {
@ -177,13 +183,13 @@ func (f *Frontend) WindowMaximise() {
f.mainWindow.Maximise()
}
func (f *Frontend) WindowUnmaximise() {
f.mainWindow.Restore()
f.mainWindow.UnMaximise()
}
func (f *Frontend) WindowMinimise() {
f.mainWindow.Minimise()
}
func (f *Frontend) WindowUnminimise() {
f.mainWindow.Restore()
f.mainWindow.UnMinimise()
}
func (f *Frontend) WindowSetMinSize(width int, height int) {
@ -202,7 +208,7 @@ func (f *Frontend) WindowSetRGBA(col *options.RGBA) {
return
}
//
//f.mainWindow.Dispatch(func() {
//f.gtkWindow.Dispatch(func() {
// controller := f.chromium.GetController()
// controller2 := controller.GetICoreWebView2Controller2()
//
@ -240,10 +246,10 @@ func (f *Frontend) Quit() {
// chromium.WebResourceRequestedCallback = f.processRequest
// chromium.NavigationCompletedCallback = f.navigationCompleted
// chromium.AcceleratorKeyCallback = func(vkey uint) bool {
// w32.PostMessage(f.mainWindow.Handle(), w32.WM_KEYDOWN, uintptr(vkey), 0)
// w32.PostMessage(f.gtkWindow.Handle(), w32.WM_KEYDOWN, uintptr(vkey), 0)
// return false
// }
// chromium.Embed(f.mainWindow.Handle())
// chromium.Embed(f.gtkWindow.Handle())
// chromium.Resize()
// settings, err := chromium.GetSettings()
// if err != nil {
@ -363,21 +369,19 @@ func (f *Frontend) processMessage(message string) {
}
func (f *Frontend) Callback(message string) {
//f.mainWindow.Dispatch(func() {
// f.chromium.Eval(`window.wails.Callback(` + strconv.Quote(message) + `);`)
//})
f.ExecJS(`window.wails.Callback(` + strconv.Quote(message) + `);`)
}
func (f *Frontend) startDrag() error {
//if !w32.ReleaseCapture() {
// return fmt.Errorf("unable to release mouse capture")
//}
//w32.SendMessage(f.mainWindow.Handle(), w32.WM_NCLBUTTONDOWN, w32.HTCAPTION, 0)
//w32.SendMessage(f.gtkWindow.Handle(), w32.WM_NCLBUTTONDOWN, w32.HTCAPTION, 0)
return nil
}
func (f *Frontend) ExecJS(js string) {
//f.mainWindow.Dispatch(func() {
//f.gtkWindow.Dispatch(func() {
// f.chromium.Eval(js)
//})
}
@ -392,6 +396,6 @@ func (f *Frontend) ExecJS(js string) {
// return
// }
//
// f.mainWindow.Show()
// f.gtkWindow.Show()
//
//}

View File

@ -4,8 +4,14 @@
package linux
import (
"github.com/gotk3/gotk3/gdk"
"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
"github.com/wailsapp/wails/v2/pkg/menu"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/wailsapp/wails/v2/pkg/options/linux"
"log"
"math"
"sync"
)
@ -13,12 +19,59 @@ type Window struct {
frontendOptions *options.App
applicationMenu *menu.Menu
m sync.Mutex
application *gtk.Application
gtkWindow *gtk.ApplicationWindow
//dispatchq []func()
}
func NewWindow(options *options.App) *Window {
result := new(Window)
result.frontendOptions = options
var linuxOptions linux.Options
if options.Linux != nil {
linuxOptions = *options.Linux
}
appID := linuxOptions.AppID
if appID == "" {
appID = "io.wails"
}
println("AppID =", appID)
application, err := gtk.ApplicationNew(appID, glib.APPLICATION_FLAGS_NONE)
if err != nil {
log.Fatal("Could not create application:", err)
}
result.application = application
application.Connect("activate", func() {
window, err := gtk.ApplicationWindowNew(application)
if err != nil {
log.Fatal("Could not create application window:", err)
}
window.Connect("delete-event", func() {
if options.HideWindowOnClose {
result.gtkWindow.Hide()
return
}
result.gtkWindow.Close()
})
result.gtkWindow = window
window.SetTitle(options.Title)
window.SetDecorated(!options.Frameless)
window.SetDefaultSize(600, 300)
window.SetResizable(!options.DisableResize)
window.SetKeepAbove(options.AlwaysOnTop)
window.SetPosition(gtk.WIN_POS_CENTER)
if !options.StartHidden {
window.ShowAll()
}
})
//result.SetIsForm(true)
//
//var exStyle int
@ -84,79 +137,109 @@ func NewWindow(options *options.App) *Window {
}
func (w *Window) Run() {
w.application.Run(nil)
}
func (w *Window) Dispatch(f func()) {
//w.m.Lock()
//w.dispatchq = append(w.dispatchq, f)
//w.m.Unlock()
//w32.PostMainThreadMessage(w32.WM_APP, 0, 0)
glib.IdleAdd(f)
}
func (w *Window) Fullscreen() {
}
func (w *Window) Close() {
}
func (w *Window) Center() {
}
func (w *Window) SetPos(x int, y int) {
}
func (w *Window) Pos() (int, int) {
return 0, 0
}
func (w *Window) SetSize(width int, height int) {
}
func (w *Window) Size() (int, int) {
return 0, 0
}
func (w *Window) SetText(title string) {
}
func (w *Window) SetMaxSize(maxWidth int, maxHeight int) {
}
func (w *Window) SetMinSize(minWidth int, minHeight int) {
w.gtkWindow.Fullscreen()
}
func (w *Window) UnFullscreen() {
w.gtkWindow.Unfullscreen()
}
func (w *Window) Close() {
w.application.Quit()
}
func (w *Window) Center() {
w.gtkWindow.SetPosition(gtk.WIN_POS_CENTER)
}
func (w *Window) SetPos(x int, y int) {
display, err := w.gtkWindow.GetDisplay()
if err != nil {
w.gtkWindow.Move(x, y)
return
}
window, err := w.gtkWindow.GetWindow()
if err != nil {
w.gtkWindow.Move(x, y)
return
}
monitor, err := display.GetMonitorAtWindow(window)
if err != nil {
w.gtkWindow.Move(x, y)
return
}
geom := monitor.GetGeometry()
w.gtkWindow.Move(geom.GetX()+x, geom.GetY()+y)
}
func (w *Window) Pos() (int, int) {
return w.gtkWindow.GetPosition()
}
func (w *Window) SetSize(width int, height int) {
w.gtkWindow.SetDefaultSize(width, height)
}
func (w *Window) Size() (int, int) {
return w.gtkWindow.GetSize()
}
func (w *Window) SetText(title string) {
w.gtkWindow.SetTitle(title)
}
func (w *Window) SetMaxSize(maxWidth int, maxHeight int) {
var geom gdk.Geometry
if maxWidth == 0 {
maxWidth = math.MaxInt
}
if maxHeight == 0 {
maxHeight = math.MaxInt
}
geom.SetMaxWidth(maxWidth)
geom.SetMaxHeight(maxHeight)
w.gtkWindow.SetGeometryHints(w.gtkWindow, geom, gdk.HINT_MAX_SIZE)
}
func (w *Window) SetMinSize(minWidth int, minHeight int) {
var geom gdk.Geometry
geom.SetMinWidth(minWidth)
geom.SetMinHeight(minHeight)
w.gtkWindow.SetGeometryHints(w.gtkWindow, geom, gdk.HINT_MIN_SIZE)
}
func (w *Window) Show() {
w.gtkWindow.ShowAll()
}
func (w *Window) Hide() {
w.gtkWindow.Hide()
}
func (w *Window) Maximise() {
w.gtkWindow.Maximize()
}
func (w *Window) Restore() {
func (w *Window) UnMaximise() {
w.gtkWindow.Unmaximize()
}
func (w *Window) Minimise() {
w.gtkWindow.Iconify()
}
func (w *Window) UnMinimise() {
w.gtkWindow.Present()
}
func (w *Window) IsFullScreen() bool {

View File

@ -0,0 +1,7 @@
package linux
// Options specific to Linux builds
type Options struct {
// AppID is the gtk application id string. Defaults to a random uuid.
AppID string
}

View File

@ -3,6 +3,7 @@ package options
import (
"context"
"embed"
"github.com/wailsapp/wails/v2/pkg/options/linux"
"log"
"runtime"
@ -44,6 +45,7 @@ type App struct {
//TrayMenus []*menu.TrayMenu
Windows *windows.Options
Mac *mac.Options
Linux *linux.Options
}
type RGBA struct {