712 lines
14 KiB
Text
712 lines
14 KiB
Text
---
|
|
title: Window API
|
|
description: Complete reference for the Window API
|
|
sidebar:
|
|
order: 2
|
|
---
|
|
|
|
import { Card, CardGrid } from "@astrojs/starlight/components";
|
|
|
|
## Overview
|
|
|
|
The Window API provides methods to control window appearance, behaviour, and lifecycle. Access through window instances or the Window manager.
|
|
|
|
**Common operations:**
|
|
- Create and show windows
|
|
- Control size, position, and state
|
|
- Handle window events
|
|
- Manage window content
|
|
- Configure appearance and behaviour
|
|
|
|
## Visibility
|
|
|
|
### Show()
|
|
|
|
Shows the window. If the window was hidden, it becomes visible.
|
|
|
|
```go
|
|
func (w *Window) Show()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
window := app.Window.New()
|
|
window.Show()
|
|
```
|
|
|
|
### Hide()
|
|
|
|
Hides the window without closing it. The window remains in memory and can be shown again.
|
|
|
|
```go
|
|
func (w *Window) Hide()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Hide window temporarily
|
|
window.Hide()
|
|
|
|
// Show it again later
|
|
window.Show()
|
|
```
|
|
|
|
**Use cases:**
|
|
- System tray applications that hide to tray
|
|
- Wizard flows where windows are reused
|
|
- Temporary hiding during operations
|
|
|
|
### Close()
|
|
|
|
Closes the window. This triggers the `WindowClosing` event.
|
|
|
|
```go
|
|
func (w *Window) Close()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
window.Close()
|
|
```
|
|
|
|
**Note:** If a registered hook calls `event.Cancel()`, the close will be prevented.
|
|
|
|
## Window Properties
|
|
|
|
### SetTitle()
|
|
|
|
Sets the window title bar text.
|
|
|
|
```go
|
|
func (w *Window) SetTitle(title string)
|
|
```
|
|
|
|
**Parameters:**
|
|
- `title` - The new window title
|
|
|
|
**Example:**
|
|
```go
|
|
window.SetTitle("My Application - Document.txt")
|
|
```
|
|
|
|
### Name()
|
|
|
|
Returns the window's unique name identifier.
|
|
|
|
```go
|
|
func (w *Window) Name() string
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
name := window.Name()
|
|
fmt.Println("Window name:", name)
|
|
|
|
// Retrieve window by name later
|
|
window := app.GetWindowByName(name)
|
|
```
|
|
|
|
## Size and Position
|
|
|
|
### SetSize()
|
|
|
|
Sets the window dimensions in pixels.
|
|
|
|
```go
|
|
func (w *Window) SetSize(width, height int)
|
|
```
|
|
|
|
**Parameters:**
|
|
- `width` - Window width in pixels
|
|
- `height` - Window height in pixels
|
|
|
|
**Example:**
|
|
```go
|
|
window.SetSize(1024, 768)
|
|
```
|
|
|
|
### Size()
|
|
|
|
Returns the current window dimensions.
|
|
|
|
```go
|
|
func (w *Window) Size() (width, height int)
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
width, height := window.Size()
|
|
fmt.Printf("Window is %dx%d\n", width, height)
|
|
```
|
|
|
|
### SetMinSize() / SetMaxSize()
|
|
|
|
Sets minimum and maximum window dimensions.
|
|
|
|
```go
|
|
func (w *Window) SetMinSize(width, height int)
|
|
func (w *Window) SetMaxSize(width, height int)
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Prevent window from being too small
|
|
window.SetMinSize(800, 600)
|
|
|
|
// Prevent window from being too large
|
|
window.SetMaxSize(1920, 1080)
|
|
```
|
|
|
|
### SetPosition()
|
|
|
|
Sets the window position relative to the top-left corner of the screen.
|
|
|
|
```go
|
|
func (w *Window) SetPosition(x, y int)
|
|
```
|
|
|
|
**Parameters:**
|
|
- `x` - Horizontal position in pixels
|
|
- `y` - Vertical position in pixels
|
|
|
|
**Example:**
|
|
```go
|
|
// Position window at top-left
|
|
window.SetPosition(0, 0)
|
|
|
|
// Position window 100px from top-left
|
|
window.SetPosition(100, 100)
|
|
```
|
|
|
|
### Position()
|
|
|
|
Returns the current window position.
|
|
|
|
```go
|
|
func (w *Window) Position() (x, y int)
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
x, y := window.Position()
|
|
fmt.Printf("Window is at (%d, %d)\n", x, y)
|
|
```
|
|
|
|
### Centre()
|
|
|
|
Centers the window on the screen.
|
|
|
|
```go
|
|
func (w *Window) Centre()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
window := app.Window.New()
|
|
window.Centre()
|
|
window.Show()
|
|
```
|
|
|
|
**Note:** Centre on the primary monitor. For multi-monitor setups, see screen APIs.
|
|
|
|
### SetFocus()
|
|
|
|
Brings the window to the front and gives it keyboard focus.
|
|
|
|
```go
|
|
func (w *Window) SetFocus()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Bring window to front
|
|
window.SetFocus()
|
|
```
|
|
|
|
## Window State
|
|
|
|
### Minimise() / UnMinimise()
|
|
|
|
Minimizes the window to the taskbar/dock or restores it.
|
|
|
|
```go
|
|
func (w *Window) Minimise()
|
|
func (w *Window) UnMinimise()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Minimize window
|
|
window.Minimise()
|
|
|
|
// Restore from minimized state
|
|
window.UnMinimise()
|
|
```
|
|
|
|
### Maximise() / UnMaximise()
|
|
|
|
Maximizes the window to fill the screen or restores it to its previous size.
|
|
|
|
```go
|
|
func (w *Window) Maximise()
|
|
func (w *Window) UnMaximise()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Maximize window
|
|
window.Maximise()
|
|
|
|
// Restore to previous size
|
|
window.UnMaximise()
|
|
```
|
|
|
|
### Fullscreen() / UnFullscreen()
|
|
|
|
Enters or exits fullscreen mode.
|
|
|
|
```go
|
|
func (w *Window) Fullscreen()
|
|
func (w *Window) UnFullscreen()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Enter fullscreen
|
|
window.Fullscreen()
|
|
|
|
// Exit fullscreen
|
|
window.UnFullscreen()
|
|
```
|
|
|
|
### IsMinimised() / IsMaximised() / IsFullscreen()
|
|
|
|
Checks the current window state.
|
|
|
|
```go
|
|
func (w *Window) IsMinimised() bool
|
|
func (w *Window) IsMaximised() bool
|
|
func (w *Window) IsFullscreen() bool
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
if window.IsMinimised() {
|
|
window.UnMinimise()
|
|
}
|
|
|
|
if window.IsMaximised() {
|
|
fmt.Println("Window is maximized")
|
|
}
|
|
|
|
if window.IsFullscreen() {
|
|
window.UnFullscreen()
|
|
}
|
|
```
|
|
|
|
## Window Content
|
|
|
|
### SetURL()
|
|
|
|
Navigates to a specific URL within the window.
|
|
|
|
```go
|
|
func (w *Window) SetURL(url string)
|
|
```
|
|
|
|
**Parameters:**
|
|
- `url` - URL to navigate to (can be `http://wails.localhost/` for embedded assets)
|
|
|
|
**Example:**
|
|
```go
|
|
// Navigate to embedded page
|
|
window.SetURL("http://wails.localhost/settings.html")
|
|
|
|
// Navigate to external URL (if allowed)
|
|
window.SetURL("https://wails.io")
|
|
```
|
|
|
|
### SetHTML()
|
|
|
|
Sets the window content directly from an HTML string.
|
|
|
|
```go
|
|
func (w *Window) SetHTML(html string)
|
|
```
|
|
|
|
**Parameters:**
|
|
- `html` - HTML content to display
|
|
|
|
**Example:**
|
|
```go
|
|
html := `
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head><title>Dynamic Content</title></head>
|
|
<body>
|
|
<h1>Hello from Go!</h1>
|
|
<p>This content was generated dynamically.</p>
|
|
</body>
|
|
</html>
|
|
`
|
|
window.SetHTML(html)
|
|
```
|
|
|
|
**Use cases:**
|
|
- Dynamic content generation
|
|
- Simple windows without frontend build process
|
|
- Error pages or splash screens
|
|
|
|
### Reload()
|
|
|
|
Reloads the current window content.
|
|
|
|
```go
|
|
func (w *Window) Reload()
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Reload current page
|
|
window.Reload()
|
|
```
|
|
|
|
**Note:** Useful during development or when content needs refreshing.
|
|
|
|
## Window Events
|
|
|
|
Wails provides two methods for handling window events:
|
|
|
|
- **OnWindowEvent()** - Listen to window events (cannot prevent them)
|
|
- **RegisterHook()** - Hook into window events (can prevent them by calling `event.Cancel()`)
|
|
|
|
### OnWindowEvent()
|
|
|
|
Registers a callback for window events.
|
|
|
|
```go
|
|
func (w *Window) OnWindowEvent(
|
|
eventType events.WindowEventType,
|
|
callback func(event *WindowEvent),
|
|
) func()
|
|
```
|
|
|
|
**Returns:** Cleanup function to remove the event listener
|
|
|
|
**Example:**
|
|
```go
|
|
import "github.com/wailsapp/wails/v3/pkg/events"
|
|
|
|
// Listen for window focus
|
|
window.OnWindowEvent(events.Common.WindowFocus, func(e *application.WindowEvent) {
|
|
app.Logger.Info("Window gained focus")
|
|
})
|
|
|
|
// Listen for window lost focus
|
|
window.OnWindowEvent(events.Common.WindowLostFocus, func(e *application.WindowEvent) {
|
|
app.Logger.Info("Window lost focus")
|
|
})
|
|
|
|
// Listen for window resize
|
|
window.OnWindowEvent(events.Common.WindowDidResize, func(e *application.WindowEvent) {
|
|
app.Logger.Info("Window resized")
|
|
})
|
|
```
|
|
|
|
**Common Window Events:**
|
|
- `events.Common.WindowClosing` - Window is about to close
|
|
- `events.Common.WindowFocus` - Window gained focus
|
|
- `events.Common.WindowLostFocus` - Window lost focus
|
|
- `events.Common.WindowDidMove` - Window moved
|
|
- `events.Common.WindowDidResize` - Window resized
|
|
- `events.Common.WindowMinimise` - Window minimized
|
|
- `events.Common.WindowMaximise` - Window maximized
|
|
- `events.Common.WindowFullscreen` - Window entered fullscreen
|
|
|
|
### RegisterHook()
|
|
|
|
Registers a hook for window events. Hooks run before listeners and can prevent the event by calling `event.Cancel()`.
|
|
|
|
```go
|
|
func (w *Window) RegisterHook(
|
|
eventType events.WindowEventType,
|
|
callback func(event *WindowEvent),
|
|
) func()
|
|
```
|
|
|
|
**Returns:** Cleanup function to remove the hook
|
|
|
|
**Example - Prevent window close:**
|
|
```go
|
|
import "github.com/wailsapp/wails/v3/pkg/events"
|
|
|
|
window.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) {
|
|
result, _ := app.Dialog.Question().
|
|
SetTitle("Confirm Close").
|
|
SetMessage("Are you sure you want to close this window?").
|
|
SetButtons("Yes", "No").
|
|
Show()
|
|
|
|
if result == "No" {
|
|
e.Cancel() // Prevent window from closing
|
|
}
|
|
})
|
|
```
|
|
|
|
**Example - Save before closing:**
|
|
```go
|
|
window.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) {
|
|
if hasUnsavedChanges {
|
|
result, _ := app.Dialog.Question().
|
|
SetMessage("Save changes before closing?").
|
|
SetButtons("Save", "Don't Save", "Cancel").
|
|
Show()
|
|
|
|
switch result {
|
|
case "Save":
|
|
saveData()
|
|
// Allow close
|
|
case "Don't Save":
|
|
// Allow close
|
|
case "Cancel":
|
|
e.Cancel() // Prevent close
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### EmitEvent()
|
|
|
|
Emits a custom event to the window's frontend.
|
|
|
|
```go
|
|
func (w *Window) EmitEvent(name string, data ...interface{})
|
|
```
|
|
|
|
**Parameters:**
|
|
- `name` - Event name
|
|
- `data` - Optional data to send with the event
|
|
|
|
**Example:**
|
|
```go
|
|
// Send data to specific window
|
|
window.EmitEvent("data-updated", map[string]interface{}{
|
|
"count": 42,
|
|
"status": "success",
|
|
})
|
|
```
|
|
|
|
**Frontend (JavaScript):**
|
|
```javascript
|
|
import { Events } from '@wailsio/runtime'
|
|
|
|
Events.On('data-updated', (data) => {
|
|
console.log('Count:', data.count)
|
|
console.log('Status:', data.status)
|
|
})
|
|
```
|
|
|
|
## Other Methods
|
|
|
|
### SetEnabled()
|
|
|
|
Enables or disables user interaction with the window.
|
|
|
|
```go
|
|
func (w *Window) SetEnabled(enabled bool)
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Disable window during long operation
|
|
window.SetEnabled(false)
|
|
|
|
// Perform operation
|
|
performLongOperation()
|
|
|
|
// Re-enable window
|
|
window.SetEnabled(true)
|
|
```
|
|
|
|
### SetBackgroundColour()
|
|
|
|
Sets the window background color (shown before content loads).
|
|
|
|
```go
|
|
func (w *Window) SetBackgroundColour(r, g, b, a uint8)
|
|
```
|
|
|
|
**Parameters:**
|
|
- `r` - Red (0-255)
|
|
- `g` - Green (0-255)
|
|
- `b` - Blue (0-255)
|
|
- `a` - Alpha/opacity (0-255)
|
|
|
|
**Example:**
|
|
```go
|
|
// Set white background
|
|
window.SetBackgroundColour(255, 255, 255, 255)
|
|
|
|
// Set dark background
|
|
window.SetBackgroundColour(30, 30, 30, 255)
|
|
```
|
|
|
|
### SetResizable()
|
|
|
|
Controls whether the window can be resized by the user.
|
|
|
|
```go
|
|
func (w *Window) SetResizable(resizable bool)
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Make window fixed size
|
|
window.SetResizable(false)
|
|
```
|
|
|
|
### SetAlwaysOnTop()
|
|
|
|
Sets whether the window stays above other windows.
|
|
|
|
```go
|
|
func (w *Window) SetAlwaysOnTop(alwaysOnTop bool)
|
|
```
|
|
|
|
**Example:**
|
|
```go
|
|
// Keep window on top
|
|
window.SetAlwaysOnTop(true)
|
|
```
|
|
|
|
### Print()
|
|
|
|
Opens the native print dialog for the window content.
|
|
|
|
```go
|
|
func (w *Window) Print() error
|
|
```
|
|
|
|
**Returns:** Error if printing fails
|
|
|
|
**Example:**
|
|
```go
|
|
err := window.Print()
|
|
if err != nil {
|
|
log.Println("Print failed:", err)
|
|
}
|
|
```
|
|
|
|
### AttachModal()
|
|
|
|
Attaches a second Window as a sheet modal.
|
|
|
|
```go
|
|
func (w *Window) AttachModal(modalWindow Window)
|
|
```
|
|
|
|
**Parameters:**
|
|
- `modalWindow` - The window to attach as a modal
|
|
|
|
**Platform support:**
|
|
- **macOS**: Full support (presents as a sheet)
|
|
- **Windows**: No support
|
|
- **Linux**: No support
|
|
|
|
**Example:**
|
|
```go
|
|
modalWindow := app.Window.New()
|
|
window.AttachModal(modalWindow)
|
|
```
|
|
|
|
## Platform-Specific Options
|
|
|
|
### Linux
|
|
|
|
Linux windows support the following platform-specific options via `LinuxWindow`:
|
|
|
|
#### MenuStyle
|
|
|
|
Controls how the application menu is displayed. This option is only available on GTK4 builds and is ignored on GTK3.
|
|
|
|
| Value | Description |
|
|
|-------|-------------|
|
|
| `LinuxMenuStyleMenuBar` | Traditional menu bar below the title bar (default) |
|
|
| `LinuxMenuStylePrimaryMenu` | Primary menu button in the header bar (GNOME style) |
|
|
|
|
**Example:**
|
|
```go
|
|
window := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
|
|
Title: "My Application",
|
|
Linux: application.LinuxWindow{
|
|
MenuStyle: application.LinuxMenuStylePrimaryMenu,
|
|
},
|
|
})
|
|
window.SetMenu(menu)
|
|
```
|
|
|
|
**Note:** The primary menu style displays a hamburger button (☰) in the header bar, following GNOME Human Interface Guidelines. This is the recommended style for modern GNOME applications.
|
|
|
|
## Complete Example
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"github.com/wailsapp/wails/v3/pkg/application"
|
|
"github.com/wailsapp/wails/v3/pkg/events"
|
|
)
|
|
|
|
func main() {
|
|
app := application.New(application.Options{
|
|
Name: "Window API Demo",
|
|
})
|
|
|
|
// Create window with options
|
|
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
|
|
Title: "My Application",
|
|
Width: 1024,
|
|
Height: 768,
|
|
MinWidth: 800,
|
|
MinHeight: 600,
|
|
BackgroundColour: application.NewRGB(255, 255, 255),
|
|
URL: "http://wails.localhost/",
|
|
})
|
|
|
|
// Configure window behavior
|
|
window.SetResizable(true)
|
|
window.SetMinSize(800, 600)
|
|
window.SetMaxSize(1920, 1080)
|
|
|
|
// Set up event hooks
|
|
window.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) {
|
|
// Confirm before closing
|
|
result, _ := app.Dialog.Question().
|
|
SetTitle("Confirm Close").
|
|
SetMessage("Are you sure you want to close this window?").
|
|
SetButtons("Yes", "No").
|
|
Show()
|
|
|
|
if result == "No" {
|
|
e.Cancel()
|
|
}
|
|
})
|
|
|
|
// Listen for window events
|
|
window.OnWindowEvent(events.Common.WindowFocus, func(e *application.WindowEvent) {
|
|
window.SetTitle("My Application (Active)")
|
|
app.Logger.Info("Window gained focus")
|
|
})
|
|
|
|
window.OnWindowEvent(events.Common.WindowLostFocus, func(e *application.WindowEvent) {
|
|
window.SetTitle("My Application")
|
|
app.Logger.Info("Window lost focus")
|
|
})
|
|
|
|
// Position and show window
|
|
window.Centre()
|
|
window.Show()
|
|
|
|
app.Run()
|
|
}
|
|
```
|