Skip to content

Customising Window Controls in Wails#

Wails provides an API to control the appearance and functionality of the controls of a window. This functionality is available on Windows and macOS, but not on Linux.

Setting the Window Button States#

The button states are defined by the ButtonState enum:

type ButtonState int

const (
    ButtonEnabled   ButtonState = 0
    ButtonDisabled ButtonState = 1
    ButtonHidden   ButtonState = 2
)
  • ButtonEnabled: The button is enabled and visible.
  • ButtonDisabled: The button is visible but disabled (grayed out).
  • ButtonHidden: The button is hidden from the titlebar.

The button states can be set during window creation or at runtime.

Setting Button States During Window Creation#

When creating a new window, you can set the initial state of the buttons using the WebviewWindowOptions struct:

package main

import (
    "github.com/wailsapp/wails/v3/pkg/application"
)

func main() {
    app := application.New(application.Options{
        Name:        "My Application",
    })

    app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
        MinimiseButtonState: application.ButtonHidden,
        MaximiseButtonState: application.ButtonDisabled,
        CloseButtonState:    application.ButtonEnabled,
    })

    app.Run()
}

In the example above, the minimise button is hidden, the maximise button is inactive (grayed out), and the close button is active.

Setting Button States at Runtime#

You can also change the button states at runtime using the following methods on the Window interface:

window.SetMinimiseButtonState(wails.ButtonHidden)
window.SetMaximiseButtonState(wails.ButtonEnabled)
window.SetCloseButtonState(wails.ButtonDisabled)

Platform Differences#

The button state functionality behaves slightly differently on Windows and macOS:

Windows Mac
Disable Min/Max/Close Disables Min/Max/Close Disables Min/Max/Close
Hide Min Disables Min Hides Min button
Hide Max Disables Max Hides Max button
Hide Close Hides all controls Hides Close

Note: On Windows, it is not possible to hide the Min/Max buttons individually. However, disabling both will hide both of the controls and only show the close button.

Controlling Window Style (Windows)#

To control the style of the titlebar on Windows, you can use the ExStyle field in the WebviewWindowOptions struct:

Example:

package main

import (
    "github.com/wailsapp/wails/v3/pkg/application"
    "github.com/wailsapp/wails/v3/pkg/w32"
)

func main() {
    app := application.New(application.Options{
        Name: "My Application",
    })

    app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{
        Windows: application.WindowsWindow{
            ExStyle: w32.WS_EX_TOOLWINDOW | w32.WS_EX_NOREDIRECTIONBITMAP | w32.WS_EX_TOPMOST,
        },
    })

    app.Run()
}

Other options that affect the Extended Style of a window will be overridden by this setting: - HiddenOnTaskbar - AlwaysOnTop - IgnoreMouseEvents - BackgroundType