Skip to content

WRY Webview Rendering library

License Chat Server website https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg support

Wry is a cross-platform WebView rendering library.

The webview requires a running event loop and a window type that implements [HasWindowHandle], or a gtk container widget if you need to support X11 and Wayland. You can use a windowing library like tao or winit.

Examples

This example leverages the [HasWindowHandle] and supports Windows, macOS, iOS, Android and Linux (X11 Only). See the following example using winit:

#[derive(Default)]
struct App {
  window: Option<Window>,
  webview: Option<wry::WebView>,
}

impl ApplicationHandler for App {
  fn resumed(&mut self, event_loop: &ActiveEventLoop) {
    let window = event_loop.create_window(Window::default_attributes()).unwrap();
    let webview = WebViewBuilder::new()
      .with_url("https://tauri.app")
      .build(&window)
      .unwrap();

    self.window = Some(window);
    self.webview = Some(webview);
  }

  fn window_event(&mut self, _event_loop: &ActiveEventLoop, _window_id: WindowId, event: WindowEvent) {}
}

let event_loop = EventLoop::new().unwrap();
let mut app = App::default();
event_loop.run_app(&mut app).unwrap();

If you also want to support Wayland too, then we recommend you use [WebViewBuilderExtUnix::build_gtk] on Linux. See the following example using tao:

let event_loop = EventLoop::new();
let window = WindowBuilder::new().build(&event_loop).unwrap();

let builder = WebViewBuilder::new().with_url("https://tauri.app");

#[cfg(not(target_os = "linux"))]
let webview = builder.build(&window).unwrap();
#[cfg(target_os = "linux")]
let webview = builder.build_gtk(window.gtk_window()).unwrap();

Child webviews

You can use [WebViewBuilder::build_as_child] to create the webview as a child inside another window. This is supported on macOS, Windows and Linux (X11 Only).

#[derive(Default)]
struct App {
  window: Option<Window>,
  webview: Option<wry::WebView>,
}

impl ApplicationHandler for App {
  fn resumed(&mut self, event_loop: &ActiveEventLoop) {
    let window = event_loop.create_window(Window::default_attributes()).unwrap();
    let webview = WebViewBuilder::new()
      .with_url("https://tauri.app")
      .with_bounds(Rect {
        position: LogicalPosition::new(100, 100).into(),
        size: LogicalSize::new(200, 200).into(),
      })
      .build_as_child(&window)
      .unwrap();

    self.window = Some(window);
    self.webview = Some(webview);
  }

  fn window_event(&mut self, _event_loop: &ActiveEventLoop, _window_id: WindowId, event: WindowEvent) {}
}

let event_loop = EventLoop::new().unwrap();
let mut app = App::default();
event_loop.run_app(&mut app).unwrap();

If you want to support X11 and Wayland at the same time, we recommend using [WebViewExtUnix::new_gtk] or [WebViewBuilderExtUnix::build_gtk] with [gtk::Fixed].

let event_loop = EventLoop::new();
let window = WindowBuilder::new().build(&event_loop).unwrap();

let builder = WebViewBuilder::new()
  .with_url("https://tauri.app")
  .with_bounds(Rect {
    position: LogicalPosition::new(100, 100).into(),
    size: LogicalSize::new(200, 200).into(),
  });

#[cfg(not(target_os = "linux"))]
let webview = builder.build_as_child(&window).unwrap();
#[cfg(target_os = "linux")]
let webview = {
  let vbox = window.default_vbox().unwrap(); // tao adds a gtk::Box by default
  let fixed = gtk::Fixed::new();
  fixed.show_all();
  vbox.pack_start(&fixed, true, true, 0);
  builder.build_gtk(&fixed).unwrap()
};

Platform Considerations

Here is the underlying web engine each platform uses, and some dependencies you might need to install.

Linux

WebKitGTK is used to provide webviews on Linux which requires GTK, so if the windowing library doesn't support GTK (as in winit) you'll need to call [gtk::init] before creating the webview and then call [gtk::main_iteration_do] alongside your windowing library event loop.

About

Cross-platform WebView library in Rust for Tauri.

Resources

Code of conduct

Security policy

Stars

4.9k stars

Watchers

37 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages