From 611f41a28cc99f05df9aa6092788880795305e41 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 4 Aug 2025 19:16:56 +1000 Subject: [PATCH] ## Implementation Summary I have successfully implemented the disable pinch zoom functionality for the Wails WebView2 project. Here's what was implemented: ### Changes Made: 1. **Added PinchZoom Capability** (`pkg/edge/capabilities.go:144`) - Added `PinchZoom = Capability("87.0.664.75")` to define the minimum WebView2 runtime version required 2. **Added Pinch Zoom Control Methods** (`pkg/edge/chromium.go:665-695`) - `GetIsPinchZoomEnabled() (bool, error)` - Get current pinch zoom setting - `PutIsPinchZoomEnabled(enabled bool) error` - Set pinch zoom setting 3. **Added Configuration Field** (`pkg/edge/chromium.go:79`) - `PinchZoomEnabled *bool` - Optional field to configure pinch zoom during initialization 4. **Automatic Configuration Application** (`pkg/edge/chromium.go:390-396`) - Added logic to automatically apply the pinch zoom setting when the WebView2 is initialized 5. **Created Usage Example** (`examples/disable_pinch_zoom.go`) - Comprehensive example showing three ways to control pinch zoom ### Usage Options: **Method 1: Configure during initialization (Recommended)** ```go chromium := edge.NewChromium() pinchZoomDisabled := false chromium.PinchZoomEnabled = &pinchZoomDisabled // Setting will be automatically applied when Embed() is called ``` **Method 2: Runtime control** ```go err := chromium.PutIsPinchZoomEnabled(false) ``` **Method 3: Check current setting** ```go enabled, err := chromium.GetIsPinchZoomEnabled() ``` ### Features: - **Capability Check**: Automatically checks if the WebView2 runtime supports pinch zoom control - **Error Handling**: Proper error handling for unsupported versions - **Automatic Application**: Setting is applied automatically during WebView2 initialization - **Runtime Control**: Can be changed dynamically after initialization - **Cross-compilation**: Successfully builds for Windows target This implementation addresses the GitHub issue #2021 by providing a clean, idiomatic Go API to disable pinch zoom functionality in Wails applications using WebView2. --- examples/disable_pinch_zoom.go | 62 ++++++++++++++++++++++++++++++++++ pkg/edge/capabilities.go | 1 + pkg/edge/chromium.go | 41 ++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 examples/disable_pinch_zoom.go diff --git a/examples/disable_pinch_zoom.go b/examples/disable_pinch_zoom.go new file mode 100644 index 0000000..3404603 --- /dev/null +++ b/examples/disable_pinch_zoom.go @@ -0,0 +1,62 @@ +//go:build windows + +package main + +import ( + "fmt" + + "github.com/wailsapp/go-webview2/pkg/edge" +) + +// Example showing how to disable pinch zoom in WebView2 +func main() { + fmt.Println("WebView2 Pinch Zoom Control Example") + fmt.Println("===================================") + + // Create a WebView2 instance + chromium := edge.NewChromium() + + // Method 1: Disable pinch zoom during initialization + // This is the recommended approach as it ensures the setting + // is applied as soon as the WebView2 is ready + pinchZoomEnabled := false + chromium.PinchZoomEnabled = &pinchZoomEnabled + + fmt.Println("✓ Pinch zoom disabled during initialization") + + // Set up other properties if needed + chromium.Debug = true + + // In a real application, you would: + // 1. Create a window (hwnd) + // 2. Call chromium.Embed(hwnd) to initialize WebView2 + // 3. The pinch zoom setting will be automatically applied + + // Method 2: Disable pinch zoom after initialization (runtime control) + // This can be used to enable/disable pinch zoom dynamically + + // Note: This would only work after chromium.Embed() is called + // err := chromium.PutIsPinchZoomEnabled(false) + // if err != nil { + // log.Printf("Error disabling pinch zoom: %v", err) + // } + + // Method 3: Check current pinch zoom setting + // Note: This would only work after chromium.Embed() is called + // enabled, err := chromium.GetIsPinchZoomEnabled() + // if err != nil { + // log.Printf("Error getting pinch zoom status: %v", err) + // } else { + // fmt.Printf("Pinch zoom is currently: %t\n", enabled) + // } + + fmt.Println("\nUsage Examples:") + fmt.Println("1. Set before initialization: chromium.PinchZoomEnabled = &false") + fmt.Println("2. Set after initialization: chromium.PutIsPinchZoomEnabled(false)") + fmt.Println("3. Check current setting: enabled, err := chromium.GetIsPinchZoomEnabled()") + + fmt.Println("\nThis setting prevents users from zooming the webpage using:") + fmt.Println("- Ctrl + mouse wheel") + fmt.Println("- Pinch gestures on touchpads/touchscreens") + fmt.Println("- Keyboard shortcuts like Ctrl+Plus/Ctrl+Minus") +} \ No newline at end of file diff --git a/pkg/edge/capabilities.go b/pkg/edge/capabilities.go index 629a9ce..48ab9ab 100644 --- a/pkg/edge/capabilities.go +++ b/pkg/edge/capabilities.go @@ -141,6 +141,7 @@ const ( NewWindow87 = Capability("87.0.664.75") // New window creation (v87) DocumentTitleChanged87 = Capability("87.0.664.75") // Document title changes (v87) IsSuspended = Capability("87.0.664.75") // Suspension state + PinchZoom = Capability("87.0.664.75") // Pinch zoom control ) // WebView2 Runtime Version 86.0.622.58 (Released: January 2021) diff --git a/pkg/edge/chromium.go b/pkg/edge/chromium.go index 4c75e11..f2ade79 100644 --- a/pkg/edge/chromium.go +++ b/pkg/edge/chromium.go @@ -76,6 +76,7 @@ type Chromium struct { DataPath string BrowserPath string AdditionalBrowserArgs []string + PinchZoomEnabled *bool // permissions permissions map[CoreWebView2PermissionKind]CoreWebView2PermissionState @@ -386,6 +387,14 @@ func (e *Chromium) CreateCoreWebView2ControllerCompleted(res uintptr, controller e.errorCallback(err) } + // Apply pinch zoom setting if configured + if e.PinchZoomEnabled != nil { + err = e.PutIsPinchZoomEnabled(*e.PinchZoomEnabled) + if err != nil { + e.errorCallback(err) + } + } + atomic.StoreUintptr(&e.inited, 1) return 0 @@ -662,6 +671,38 @@ func (e *Chromium) PutIsSwipeNavigationEnabled(enabled bool) error { return nil } +func (e *Chromium) GetIsPinchZoomEnabled() (bool, error) { + if !HasCapability(e.webview2RuntimeVersion, PinchZoom) { + return false, UnsupportedCapabilityError + } + webview2Settings, err := e.webview.GetSettings() + if err != nil { + return false, err + } + webview2Settings5 := webview2Settings.GetICoreWebView2Settings5() + result, err := webview2Settings5.GetIsPinchZoomEnabled() + if err != nil { + return false, err + } + return result, nil +} + +func (e *Chromium) PutIsPinchZoomEnabled(enabled bool) error { + if !HasCapability(e.webview2RuntimeVersion, PinchZoom) { + return UnsupportedCapabilityError + } + webview2Settings, err := e.webview.GetSettings() + if err != nil { + return err + } + webview2Settings5 := webview2Settings.GetICoreWebView2Settings5() + err = webview2Settings5.PutIsPinchZoomEnabled(enabled) + if err != nil { + return err + } + return nil +} + func (e *Chromium) AllowExternalDrag(allow bool) error { if !HasCapability(e.webview2RuntimeVersion, AllowExternalDrop) { return UnsupportedCapabilityError