Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update gtk to versoin 0.14 #364

Merged
merged 2 commits into from
Aug 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/gtk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"wry": patch
---

Update gtk to version 0.14. This also remove requirement of `clang`.

12 changes: 6 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@ chrono = "0.4.19"
tempfile = "3.2.0"

[target."cfg(any(target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\"))".dependencies]
webkit2gtk = { version = "0.11", features = [ "v2_18" ] }
webkit2gtk-sys = "0.13.0"
gio = "0.9"
glib = "0.10"
gtk = "0.9"
gdk = "0.13"
webkit2gtk = { version = "0.14", features = [ "v2_18" ] }
webkit2gtk-sys = "0.14"
gio = "0.14"
glib = "0.14"
gtk = "0.14"
gdk = "0.14"

[target."cfg(target_os = \"windows\")".dependencies]
webview2 = "0.1"
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,19 +80,19 @@ Tao uses [gtk-rs](https://gtk-rs.org/) and its related libraries for window crea
#### Arch Linux / Manjaro:

```bash
sudo pacman -S webkit2gtk libappindicator-gtk3 clang
sudo pacman -S webkit2gtk libappindicator-gtk3
```

#### Debian / Ubuntu:

```bash
sudo apt install libwebkit2gtk-4.0-dev libappindicator3-dev clang
sudo apt install libwebkit2gtk-4.0-dev libappindicator3-dev
```

#### Fedora

```bash
sudo dnf install gtk3-devel webkit2gtk3-devel libappindicator-gtk3-devel clang
sudo dnf install gtk3-devel webkit2gtk3-devel libappindicator-gtk3-devel
```

### macOS
Expand Down
2 changes: 1 addition & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
//! - `tray`: Enables system tray and more menu item variants on **Linux**. You can still create
//! those types if you disable it. They just don't create the actual objects. We set this flag
//! because some implementations require more installed packages. Disable this if you don't want
//! to install `libappindicator` and `clang` package.
//! to install `libappindicator` package.
//! - `dox`: Enables this in `package.metadata.docs.rs` section to skip linking some **Linux**
//! libraries and prevent from building documentation on doc.rs fails.
//!
Expand Down
14 changes: 8 additions & 6 deletions src/webview/web_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,8 @@ pub mod unix {
};
use url::Url;
use webkit2gtk::{
ApplicationInfo, AutomationSessionExt, LoadEvent, SecurityManagerExt, URISchemeRequestExt,
UserContentManager, WebContext, WebContextBuilder, WebContextExt as WebkitWebContextExt,
WebView, WebViewExt, WebsiteDataManagerBuilder,
traits::*, ApplicationInfo, LoadEvent, UserContentManager, WebContext, WebContextBuilder,
WebView, WebsiteDataManagerBuilder,
};

#[derive(Debug)]
Expand All @@ -132,6 +131,7 @@ pub mod unix {

impl WebContextImpl {
pub fn new(data: &super::WebContextData) -> Self {
use webkit2gtk::traits::*;
let mut context_builder = WebContextBuilder::new();
if let Some(data_directory) = data.data_directory() {
let data_manager = WebsiteDataManagerBuilder::new()
Expand Down Expand Up @@ -180,7 +180,7 @@ pub mod unix {
// default WindowBuilder to use to create the window it will use, and
// possibly "default" webview attributes. Difficulty comes in for controlling
// the owned Window that would need to be used.
auto.connect_create_web_view(move |_| unimplemented!());
auto.connect_create_web_view(None, move |_| unimplemented!());
});

Self {
Expand All @@ -193,6 +193,7 @@ pub mod unix {
}

pub fn set_allows_automation(&mut self, flag: bool) {
use webkit2gtk::traits::*;
self.automation = flag;
self.context.set_automation_allowed(flag);
}
Expand Down Expand Up @@ -292,14 +293,15 @@ pub mod unix {
where
F: Fn(&str) -> crate::Result<(Vec<u8>, String)> + 'static,
{
use webkit2gtk::traits::*;
let context = &context.os.context;
context
.get_security_manager()
.security_manager()
.ok_or(Error::MissingManager)?
.register_uri_scheme_as_secure(name);

context.register_uri_scheme(name, move |request| {
if let Some(uri) = request.get_uri() {
if let Some(uri) = request.uri() {
let uri = uri.as_str();

match handler(uri) {
Expand Down
8 changes: 4 additions & 4 deletions src/webview/webkitgtk/file_drop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use std::{cell::Cell, path::PathBuf, rc::Rc};

use gtk::WidgetExt;
use gtk::prelude::*;
use webkit2gtk::WebView;

use crate::{application::window::Window, webview::FileDropEvent};
Expand All @@ -21,7 +21,7 @@ pub(crate) fn connect_drag_event(
webview.connect_drag_data_received(move |_, _, _, _, data, info, _| {
if info == 2 {
let uris = data
.get_uris()
.uris()
.iter()
.map(|gstr| {
let path = gstr.as_str();
Expand All @@ -41,9 +41,9 @@ pub(crate) fn connect_drag_event(
webview.connect_drag_drop(move |_, _, _, _, _| {
let uris = listener_ref.1.take();
if let Some(uris) = uris {
gtk::Inhibit(listener_ref.0(&w, FileDropEvent::Dropped(uris)))
listener_ref.0(&w, FileDropEvent::Dropped(uris))
} else {
gtk::Inhibit(false)
false
}
});

Expand Down
32 changes: 16 additions & 16 deletions src/webview/webkitgtk/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ use std::rc::Rc;

use gdk::{WindowEdge, RGBA};
use gio::Cancellable;
use glib::{signal::Inhibit, Cast};
use gtk::{BoxExt, ContainerExt, GtkWindowExt, WidgetExt};
use glib::signal::Inhibit;
use gtk::prelude::*;
use webkit2gtk::{
SettingsExt, UserContentInjectedFrames, UserContentManagerExt, UserScript,
UserScriptInjectionTime, WebView, WebViewBuilder, WebViewExt,
traits::*, UserContentInjectedFrames, UserScript, UserScriptInjectionTime, WebView,
WebViewBuilder,
};
use webkit2gtk_sys::{
webkit_get_major_version, webkit_get_micro_version, webkit_get_minor_version,
Expand Down Expand Up @@ -77,8 +77,8 @@ impl InnerWebView {
};

// Connect before registering as recommended by the docs
manager.connect_script_message_received(move |_m, msg| {
if let (Some(js), Some(context)) = (msg.get_value(), msg.get_global_context()) {
manager.connect_script_message_received(None, move |_m, msg| {
if let (Some(js), Some(context)) = (msg.value(), msg.global_context()) {
if let Some(js) = js.to_string(&context) {
if let Some(rpc_handler) = &rpc_handler {
match super::rpc_proxy(&w, js, rpc_handler) {
Expand Down Expand Up @@ -107,22 +107,22 @@ impl InnerWebView {
});

webview.connect_button_press_event(|webview, event| {
if event.get_button() == 1 {
let (cx, cy) = event.get_root();
if event.button() == 1 {
let (cx, cy) = event.root();
// This one should be GtkBox
if let Some(widget) = webview.get_parent() {
if let Some(widget) = webview.parent() {
// This one should be GtkWindow
if let Some(window) = widget.get_parent() {
if let Some(window) = widget.parent() {
// Safe to unwrap unless this is not from tao
let window: gtk::Window = window.downcast().unwrap();
if !window.get_decorated() && window.get_resizable() {
if !window.is_decorated() && window.is_resizable() {
// Safe to unwrap since it's a valide GtkWindow
let result = hit_test(&window.get_window().unwrap(), cx, cy);
let result = hit_test(&window.window().unwrap(), cx, cy);

// we ignore the `__Unknown` variant so the webview receives the click correctly if it is not on the edges.
match result {
WindowEdge::__Unknown(_) => (),
_ => window.begin_resize_drag(result, 1, cx as i32, cy as i32, event.get_time()),
_ => window.begin_resize_drag(result, 1, cx as i32, cy as i32, event.time()),
}
}
}
Expand All @@ -134,14 +134,14 @@ impl InnerWebView {
// Gtk application window can only contain one widget at a time.
// In tao, we add a GtkBox to pack menu bar. So we check if
// there's a box widget here.
if let Some(widget) = window.get_children().pop() {
if let Some(widget) = window.children().pop() {
let vbox = widget.downcast::<gtk::Box>().unwrap();
vbox.pack_start(&*webview, true, true, 0);
}
webview.grab_focus();

// Enable webgl, webaudio, canvas features and others as default.
if let Some(settings) = WebViewExt::get_settings(&*webview) {
if let Some(settings) = WebViewExt::settings(&*webview) {
settings.set_enable_webgl(true);
settings.set_enable_webaudio(true);
settings.set_enable_accelerated_2d_canvas(true);
Expand Down Expand Up @@ -223,7 +223,7 @@ impl InnerWebView {
}

fn init(&self, js: &str) -> Result<()> {
if let Some(manager) = self.webview.get_user_content_manager() {
if let Some(manager) = self.webview.user_content_manager() {
let script = UserScript::new(
js,
UserContentInjectedFrames::TopFrame,
Expand Down