mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 19:31:20 +08:00
Support GPU acceleration settings on Windows & Linux (#2266)
* support GPU acceleration settings Window & Linux * fix linux empty option crash * fix change linux gpu policy switch case * add PR to changelog
This commit is contained in:
parent
d3b4105f75
commit
ef5f547d27
@ -214,7 +214,7 @@ gboolean close_button_pressed(GtkWidget *widget, GdkEvent *event, void* data)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget* setupWebview(void* contentManager, GtkWindow* window, int hideWindowOnClose) {
|
GtkWidget* setupWebview(void* contentManager, GtkWindow* window, int hideWindowOnClose, int gpuPolicy) {
|
||||||
GtkWidget* webview = webkit_web_view_new_with_user_content_manager((WebKitUserContentManager*)contentManager);
|
GtkWidget* webview = webkit_web_view_new_with_user_content_manager((WebKitUserContentManager*)contentManager);
|
||||||
//gtk_container_add(GTK_CONTAINER(window), webview);
|
//gtk_container_add(GTK_CONTAINER(window), webview);
|
||||||
WebKitWebContext *context = webkit_web_context_get_default();
|
WebKitWebContext *context = webkit_web_context_get_default();
|
||||||
@ -228,6 +228,20 @@ GtkWidget* setupWebview(void* contentManager, GtkWindow* window, int hideWindowO
|
|||||||
|
|
||||||
WebKitSettings *settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(webview));
|
WebKitSettings *settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(webview));
|
||||||
webkit_settings_set_user_agent_with_application_details(settings, "wails.io", "");
|
webkit_settings_set_user_agent_with_application_details(settings, "wails.io", "");
|
||||||
|
|
||||||
|
switch (gpuPolicy) {
|
||||||
|
case 0:
|
||||||
|
webkit_settings_set_hardware_acceleration_policy(settings, WEBKIT_HARDWARE_ACCELERATION_POLICY_ALWAYS);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
webkit_settings_set_hardware_acceleration_policy(settings, WEBKIT_HARDWARE_ACCELERATION_POLICY_ON_DEMAND);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
webkit_settings_set_hardware_acceleration_policy(settings, WEBKIT_HARDWARE_ACCELERATION_POLICY_NEVER);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
webkit_settings_set_hardware_acceleration_policy(settings, WEBKIT_HARDWARE_ACCELERATION_POLICY_ON_DEMAND);
|
||||||
|
}
|
||||||
return webview;
|
return webview;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -706,7 +720,17 @@ func NewWindow(appoptions *options.App, debug bool) *Window {
|
|||||||
C.webkit_user_content_manager_register_script_message_handler(result.cWebKitUserContentManager(), external)
|
C.webkit_user_content_manager_register_script_message_handler(result.cWebKitUserContentManager(), external)
|
||||||
C.setupInvokeSignal(result.contentManager)
|
C.setupInvokeSignal(result.contentManager)
|
||||||
|
|
||||||
webview := C.setupWebview(result.contentManager, result.asGTKWindow(), bool2Cint(appoptions.HideWindowOnClose))
|
var webviewGpuPolicy int
|
||||||
|
if appoptions.Linux != nil {
|
||||||
|
webviewGpuPolicy = int(appoptions.Linux.WebviewGpuPolicy)
|
||||||
|
}
|
||||||
|
|
||||||
|
webview := C.setupWebview(
|
||||||
|
result.contentManager,
|
||||||
|
result.asGTKWindow(),
|
||||||
|
bool2Cint(appoptions.HideWindowOnClose),
|
||||||
|
C.int(webviewGpuPolicy),
|
||||||
|
)
|
||||||
result.webview = unsafe.Pointer(webview)
|
result.webview = unsafe.Pointer(webview)
|
||||||
buttonPressedName := C.CString("button-press-event")
|
buttonPressedName := C.CString("button-press-event")
|
||||||
defer C.free(unsafe.Pointer(buttonPressedName))
|
defer C.free(unsafe.Pointer(buttonPressedName))
|
||||||
|
@ -412,7 +412,12 @@ func (f *Frontend) setupChromium() {
|
|||||||
if opts := f.frontendOptions.Windows; opts != nil {
|
if opts := f.frontendOptions.Windows; opts != nil {
|
||||||
chromium.DataPath = opts.WebviewUserDataPath
|
chromium.DataPath = opts.WebviewUserDataPath
|
||||||
chromium.BrowserPath = opts.WebviewBrowserPath
|
chromium.BrowserPath = opts.WebviewBrowserPath
|
||||||
|
|
||||||
|
if opts.WebviewGpuIsDisabled {
|
||||||
|
chromium.AdditionalBrowserArgs = append(chromium.AdditionalBrowserArgs, "--disable-gpu")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
chromium.MessageCallback = f.processMessage
|
chromium.MessageCallback = f.processMessage
|
||||||
chromium.WebResourceRequestedCallback = f.processRequest
|
chromium.WebResourceRequestedCallback = f.processRequest
|
||||||
chromium.NavigationCompletedCallback = f.navigationCompleted
|
chromium.NavigationCompletedCallback = f.navigationCompleted
|
||||||
@ -420,6 +425,7 @@ func (f *Frontend) setupChromium() {
|
|||||||
w32.PostMessage(f.mainWindow.Handle(), w32.WM_KEYDOWN, uintptr(vkey), 0)
|
w32.PostMessage(f.mainWindow.Handle(), w32.WM_KEYDOWN, uintptr(vkey), 0)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
chromium.Embed(f.mainWindow.Handle())
|
chromium.Embed(f.mainWindow.Handle())
|
||||||
chromium.Resize()
|
chromium.Resize()
|
||||||
settings, err := chromium.GetSettings()
|
settings, err := chromium.GetSettings()
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
@ -36,9 +37,10 @@ type Chromium struct {
|
|||||||
padding Rect
|
padding Rect
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
Debug bool
|
Debug bool
|
||||||
DataPath string
|
DataPath string
|
||||||
BrowserPath string
|
BrowserPath string
|
||||||
|
AdditionalBrowserArgs []string
|
||||||
|
|
||||||
// permissions
|
// permissions
|
||||||
permissions map[CoreWebView2PermissionKind]CoreWebView2PermissionState
|
permissions map[CoreWebView2PermissionKind]CoreWebView2PermissionState
|
||||||
@ -98,7 +100,8 @@ func (e *Chromium) Embed(hwnd uintptr) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := createCoreWebView2EnvironmentWithOptions(e.BrowserPath, dataPath, e.envCompleted); err != nil {
|
browserArgs := strings.Join(e.AdditionalBrowserArgs, " ")
|
||||||
|
if err := createCoreWebView2EnvironmentWithOptions(e.BrowserPath, dataPath, e.envCompleted, browserArgs); err != nil {
|
||||||
log.Printf("Error calling Webview2Loader: %v", err)
|
log.Printf("Error calling Webview2Loader: %v", err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,13 @@ import (
|
|||||||
"github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader"
|
"github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader"
|
||||||
)
|
)
|
||||||
|
|
||||||
func createCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder string, environmentCompletedHandle *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler) error {
|
func createCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder string, environmentCompletedHandle *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, additionalBrowserArgs string) error {
|
||||||
e := &environmentCreatedHandler{environmentCompletedHandle}
|
e := &environmentCreatedHandler{environmentCompletedHandle}
|
||||||
return webviewloader.CreateCoreWebView2EnvironmentWithOptions(
|
return webviewloader.CreateCoreWebView2EnvironmentWithOptions(
|
||||||
e,
|
e,
|
||||||
webviewloader.WithBrowserExecutableFolder(browserExecutableFolder),
|
webviewloader.WithBrowserExecutableFolder(browserExecutableFolder),
|
||||||
webviewloader.WithUserDataFolder(userDataFolder),
|
webviewloader.WithUserDataFolder(userDataFolder),
|
||||||
|
webviewloader.WithAdditionalBrowserArguments(additionalBrowserArgs),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ import (
|
|||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
func createCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder string, environmentCompletedHandle *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler) error {
|
func createCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder string, environmentCompletedHandle *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, additionalBrowserArgs string) error {
|
||||||
browserPathPtr, err := windows.UTF16PtrFromString(browserExecutableFolder)
|
browserPathPtr, err := windows.UTF16PtrFromString(browserExecutableFolder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error calling UTF16PtrFromString for %s: %v", browserExecutableFolder, err)
|
return fmt.Errorf("Error calling UTF16PtrFromString for %s: %v", browserExecutableFolder, err)
|
||||||
|
@ -7,13 +7,13 @@ import (
|
|||||||
|
|
||||||
// Default options for creating the App
|
// Default options for creating the App
|
||||||
var Default = &App{
|
var Default = &App{
|
||||||
Width: 1024,
|
Width: 1024,
|
||||||
Height: 768,
|
Height: 768,
|
||||||
Logger: logger.NewDefaultLogger(),
|
Logger: logger.NewDefaultLogger(),
|
||||||
LogLevel: logger.INFO,
|
LogLevel: logger.INFO,
|
||||||
LogLevelProduction: logger.ERROR,
|
LogLevelProduction: logger.ERROR,
|
||||||
CSSDragProperty: "--wails-draggable",
|
CSSDragProperty: "--wails-draggable",
|
||||||
CSSDragValue: "drag",
|
CSSDragValue: "drag",
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultMacMenu = menu.NewMenuFromItems(
|
var defaultMacMenu = menu.NewMenuFromItems(
|
||||||
|
@ -1,12 +1,34 @@
|
|||||||
package linux
|
package linux
|
||||||
|
|
||||||
|
// WebviewGpuPolicy values used for determining the webview's hardware acceleration policy.
|
||||||
|
type WebviewGpuPolicy int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// WebviewGpuPolicyAlways Hardware acceleration is always enabled.
|
||||||
|
WebviewGpuPolicyAlways WebviewGpuPolicy = iota
|
||||||
|
// WebviewGpuPolicyOnDemand Hardware acceleration is enabled/disabled as request by web contents.
|
||||||
|
WebviewGpuPolicyOnDemand
|
||||||
|
// WebviewGpuPolicyNever Hardware acceleration is always disabled.
|
||||||
|
WebviewGpuPolicyNever
|
||||||
|
)
|
||||||
|
|
||||||
// Options specific to Linux builds
|
// Options specific to Linux builds
|
||||||
type Options struct {
|
type Options struct {
|
||||||
Icon []byte
|
// Icon Sets up the icon representing the window. This icon is used when the window is minimized
|
||||||
|
// (also known as iconified).
|
||||||
|
Icon []byte
|
||||||
|
|
||||||
|
// WindowIsTranslucent sets the window's background to transparent when enabled.
|
||||||
WindowIsTranslucent bool
|
WindowIsTranslucent bool
|
||||||
|
|
||||||
// User messages that can be customised
|
// Messages are messages that can be customised
|
||||||
Messages *Messages
|
Messages *Messages
|
||||||
|
|
||||||
|
// WebviewGpuPolicy used for determining the hardware acceleration policy for the webview.
|
||||||
|
// - WebviewGpuPolicyAlways
|
||||||
|
// - WebviewGpuPolicyOnDemand
|
||||||
|
// - WebviewGpuPolicyNever
|
||||||
|
WebviewGpuPolicy WebviewGpuPolicy
|
||||||
}
|
}
|
||||||
|
|
||||||
type Messages struct {
|
type Messages struct {
|
||||||
|
@ -2,6 +2,7 @@ package options
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options/linux"
|
||||||
"html"
|
"html"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
@ -9,7 +10,6 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
|
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
|
||||||
"github.com/wailsapp/wails/v2/pkg/options/linux"
|
|
||||||
"github.com/wailsapp/wails/v2/pkg/options/mac"
|
"github.com/wailsapp/wails/v2/pkg/options/mac"
|
||||||
"github.com/wailsapp/wails/v2/pkg/options/windows"
|
"github.com/wailsapp/wails/v2/pkg/options/windows"
|
||||||
|
|
||||||
|
@ -96,8 +96,12 @@ type Options struct {
|
|||||||
|
|
||||||
// OnSuspend is called when Windows enters low power mode
|
// OnSuspend is called when Windows enters low power mode
|
||||||
OnSuspend func()
|
OnSuspend func()
|
||||||
|
|
||||||
// OnResume is called when Windows resumes from low power mode
|
// OnResume is called when Windows resumes from low power mode
|
||||||
OnResume func()
|
OnResume func()
|
||||||
|
|
||||||
|
// WebviewGpuIsDisabled is used to enable / disable GPU acceleration for the webview
|
||||||
|
WebviewGpuIsDisabled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func DefaultMessages() *Messages {
|
func DefaultMessages() *Messages {
|
||||||
|
@ -78,7 +78,8 @@ func main() {
|
|||||||
// OnSuspend is called when Windows enters low power mode
|
// OnSuspend is called when Windows enters low power mode
|
||||||
OnSuspend func()
|
OnSuspend func()
|
||||||
// OnResume is called when Windows resumes from low power mode
|
// OnResume is called when Windows resumes from low power mode
|
||||||
OnResume func()
|
OnResume func(),
|
||||||
|
WebviewGpuDisabled: false,
|
||||||
},
|
},
|
||||||
Mac: &mac.Options{
|
Mac: &mac.Options{
|
||||||
TitleBar: &mac.TitleBar{
|
TitleBar: &mac.TitleBar{
|
||||||
@ -101,6 +102,7 @@ func main() {
|
|||||||
Linux: &linux.Options{
|
Linux: &linux.Options{
|
||||||
Icon: icon,
|
Icon: icon,
|
||||||
WindowIsTranslucent: false,
|
WindowIsTranslucent: false,
|
||||||
|
WebviewGpuPolicy: linux.WebviewGpuPolicyAlways,
|
||||||
},
|
},
|
||||||
Debug: options.Debug{
|
Debug: options.Debug{
|
||||||
OpenInspectorOnStartup: false,
|
OpenInspectorOnStartup: false,
|
||||||
@ -628,6 +630,13 @@ If set, this function will be called when Windows resumes from low power mode (s
|
|||||||
Name: OnResume<br/>
|
Name: OnResume<br/>
|
||||||
Type: `func()`
|
Type: `func()`
|
||||||
|
|
||||||
|
#### WebviewGpuIsDisabled
|
||||||
|
|
||||||
|
Setting this to `true` will disable GPU hardware acceleration for the webview.
|
||||||
|
|
||||||
|
Name: WebviewGpuIsDisabled<br/>
|
||||||
|
Type: `bool`
|
||||||
|
|
||||||
### Mac
|
### Mac
|
||||||
|
|
||||||
This defines [Mac specific options](#mac).
|
This defines [Mac specific options](#mac).
|
||||||
@ -824,6 +833,22 @@ Setting this to `true` will make the window background translucent. Some window
|
|||||||
Name: WindowIsTranslucent<br/>
|
Name: WindowIsTranslucent<br/>
|
||||||
Type: `bool`
|
Type: `bool`
|
||||||
|
|
||||||
|
#### WebviewGpuPolicy
|
||||||
|
|
||||||
|
This option is used for determining the webview's hardware acceleration policy.
|
||||||
|
|
||||||
|
Name: WebviewGpuPolicy<br/>
|
||||||
|
Type: [`options.WebviewGpuPolicy`](#webviewgpupolicy-type)<br/>
|
||||||
|
Default: `WebviewGpuPolicyAlways`
|
||||||
|
|
||||||
|
##### WebviewGpuPolicy type
|
||||||
|
|
||||||
|
| Value | Description |
|
||||||
|
| -------------------------| ----------- |
|
||||||
|
| WebviewGpuPolicyAlways | Hardware acceleration is always enabled|
|
||||||
|
| WebviewGpuPolicyOnDemand | Hardware acceleration is enabled/disabled as request by web contents|
|
||||||
|
| WebviewGpuPolicyNever | Hardware acceleration is always disabled |
|
||||||
|
|
||||||
### Debug
|
### Debug
|
||||||
|
|
||||||
This defines [Debug specific options](#Debug) that apply to debug builds.
|
This defines [Debug specific options](#Debug) that apply to debug builds.
|
||||||
|
@ -14,6 +14,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Added Webview GPU acceleration options for [Windows](/docs/reference/options#webviewgpuisdisabled) and [Linux](/docs/reference/options#webviewgpupolicy). Added by @Lyimmi in [PR](https://github.com/wailsapp/wails/pull/2266)
|
||||||
|
|
||||||
## v2.3.0 - 2022-12-29
|
## v2.3.0 - 2022-12-29
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
Loading…
Reference in New Issue
Block a user