Blob Blame History Raw
From cec20bb478bfbfc32622ec81b8e1b4393edb0867 Mon Sep 17 00:00:00 2001
From: Jan Lukas Gernert <jangernert@gmail.com>
Date: Sat, 18 Jul 2020 07:22:30 +0200
Subject: [PATCH] update gtk-rs

(cherry picked from commit 3d3d24f6e57097cb99073c084178c35fc268f8f4)
---
 Cargo.toml                         |  18 +--
 src/add_dialog.rs                  | 223 ++++++++++++-----------------
 src/app.rs                         |  40 +++---
 src/article_view/mod.rs            |   6 +-
 src/content_page/content_header.rs |   4 +-
 src/login_screen/password_login.rs |  21 ++-
 src/main_window.rs                 |   7 +-
 src/settings/dialog.rs             | 100 ++++++-------
 src/settings/keybinding_editor.rs  |  10 +-
 src/settings/keybindings.rs        | 105 +++++++-------
 src/settings/theme_chooser.rs      |  41 +++---
 src/util/builder_helper.rs         |   2 +-
 src/util/gtk_util.rs               |   6 +-
 13 files changed, 270 insertions(+), 313 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 100a84ae0df4..6b7bb31bc7e3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,15 +12,15 @@ rust-embed = { version = "5.5", features = ["debug-embed"] }
 failure = "0.1"
 serde = { version = "1.0", features = ["serde_derive"] }
 serde_json = "1.0"
-cairo-rs = { version = "0.8", features = ["v1_16"] }
-pango = "0.8"
-glib = { version = "0.9" }
-gdk-pixbuf = { version = "0.8", features = ["v2_36"] }
-gtk = { version = "0.8", features = ["v3_24"] }
-gio = { version = "0.8", features = ["v2_58"] }
-gdk = { version = "0.12", features = ["v3_24"] }
-libhandy = { version = "0.5", features = ["v0_0_10"] }
-webkit2gtk = { version = "0.9", features = ["v2_16"] }
+cairo-rs = { version = "0.9", features = ["v1_16"] }
+pango = "0.9"
+glib = { version = "0.10" }
+gdk-pixbuf = { version = "0.9", features = ["v2_36"] }
+gtk = { version = "0.9", features = ["v3_24"] }
+gio = { version = "0.9", features = ["v2_58"] }
+gdk = { version = "0.13", features = ["v3_24"] }
+libhandy = { version = "0.6", features = ["v0_0_10"] }
+webkit2gtk = { version = "0.10", features = ["v2_16"] }
 gettext-rs = { version = "0.4", features = ["gettext-system"] }
 log4rs = "0.12"
 dirs = "2.0"
diff --git a/src/add_dialog.rs b/src/add_dialog.rs
index 73f9d4dbe906..6c87e5f7ecfb 100644
--- a/src/add_dialog.rs
+++ b/src/add_dialog.rs
@@ -130,14 +130,10 @@ impl AddPopover {
 
         // make parse button sensitive if entry contains text and vice versa
         url_entry.connect_changed(clone!(@weak parse_button => @default-panic, move |entry| {
-            if let Some(text) = entry.get_text() {
-                if text.as_str().is_empty() {
-                    parse_button.set_sensitive(false);
-                } else {
-                    parse_button.set_sensitive(true);
-                }
-            } else {
+            if entry.get_text().as_str().is_empty() {
                 parse_button.set_sensitive(false);
+            } else {
+                parse_button.set_sensitive(true);
             }
 
             entry.set_property_secondary_icon_name(None);
@@ -153,14 +149,10 @@ impl AddPopover {
 
         // make parse button sensitive if entry contains text and vice versa
         category_entry.connect_changed(clone!(@weak category_add_button => @default-panic, move |entry| {
-            if let Some(text) = entry.get_text() {
-                if text.as_str().is_empty() {
-                    category_add_button.set_sensitive(false);
-                } else {
-                    category_add_button.set_sensitive(true);
-                }
-            } else {
+            if entry.get_text().as_str().is_empty() {
                 category_add_button.set_sensitive(false);
+            } else {
+                category_add_button.set_sensitive(true);
             }
 
             entry.set_property_secondary_icon_name(None);
@@ -176,14 +168,10 @@ impl AddPopover {
 
         // make parse button sensitive if entry contains text and vice versa
         tag_entry.connect_changed(clone!(@weak tag_add_button => @default-panic, move |entry| {
-            if let Some(text) = entry.get_text() {
-                if text.as_str().is_empty() {
-                    tag_add_button.set_sensitive(false);
-                } else {
-                    tag_add_button.set_sensitive(true);
-                }
-            } else {
+            if entry.get_text().as_str().is_empty() {
                 tag_add_button.set_sensitive(false);
+            } else {
+                tag_add_button.set_sensitive(true);
             }
 
             entry.set_property_secondary_icon_name(None);
@@ -216,39 +204,33 @@ impl AddPopover {
             @strong feed_url,
             @strong settings => @default-panic, move |button|
         {
-            if let Some(url_text) = url_entry.get_text() {
-                let mut url_text = url_text.as_str().to_owned();
-                if !url_text.starts_with("http://") && !url_text.starts_with("https://") {
-                    url_text.insert_str(0, "https://");
-                }
-                if let Ok(url) = Url::parse(&url_text) {
-                    // set 'next' button insensitive and show spinner
-                    parse_button_stack.set_visible_child_name("spinner");
-                    button.set_sensitive(false);
-
-                    Self::parse_feed_url(
-                        &url,
-                        &settings,
-                        &threadpool,
-                        &main_stack,
-                        &feed_list,
-                        &feed_title_entry,
-                        &select_button,
-                        &select_button_stack,
-                        &favicon_image,
-                        &feed_url,
-                        &parse_button_stack,
-                        button,
-                        &url_entry);
-                } else {
-                    error!("No valid url: '{}'", url_text);
-                    url_entry.set_property_secondary_icon_name(Some(WARN_ICON));
-                    url_entry.set_property_secondary_icon_tooltip_text(Some(&i18n("No valid URL.")));
-                }
+            let mut url_text = url_entry.get_text().as_str().to_owned();
+            if !url_text.starts_with("http://") && !url_text.starts_with("https://") {
+                url_text.insert_str(0, "https://");
+            }
+            if let Ok(url) = Url::parse(&url_text) {
+                // set 'next' button insensitive and show spinner
+                parse_button_stack.set_visible_child_name("spinner");
+                button.set_sensitive(false);
+
+                Self::parse_feed_url(
+                    &url,
+                    &settings,
+                    &threadpool,
+                    &main_stack,
+                    &feed_list,
+                    &feed_title_entry,
+                    &select_button,
+                    &select_button_stack,
+                    &favicon_image,
+                    &feed_url,
+                    &parse_button_stack,
+                    button,
+                    &url_entry);
             } else {
-                error!("Empty url");
+                error!("No valid url: '{}'", url_text);
                 url_entry.set_property_secondary_icon_name(Some(WARN_ICON));
-                url_entry.set_property_secondary_icon_tooltip_text(Some(&i18n("Empty URL")));
+                url_entry.set_property_secondary_icon_tooltip_text(Some(&i18n("No valid URL.")));
             }
         }));
 
@@ -262,8 +244,6 @@ impl AddPopover {
             let sensitive = Self::calc_add_button_sensitive(&feed_title_entry, &entry);
             feed_add_button.set_sensitive(sensitive);
 
-            let entry_text = entry.get_text().map(|t| t.as_str().to_owned());
-
             let folder_icon = if category_combo.get_active_id().is_some() {
                 if let Some(id) = category_combo.get_active_id() {
                     let category_id = CategoryID::new(id.as_str());
@@ -272,13 +252,10 @@ impl AddPopover {
                         .replace(AddCategory::Existing(category_id));
                 }
                 None
-            } else if entry_text.is_none() {
-                feed_category.write().take();
-                None
-            } else if categories.iter().any(|c| Some(c.label.clone()) == entry_text) {
+            } else if categories.iter().any(|c| c.label == entry.get_text().as_str()) {
                 let category_id = categories
                     .iter()
-                    .find(|c| Some(c.label.clone()) == entry_text)
+                    .find(|c| c.label == entry.get_text().as_str())
                     .map(|c| c.category_id.clone());
 
                 if let Some(category_id) = category_id {
@@ -288,9 +265,7 @@ impl AddPopover {
                 }
                 None
             } else {
-                feed_category.write().replace(AddCategory::New(
-                    entry_text.expect("entry_text already checked for None"),
-                ));
+                feed_category.write().replace(AddCategory::New(entry.get_text().as_str().into()));
                 Some(NEW_CATEGORY_ICON)
             };
 
@@ -333,7 +308,7 @@ impl AddPopover {
                     return;
                 }
             };
-            let feed_title = feed_title_entry.get_text().map(|title| title.as_str().to_owned());
+            let feed_title = if feed_title_entry.get_text().as_str().is_empty() { None } else { Some(feed_title_entry.get_text().as_str().into()) };
             let feed_category = feed_category.read().clone();
 
             Util::send(&sender, Action::AddFeed((feed_url, feed_title, feed_category)));
@@ -344,9 +319,8 @@ impl AddPopover {
             @weak category_entry,
             @strong sender => @default-panic, move |_button|
         {
-            let category_title = category_entry.get_text().map(|text| text.as_str().to_owned());
-            if let Some(category_title) = category_title {
-                Util::send(&sender, Action::AddCategory(category_title));
+            if !category_entry.get_text().as_str().is_empty() {
+                Util::send(&sender, Action::AddCategory(category_entry.get_text().as_str().into()));
                 popover.popdown()
             }
         }));
@@ -356,12 +330,11 @@ impl AddPopover {
             @weak color_button,
             @strong sender => @default-panic, move |_button|
         {
-            let tag_title = tag_entry.get_text().map(|text| text.as_str().to_owned());
             let rgba = color_button.get_rgba();
             let rgba = ColorRGBA::from_normalized(rgba.red, rgba.green, rgba.blue, rgba.alpha);
             let color = rgba.to_string_no_alpha();
-            if let Some(tag_title) = tag_title {
-                Util::send(&sender, Action::AddTag(color, tag_title));
+            if !tag_entry.get_text().as_str().is_empty() {
+                Util::send(&sender, Action::AddTag(color, tag_entry.get_text().as_str().into()));
                 popover.popdown()
             }
         }));
@@ -496,61 +469,59 @@ impl AddPopover {
             @weak select_button_stack => @default-panic, move |button|
         {
             if let Some(row) = list.get_selected_row() {
-                if let Some(name) = row.get_widget_name() {
-                    select_button_stack.set_visible_child_name("spinner");
-                    button.set_sensitive(false);
-
-                    let url = Url::parse(name.as_str()).expect("should never fail since it comes from 'url.as_str()'");
-                    let feed_id = FeedID::new(url.get().as_str());
-
-                    let (sender, receiver) = oneshot::channel::<Option<ParsedUrl>>();
-
-                    let settings_clone = settings.clone();
-                    let thread_future = async move {
-                        let result = Runtime::new()
-                            .expect(RUNTIME_ERROR)
-                            .block_on(news_flash::feed_parser::download_and_parse_feed(
-                                &url, &feed_id, None, None, &App::build_client(&settings_clone),
-                            ))
-                            .ok();
-                        sender.send(result).expect(CHANNEL_ERROR);
-                    };
+                select_button_stack.set_visible_child_name("spinner");
+                button.set_sensitive(false);
+
+                let url = Url::parse(row.get_widget_name().as_str()).expect("should never fail since it comes from 'url.as_str()'");
+                let feed_id = FeedID::new(url.get().as_str());
 
-                    let glib_future = receiver.map(clone!(
-                        @strong threadpool,
-                        @weak button as select_button,
-                        @weak select_button_stack,
-                        @strong feed_url,
-                        @strong settings,
-                        @weak favicon,
-                        @weak title_entry,
-                        @weak stack as main_stack => @default-panic, move |res|
-                    {
-                        if let Some(ParsedUrl::SingleFeed(feed)) = res.expect(CHANNEL_ERROR) {
-                            Self::fill_feed_page(
-                                feed,
-                                &title_entry,
-                                &favicon,
-                                &feed_url,
-                                threadpool,
-                                &settings,
-                            );
-                            main_stack.set_visible_child_name("feed_page");
-                        } else if let Some(child) = row.get_child() {
-                            if let Ok(_box) = child.downcast::<Box>() {
-                                if let Some(icon) = _box.get_children().get(1) {
-                                    icon.set_visible(true);
-                                }
+                let (sender, receiver) = oneshot::channel::<Option<ParsedUrl>>();
+
+                let settings_clone = settings.clone();
+                let thread_future = async move {
+                    let result = Runtime::new()
+                        .expect(RUNTIME_ERROR)
+                        .block_on(news_flash::feed_parser::download_and_parse_feed(
+                            &url, &feed_id, None, None, &App::build_client(&settings_clone),
+                        ))
+                        .ok();
+                    sender.send(result).expect(CHANNEL_ERROR);
+                };
+
+                let glib_future = receiver.map(clone!(
+                    @strong threadpool,
+                    @weak button as select_button,
+                    @weak select_button_stack,
+                    @strong feed_url,
+                    @strong settings,
+                    @weak favicon,
+                    @weak title_entry,
+                    @weak stack as main_stack => @default-panic, move |res|
+                {
+                    if let Some(ParsedUrl::SingleFeed(feed)) = res.expect(CHANNEL_ERROR) {
+                        Self::fill_feed_page(
+                            feed,
+                            &title_entry,
+                            &favicon,
+                            &feed_url,
+                            threadpool,
+                            &settings,
+                        );
+                        main_stack.set_visible_child_name("feed_page");
+                    } else if let Some(child) = row.get_child() {
+                        if let Ok(_box) = child.downcast::<Box>() {
+                            if let Some(icon) = _box.get_children().get(1) {
+                                icon.set_visible(true);
                             }
                         }
+                    }
 
-                        select_button_stack.set_visible_child_name("text");
-                        select_button.set_sensitive(true);
-                    }));
+                    select_button_stack.set_visible_child_name("text");
+                    select_button.set_sensitive(true);
+                }));
 
-                    threadpool.spawn_ok(thread_future);
-                    Util::glib_spawn_future(glib_future);
-                }
+                threadpool.spawn_ok(thread_future);
+                Util::glib_spawn_future(glib_future);
             }
         }));
         for (title, url) in feed_vec {
@@ -559,7 +530,7 @@ impl AddPopover {
             label.set_ellipsize(EllipsizeMode::End);
             label.set_xalign(0.0);
 
-            let warn_icon = Image::new_from_icon_name(Some(WARN_ICON), IconSize::Button);
+            let warn_icon = Image::from_icon_name(Some(WARN_ICON), IconSize::Button);
             warn_icon.set_tooltip_text(Some(&i18n("Failed to get Feed.")));
             warn_icon.set_no_show_all(true);
 
@@ -597,16 +568,12 @@ impl AddPopover {
     }
 
     fn calc_add_button_sensitive(title_entry: &Entry, feed_category_entry: &Entry) -> bool {
-        if let Some(text) = title_entry.get_text() {
-            if text.as_str().is_empty() {
-                return false;
-            }
+        if title_entry.get_text().as_str().is_empty() {
+            return false;
         }
 
-        if let Some(text) = feed_category_entry.get_text() {
-            if text.as_str().is_empty() {
-                return false;
-            }
+        if feed_category_entry.get_text().as_str().is_empty() {
+            return false;
         }
 
         true
diff --git a/src/app.rs b/src/app.rs
index c57bf2fbf82b..cdc130270e9d 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -994,17 +994,15 @@ impl App {
                 @weak dialog.dialog as rename_dialog,
                 @strong self.sender as sender => @default-panic, move |_button|
             {
-                let new_label = match rename_entry.get_text().map(|label| label.to_owned()) {
-                    Some(label) => label,
-                    None => {
-                        Util::send(
-                            &sender,
-                            Action::ErrorSimpleMessage("No valid title to rename feed.".to_owned()),
-                        );
-                        rename_dialog.emit_close();
-                        return;
-                    }
-                };
+                let new_label = rename_entry.get_text().to_owned();
+                if new_label.is_empty() {
+                    Util::send(
+                        &sender,
+                        Action::ErrorSimpleMessage("No valid title to rename feed.".to_owned()),
+                    );
+                    rename_dialog.emit_close();
+                    return;
+                }
 
                 let feed = feed.clone();
                 Util::send(&sender, Action::RenameFeed((feed, new_label)));
@@ -1065,17 +1063,15 @@ impl App {
                 @weak dialog.rename_entry as rename_entry,
                 @strong self.sender as sender => @default-panic, move |_button|
             {
-                let new_label = match rename_entry.get_text().map(|label| label.to_owned()) {
-                    Some(label) => label,
-                    None => {
-                        Util::send(
-                            &sender,
-                            Action::ErrorSimpleMessage("No valid title to rename feed.".to_owned()),
-                        );
-                        rename_dialog.emit_close();
-                        return;
-                    }
-                };
+                let new_label = rename_entry.get_text().to_owned();
+                if new_label.is_empty() {
+                    Util::send(
+                        &sender,
+                        Action::ErrorSimpleMessage("No valid title to rename category.".to_owned()),
+                    );
+                    rename_dialog.emit_close();
+                    return;
+                }
 
                 let category = category.clone();
                 Util::send(&sender, Action::RenameCategory((category, new_label)));
diff --git a/src/article_view/mod.rs b/src/article_view/mod.rs
index ae40cc8b398f..227521935b5a 100644
--- a/src/article_view/mod.rs
+++ b/src/article_view/mod.rs
@@ -14,8 +14,8 @@ use crate::settings::Settings;
 use crate::util::{BuilderHelper, DateUtil, FileUtil, GtkUtil, Util, GTK_RESOURCE_FILE_ERROR};
 use crate::Resources;
 use gdk::{
-    enums::key::KP_Add as KP_ADD, enums::key::KP_Subtract as KP_SUBTRACT, enums::key::KP_0, Cursor, CursorType,
-    Display, EventMask, ModifierType, ScrollDirection,
+    keys::constants::KP_Add as KP_ADD, keys::constants::KP_Subtract as KP_SUBTRACT, keys::constants::KP_0, Cursor,
+    CursorType, Display, EventMask, ModifierType, ScrollDirection,
 };
 use gio::{Cancellable, Settings as GSettings, SettingsExt as GSettingsExt};
 use glib::{clone, object::Cast, source::Continue, translate::ToGlib, MainLoop, Sender};
@@ -356,7 +356,7 @@ impl ArticleView {
         settings.set_media_playback_requires_user_gesture(true);
         settings.set_user_agent_with_application_details(Some("NewsFlash"), None);
 
-        let webview = WebView::new_with_context(ctx);
+        let webview = WebView::with_context(ctx);
         webview.set_settings(&settings);
         webview.set_events(EventMask::POINTER_MOTION_MASK);
         webview.set_events(EventMask::SCROLL_MASK);
diff --git a/src/content_page/content_header.rs b/src/content_page/content_header.rs
index e3bd5e371a7c..ad273ab55684 100644
--- a/src/content_page/content_header.rs
+++ b/src/content_page/content_header.rs
@@ -326,9 +326,7 @@ impl ContentHeader {
 
     fn setup_search_entry(search_entry: &SearchEntry, sender: &Sender<Action>) {
         search_entry.connect_search_changed(clone!(@strong sender => @default-panic, move |search_entry| {
-            if let Some(text) = search_entry.get_text() {
-                Util::send(&sender, Action::SearchTerm(text.as_str().to_owned()));
-            }
+            Util::send(&sender, Action::SearchTerm(search_entry.get_text().as_str().into()));
         }));
     }
 
diff --git a/src/login_screen/password_login.rs b/src/login_screen/password_login.rs
index be1e1fd1cf1f..ec00dfd0289e 100644
--- a/src/login_screen/password_login.rs
+++ b/src/login_screen/password_login.rs
@@ -186,35 +186,32 @@ impl PasswordLogin {
                         @strong self.sender as sender => @default-panic, move |_button|
                     {
                         let url: Option<String> = if pw_gui_desc.url {
-                            match url_entry.get_text() {
-                                Some(url) => Some(url.as_str().to_owned()),
-                                None => None,
-                            }
+                            Some(url_entry.get_text().as_str().to_owned())
                         } else {
                             None
                         };
                         let user = user_entry
                             .get_text()
-                            .expect("Login button should be insensitive if user entry is empty.")
                             .as_str()
                             .to_owned();
                         let password = pass_entry
                             .get_text()
-                            .expect("Login button should be insensitive if password entry is empty.")
                             .as_str()
                             .to_owned();
                         let http_user: Option<String> = if http_revealer.get_child_revealed() {
-                            match http_user_entry.get_text() {
-                                Some(user) => Some(user.as_str().to_owned()),
-                                None => None,
+                            if http_user_entry.get_text().is_empty() {
+                                None
+                            } else {
+                                Some(http_user_entry.get_text().as_str().to_owned())
                             }
                         } else {
                             None
                         };
                         let http_password: Option<String> = if http_revealer.get_child_revealed() {
-                            match http_pass_entry.get_text() {
-                                Some(pass) => Some(pass.as_str().to_owned()),
-                                None => None,
+                            if http_pass_entry.get_text().is_empty() {
+                                None
+                            } else {
+                                Some(http_pass_entry.get_text().as_str().to_owned())
                             }
                         } else {
                             None
diff --git a/src/main_window.rs b/src/main_window.rs
index cb2958748491..6690be3b8346 100644
--- a/src/main_window.rs
+++ b/src/main_window.rs
@@ -20,8 +20,9 @@ use futures::FutureExt;
 use gdk::EventKey;
 use glib::{self, clone, Sender};
 use gtk::{
-    self, ApplicationWindow, CssProvider, CssProviderExt, GtkWindowExt, Inhibit, Settings as GtkSettings, SettingsExt,
-    Stack, StackExt, StackTransitionType, StyleContext, StyleContextExt, WidgetExt,
+    self, prelude::WidgetExtManual, ApplicationWindow, CssProvider, CssProviderExt, GtkWindowExt, Inhibit,
+    Settings as GtkSettings, SettingsExt, Stack, StackExt, StackTransitionType, StyleContext, StyleContextExt,
+    WidgetExt,
 };
 use log::{error, warn};
 use news_flash::models::{
@@ -326,7 +327,7 @@ impl MainWindow {
             if let Some(keybinding) = keybinding {
                 let (keyval, modifier) = gtk::accelerator_parse(&keybinding);
 
-                if gdk::keyval_to_lower(keyval) == gdk::keyval_to_lower(event.get_keyval()) {
+                if gdk::keyval_to_lower(keyval) == gdk::keyval_to_lower(*event.get_keyval()) {
                     if modifier.is_empty() {
                         if Keybindings::clean_modifier(event.get_state()).is_empty() {
                             return true;
diff --git a/src/settings/dialog.rs b/src/settings/dialog.rs
index e7e731916bec..947ee5f7da09 100644
--- a/src/settings/dialog.rs
+++ b/src/settings/dialog.rs
@@ -207,10 +207,8 @@ impl SettingsDialog {
             if let Ok(listbox) = listbox.downcast::<ListBox>() {
                 listbox.connect_row_activated(
                     clone!(@weak self.sync_pop as sync_pop => @default-panic, move |_list, row| {
-                        if let Some(name) = row.get_widget_name() {
-                            if name == "sync_row" {
-                                sync_pop.popup();
-                            }
+                        if row.get_widget_name() == "sync_row" {
+                            sync_pop.popup();
                         }
                     }),
                 );
@@ -259,10 +257,8 @@ impl SettingsDialog {
             if let Ok(listbox) = listbox.downcast::<ListBox>() {
                 listbox.connect_row_activated(
                     clone!(@weak self.article_order_pop as article_order_pop => @default-panic, move |_list, row| {
-                        if let Some(name) = row.get_widget_name() {
-                            if name == "article_order_row" {
-                                article_order_pop.popup();
-                            }
+                        if row.get_widget_name() == "article_order_row" {
+                            article_order_pop.popup();
                         }
                     }),
                 );
@@ -306,18 +302,16 @@ impl SettingsDialog {
                     @weak self.settings as settings,
                     @strong sender => @default-panic, move |_list, row|
                 {
-                    if let Some(name) = row.get_widget_name() {
-                        if name == "article_theme_row" {
-                            let theme_chooser = ThemeChooser::new(&article_theme_event, &sender, &settings);
-                            theme_chooser.widget().connect_closed(clone!(
-                                @strong sender,
-                                @weak settings => @default-panic, move |_pop|
-                            {
-                                article_theme_label.set_label(settings.read().get_article_view_theme().name());
-                                Util::send(&sender, Action::RedrawArticle);
-                            }));
-                            theme_chooser.widget().popup();
-                        }
+                    if row.get_widget_name() == "article_theme_row" {
+                        let theme_chooser = ThemeChooser::new(&article_theme_event, &sender, &settings);
+                        theme_chooser.widget().connect_closed(clone!(
+                            @strong sender,
+                            @weak settings => @default-panic, move |_pop|
+                        {
+                            article_theme_label.set_label(settings.read().get_article_view_theme().name());
+                            Util::send(&sender, Action::RedrawArticle);
+                        }));
+                        theme_chooser.widget().popup();
                     }
                 }));
             }
@@ -464,43 +458,41 @@ impl SettingsDialog {
                     @strong sender,
                     @strong id => @default-panic, move |_list, row|
                 {
-                    if let Some(name) = row.get_widget_name() {
-                        if name.as_str() == row_name {
-                            let editor = KeybindingEditor::new(&dialog, &info_text);
-                            editor.widget().present();
-                            editor.widget().connect_close(clone!(
-                                @weak label,
-                                @weak settings,
-                                @strong sender,
-                                @strong id => @default-panic, move |_dialog|
-                            {
-                                let _settings = settings.clone();
-                                match &*editor.keybinding.read() {
-                                    KeybindState::Canceled | KeybindState::Illegal => {}
-                                    KeybindState::Disabled => {
-                                        if Keybindings::write_keybinding(&id, None, &settings).is_ok() {
-                                            Self::keybind_label_text(None, &label);
-                                        } else {
-                                            Util::send(
-                                                &sender,
-                                                Action::ErrorSimpleMessage("Failed to write keybinding.".to_owned()),
-                                            );
-                                        }
+                    if row.get_widget_name().as_str() == row_name {
+                        let editor = KeybindingEditor::new(&dialog, &info_text);
+                        editor.widget().present();
+                        editor.widget().connect_close(clone!(
+                            @weak label,
+                            @weak settings,
+                            @strong sender,
+                            @strong id => @default-panic, move |_dialog|
+                        {
+                            let _settings = settings.clone();
+                            match &*editor.keybinding.read() {
+                                KeybindState::Canceled | KeybindState::Illegal => {}
+                                KeybindState::Disabled => {
+                                    if Keybindings::write_keybinding(&id, None, &settings).is_ok() {
+                                        Self::keybind_label_text(None, &label);
+                                    } else {
+                                        Util::send(
+                                            &sender,
+                                            Action::ErrorSimpleMessage("Failed to write keybinding.".to_owned()),
+                                        );
                                     }
-                                    KeybindState::Enabled(keybind) => {
-                                        if Keybindings::write_keybinding(&id, Some(keybind.clone()), &settings).is_ok()
-                                        {
-                                            Self::keybind_label_text(Some(keybind.clone()), &label);
-                                        } else {
-                                            Util::send(
-                                                &sender,
-                                                Action::ErrorSimpleMessage("Failed to write keybinding.".to_owned()),
-                                            );
-                                        }
+                                }
+                                KeybindState::Enabled(keybind) => {
+                                    if Keybindings::write_keybinding(&id, Some(keybind.clone()), &settings).is_ok()
+                                    {
+                                        Self::keybind_label_text(Some(keybind.clone()), &label);
+                                    } else {
+                                        Util::send(
+                                            &sender,
+                                            Action::ErrorSimpleMessage("Failed to write keybinding.".to_owned()),
+                                        );
                                     }
                                 }
-                            }));
-                        }
+                            }
+                        }));
                     }
                 }));
             }
diff --git a/src/settings/keybinding_editor.rs b/src/settings/keybinding_editor.rs
index 530facde1d0c..f8deb9c11654 100644
--- a/src/settings/keybinding_editor.rs
+++ b/src/settings/keybinding_editor.rs
@@ -1,7 +1,7 @@
 use super::keybindings::Keybindings;
 use crate::i18n::i18n;
 use crate::util::BuilderHelper;
-use gdk::enums::key;
+use gdk::keys::constants;
 use glib::{clone, object::IsA};
 use gtk::{
     Align, Button, ButtonExt, Dialog, DialogExt, GtkWindowExt, Inhibit, Label, LabelExt, ShortcutLabel, Stack,
@@ -51,13 +51,13 @@ impl KeybindingEditor {
             let keyval = event.get_keyval();
             let modifier = Keybindings::clean_modifier(event.get_state());
 
-            if keyval == key::Escape {
+            if keyval == constants::Escape {
                 *keybinding_public.write() = KeybindState::Canceled;
                 widget.emit_close();
                 return Inhibit(true);
             }
 
-            if keyval == key::BackSpace {
+            if keyval == constants::BackSpace {
                 shortcut_meta.set_label(&i18n("Disable Keybinding"));
                 set_button.set_visible(true);
                 cancel_button.set_visible(true);
@@ -66,11 +66,11 @@ impl KeybindingEditor {
                 return Inhibit(false);
             }
 
-            let internal_shortcut = gtk::accelerator_name(keyval, modifier)
+            let internal_shortcut = gtk::accelerator_name(*keyval, modifier)
                 .expect("Shortcut not convertable. This should never happen!")
                 .to_string();
 
-            if Keybindings::parse_keyval(keyval).is_some() {
+            if Keybindings::parse_keyval(*keyval).is_some() {
                 set_button.set_visible(true);
                 cancel_button.set_visible(true);
                 shortcut_label.set_accelerator(&internal_shortcut);
diff --git a/src/settings/keybindings.rs b/src/settings/keybindings.rs
index d6bb59962280..a04c7c250a7d 100644
--- a/src/settings/keybindings.rs
+++ b/src/settings/keybindings.rs
@@ -2,8 +2,9 @@ use super::error::{SettingsError, SettingsErrorKind};
 use crate::settings::Settings;
 use crate::util::{BuilderHelper, GTK_RESOURCE_FILE_ERROR};
 use crate::Resources;
-use gdk::{enums::key, ModifierType};
+use gdk::{keys::constants, keys::Key, ModifierType};
 use glib::object::{Cast, IsA};
+use glib::translate::FromGlib;
 use gtk::{BinExt, Box, ContainerExt, GtkWindowExt, ShortcutsWindow, Stack, StackExt, WidgetExt, Window};
 use log::warn;
 use parking_lot::RwLock;
@@ -54,42 +55,42 @@ impl Keybindings {
 
     pub fn parse_keyval(keyval: u32) -> Option<String> {
         let keyval = gdk::keyval_to_upper(keyval);
-
+        let keyval = Key::from_glib(keyval);
         let manual_parsed = match keyval {
-            key::Shift_L
-            | key::Control_L
-            | key::Alt_L
-            | key::Meta_L
-            | key::Super_L
-            | key::Hyper_L
-            | key::Shift_R
-            | key::Control_R
-            | key::Alt_R
-            | key::Meta_R
-            | key::Super_R
-            | key::Hyper_R => Self::get_modifier_label(keyval),
-            key::Left => Some("←".to_owned()),
-            key::Right => Some("→".to_owned()),
-            key::Down => Some("↓".to_owned()),
-            key::Up => Some("↑".to_owned()),
-            key::space => Some("␣".to_owned()),
-            key::Return => Some("⏎".to_owned()),
-            key::Delete => Some("Del".to_owned()),
-            key::Page_Up => Some("⇑".to_owned()),
-            key::Page_Down => Some("⇓".to_owned()),
-            key::BackSpace => Some("Backspace".to_owned()),
-            key::F1 => Some("F1".to_owned()),
-            key::F2 => Some("F2".to_owned()),
-            key::F3 => Some("F3".to_owned()),
-            key::F4 => Some("F4".to_owned()),
-            key::F5 => Some("F5".to_owned()),
-            key::F6 => Some("F6".to_owned()),
-            key::F7 => Some("F7".to_owned()),
-            key::F8 => Some("F8".to_owned()),
-            key::F9 => Some("F9".to_owned()),
-            key::F10 => Some("F10".to_owned()),
-            key::F11 => Some("F11".to_owned()),
-            key::F12 => Some("F12".to_owned()),
+            constants::Shift_L
+            | constants::Control_L
+            | constants::Alt_L
+            | constants::Meta_L
+            | constants::Super_L
+            | constants::Hyper_L
+            | constants::Shift_R
+            | constants::Control_R
+            | constants::Alt_R
+            | constants::Meta_R
+            | constants::Super_R
+            | constants::Hyper_R => Self::get_modifier_label(&keyval),
+            constants::Left => Some("←".to_owned()),
+            constants::Right => Some("→".to_owned()),
+            constants::Down => Some("↓".to_owned()),
+            constants::Up => Some("↑".to_owned()),
+            constants::space => Some("␣".to_owned()),
+            constants::Return => Some("⏎".to_owned()),
+            constants::Delete => Some("Del".to_owned()),
+            constants::Page_Up => Some("⇑".to_owned()),
+            constants::Page_Down => Some("⇓".to_owned()),
+            constants::BackSpace => Some("Backspace".to_owned()),
+            constants::F1 => Some("F1".to_owned()),
+            constants::F2 => Some("F2".to_owned()),
+            constants::F3 => Some("F3".to_owned()),
+            constants::F4 => Some("F4".to_owned()),
+            constants::F5 => Some("F5".to_owned()),
+            constants::F6 => Some("F6".to_owned()),
+            constants::F7 => Some("F7".to_owned()),
+            constants::F8 => Some("F8".to_owned()),
+            constants::F9 => Some("F9".to_owned()),
+            constants::F10 => Some("F10".to_owned()),
+            constants::F11 => Some("F11".to_owned()),
+            constants::F12 => Some("F12".to_owned()),
             _ => None,
         };
 
@@ -97,7 +98,7 @@ impl Keybindings {
             return manual_parsed;
         }
 
-        match gdk::keyval_to_unicode(keyval) {
+        match keyval.to_unicode() {
             Some(keyval) => {
                 let mut buffer: [u8; 4] = [0; 4];
                 Some(keyval.encode_utf8(&mut buffer).to_owned())
@@ -106,24 +107,30 @@ impl Keybindings {
         }
     }
 
-    fn get_modifier_label(keyval: u32) -> Option<String> {
+    fn get_modifier_label(keyval: &Key) -> Option<String> {
         let mut mod_string = String::new();
         match keyval {
-            key::Shift_L | key::Control_L | key::Alt_L | key::Meta_L | key::Super_L | key::Hyper_L => {
-                mod_string.push('L')
-            }
-            key::Shift_R | key::Control_R | key::Alt_R | key::Meta_R | key::Super_R | key::Hyper_R => {
-                mod_string.push('R')
-            }
+            &constants::Shift_L
+            | &constants::Control_L
+            | &constants::Alt_L
+            | &constants::Meta_L
+            | &constants::Super_L
+            | &constants::Hyper_L => mod_string.push('L'),
+            &constants::Shift_R
+            | &constants::Control_R
+            | &constants::Alt_R
+            | &constants::Meta_R
+            | &constants::Super_R
+            | &constants::Hyper_R => mod_string.push('R'),
             _ => return None,
         }
 
         match keyval {
-            key::Shift_L | key::Shift_R => mod_string.push_str("Shift"),
-            key::Control_L | key::Control_R => mod_string.push_str("Ctrl"),
-            key::Meta_L | key::Meta_R => mod_string.push_str("Meta"),
-            key::Super_L | key::Super_R => mod_string.push_str("Super"),
-            key::Hyper_L | key::Hyper_R => mod_string.push_str("Hyper"),
+            &constants::Shift_L | &constants::Shift_R => mod_string.push_str("Shift"),
+            &constants::Control_L | &constants::Control_R => mod_string.push_str("Ctrl"),
+            &constants::Meta_L | &constants::Meta_R => mod_string.push_str("Meta"),
+            &constants::Super_L | &constants::Super_R => mod_string.push_str("Super"),
+            &constants::Hyper_L | &constants::Hyper_R => mod_string.push_str("Hyper"),
             _ => return None,
         }
 
diff --git a/src/settings/theme_chooser.rs b/src/settings/theme_chooser.rs
index a02d2ca8e940..e747e91e3de3 100644
--- a/src/settings/theme_chooser.rs
+++ b/src/settings/theme_chooser.rs
@@ -82,29 +82,28 @@ impl ThemeChooser {
         let theme_list = builder.get::<ListBox>("theme_list");
         theme_list.connect_row_activated(
             clone!(@strong sender, @weak settings, @weak pop => @default-panic, move |_list, row| {
-                if let Some(row_name) = row.get_widget_name() {
-                    let result = if "default" == row_name {
-                        settings.write().set_article_view_theme(ArticleTheme::Default)
-                    } else if "spring" == row_name {
-                        settings.write().set_article_view_theme(ArticleTheme::Spring)
-                    } else if "midnight" == row_name {
-                        settings.write().set_article_view_theme(ArticleTheme::Midnight)
-                    } else if "parchment" == row_name {
-                        settings.write().set_article_view_theme(ArticleTheme::Parchment)
-                    } else if "gruvbox" == row_name {
-                        settings.write().set_article_view_theme(ArticleTheme::Gruvbox)
-                    } else {
-                        Ok(())
-                    };
+                let row_name = row.get_widget_name();
+                let result = if "default" == row_name {
+                    settings.write().set_article_view_theme(ArticleTheme::Default)
+                } else if "spring" == row_name {
+                    settings.write().set_article_view_theme(ArticleTheme::Spring)
+                } else if "midnight" == row_name {
+                    settings.write().set_article_view_theme(ArticleTheme::Midnight)
+                } else if "parchment" == row_name {
+                    settings.write().set_article_view_theme(ArticleTheme::Parchment)
+                } else if "gruvbox" == row_name {
+                    settings.write().set_article_view_theme(ArticleTheme::Gruvbox)
+                } else {
+                    Ok(())
+                };
 
-                    if result.is_err() {
-                        Util::send(
-                            &sender,
-                            Action::ErrorSimpleMessage("Failed to set theme setting.".to_owned()),
-                        );
-                    }
-                    pop.popdown();
+                if result.is_err() {
+                    Util::send(
+                        &sender,
+                        Action::ErrorSimpleMessage("Failed to set theme setting.".to_owned()),
+                    );
                 }
+                pop.popdown();
             }),
         );
 
diff --git a/src/util/builder_helper.rs b/src/util/builder_helper.rs
index c890bf510e93..408581fcd4d2 100644
--- a/src/util/builder_helper.rs
+++ b/src/util/builder_helper.rs
@@ -17,7 +17,7 @@ impl BuilderHelper {
     }
 
     pub fn new_from_xml(ui_xml: &str) -> Self {
-        let builder = Builder::new_from_string(ui_xml);
+        let builder = Builder::from_string(ui_xml);
         BuilderHelper { builder }
     }
 
diff --git a/src/util/gtk_util.rs b/src/util/gtk_util.rs
index d8ec0f0666d8..0ae774930db8 100644
--- a/src/util/gtk_util.rs
+++ b/src/util/gtk_util.rs
@@ -30,7 +30,7 @@ impl GtkUtil {
     pub fn register_symbolic_icons() {
         let data = Resources::get("gresource_bundles/symbolic_icons.gresource").expect(GTK_RESOURCE_FILE_ERROR);
         let bytes = Bytes::from(&data);
-        let icon_resource = Resource::new_from_data(&bytes).expect("Error creating gio resource.");
+        let icon_resource = Resource::from_data(&bytes).expect("Error creating gio resource.");
         gio::resources_register(&icon_resource);
         IconTheme::get_default()
             .unwrap_or_else(|| panic!("Failed to register symbolic icons."))
@@ -74,10 +74,10 @@ impl GtkUtil {
         scale_factor: i32,
     ) -> Result<Pixbuf, UtilError> {
         let bytes = Bytes::from(data);
-        let stream = MemoryInputStream::new_from_bytes(&bytes);
+        let stream = MemoryInputStream::from_bytes(&bytes);
         let cancellable: Option<&Cancellable> = None;
         let pixbuf =
-            Pixbuf::new_from_stream_at_scale(&stream, width * scale_factor, height * scale_factor, true, cancellable)
+            Pixbuf::from_stream_at_scale(&stream, width * scale_factor, height * scale_factor, true, cancellable)
                 .context(UtilErrorKind::CairoSurface)?;
         Ok(pixbuf)
     }
-- 
2.26.2